Move webpack cache to data root

441e5c6f7e45ca1294108785d95e9de63548af39

Cohee <18619528+Cohee1207@users.noreply.github.com>

5 files changed, +72 -13Showing whitespace changes
docker/build-lib.js+1 -1
@@ -1,4 +1,4 @@
1import getWebpackServeMiddleware from '../src/middleware/webpack-serve.js';1import getWebpackServeMiddleware from '../src/middleware/webpack-serve.js';
22
3const middleware = getWebpackServeMiddleware();3const middleware = getWebpackServeMiddleware();
4await middleware.runWebpackCompiler();4await middleware.runWebpackCompiler(true);
package-lock.json+35 -4
@@ -43,6 +43,7 @@
43 "ip-matching": "^2.1.2",43 "ip-matching": "^2.1.2",
44 "ip-regex": "^5.0.0",44 "ip-regex": "^5.0.0",
45 "ipaddr.js": "^2.0.1",45 "ipaddr.js": "^2.0.1",
46 "is-docker": "^3.0.0",
46 "jimp": "^0.22.10",47 "jimp": "^0.22.10",
47 "localforage": "^1.10.0",48 "localforage": "^1.10.0",
48 "lodash": "^4.17.21",49 "lodash": "^4.17.21",
@@ -4649,15 +4650,15 @@
4649 "license": "MIT"4650 "license": "MIT"
4650 },4651 },
4651 "node_modules/is-docker": {4652 "node_modules/is-docker": {
4652 "version": "2.2.1",4653 "version": "3.0.0",
4653 "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",4654 "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
4654 "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",4655 "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
4655 "license": "MIT",4656 "license": "MIT",
4656 "bin": {4657 "bin": {
4657 "is-docker": "cli.js"4658 "is-docker": "cli.js"
4658 },4659 },
4659 "engines": {4660 "engines": {
4660 "node": ">=8"4661 "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
4661 },4662 },
4662 "funding": {4663 "funding": {
4663 "url": "https://github.com/sponsors/sindresorhus"4664 "url": "https://github.com/sponsors/sindresorhus"
@@ -4734,6 +4735,21 @@
4734 "node": ">=8"4735 "node": ">=8"
4735 }4736 }
4736 },4737 },
4738 "node_modules/is-wsl/node_modules/is-docker": {
4739 "version": "2.2.1",
4740 "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
4741 "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
4742 "license": "MIT",
4743 "bin": {
4744 "is-docker": "cli.js"
4745 },
4746 "engines": {
4747 "node": ">=8"
4748 },
4749 "funding": {
4750 "url": "https://github.com/sponsors/sindresorhus"
4751 }
4752 },
4737 "node_modules/isarray": {4753 "node_modules/isarray": {
4738 "version": "1.0.0",4754 "version": "1.0.0",
4739 "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",4755 "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
@@ -5518,6 +5534,21 @@
5518 "url": "https://github.com/sponsors/sindresorhus"5534 "url": "https://github.com/sponsors/sindresorhus"
5519 }5535 }
5520 },5536 },
5537 "node_modules/open/node_modules/is-docker": {
5538 "version": "2.2.1",
5539 "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
5540 "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
5541 "license": "MIT",
5542 "bin": {
5543 "is-docker": "cli.js"
5544 },
5545 "engines": {
5546 "node": ">=8"
5547 },
5548 "funding": {
5549 "url": "https://github.com/sponsors/sindresorhus"
5550 }
5551 },
5521 "node_modules/openai": {5552 "node_modules/openai": {
5522 "version": "4.17.4",5553 "version": "4.17.4",
5523 "resolved": "https://registry.npmjs.org/openai/-/openai-4.17.4.tgz",5554 "resolved": "https://registry.npmjs.org/openai/-/openai-4.17.4.tgz",
package.json+1 -0
@@ -33,6 +33,7 @@
33 "ip-matching": "^2.1.2",33 "ip-matching": "^2.1.2",
34 "ip-regex": "^5.0.0",34 "ip-regex": "^5.0.0",
35 "ipaddr.js": "^2.0.1",35 "ipaddr.js": "^2.0.1",
36 "is-docker": "^3.0.0",
36 "jimp": "^0.22.10",37 "jimp": "^0.22.10",
37 "localforage": "^1.10.0",38 "localforage": "^1.10.0",
38 "lodash": "^4.17.21",39 "lodash": "^4.17.21",
src/middleware/webpack-serve.js+8 -5
@@ -1,11 +1,8 @@
1import path from 'node:path';1import path from 'node:path';
2import webpack from 'webpack';2import webpack from 'webpack';
3import { publicLibConfig } from '../../webpack.config.js';3import getPublicLibConfig from '../../webpack.config.js';
44
5export default function getWebpackServeMiddleware() {5export default function getWebpackServeMiddleware() {
6 const outputPath = publicLibConfig.output?.path;
7 const outputFile = publicLibConfig.output?.filename;
8
9 /**6 /**
10 * A very spartan recreation of webpack-dev-middleware.7 * A very spartan recreation of webpack-dev-middleware.
11 * @param {import('express').Request} req Request object.8 * @param {import('express').Request} req Request object.
@@ -14,6 +11,10 @@ export default function getWebpackServeMiddleware() {
14 * @type {import('express').RequestHandler}11 * @type {import('express').RequestHandler}
15 */12 */
16 function devMiddleware(req, res, next) {13 function devMiddleware(req, res, next) {
14 const publicLibConfig = getPublicLibConfig();
15 const outputPath = publicLibConfig.output?.path;
16 const outputFile = publicLibConfig.output?.filename;
17
17 if (req.method === 'GET' && path.parse(req.path).base === outputFile) {18 if (req.method === 'GET' && path.parse(req.path).base === outputFile) {
18 return res.sendFile(outputFile, { root: outputPath });19 return res.sendFile(outputFile, { root: outputPath });
19 }20 }
@@ -23,9 +24,11 @@ export default function getWebpackServeMiddleware() {
2324
24 /**25 /**
25 * Wait until Webpack is done compiling.26 * Wait until Webpack is done compiling.
27 * @param {boolean} [forceDist=false] Whether to force the use the /dist folder.
26 * @returns {Promise<void>}28 * @returns {Promise<void>}
27 */29 */
28 devMiddleware.runWebpackCompiler = () => {30 devMiddleware.runWebpackCompiler = (forceDist = false) => {
31 const publicLibConfig = getPublicLibConfig(forceDist);
29 const compiler = webpack(publicLibConfig);32 const compiler = webpack(publicLibConfig);
3033
31 return new Promise((resolve) => {34 return new Promise((resolve) => {
webpack.config.js+27 -3
@@ -1,13 +1,36 @@
1import process from 'node:process';1import process from 'node:process';
2import path from 'node:path';2import path from 'node:path';
3import os from 'node:os';
4import isDocker from 'is-docker';
35
4/** @type {import('webpack').Configuration} */6/**
5export const publicLibConfig = {7 * Get the Webpack configuration for the public/lib.js file.
8 * @param {boolean} forceDist Whether to force the use the /dist folder.
9 * @returns {import('webpack').Configuration}
10 * */
11export default function getPublicLibConfig(forceDist = false) {
12 function getCacheDirectory() {
13 // Docker got cache pre-baked into the image.
14 if (forceDist || isDocker()) {
15 return path.resolve(process.cwd(), 'dist/webpack');
16 }
17
18 // Data root is set (should be the case 99.99% of the time).
19 if (typeof globalThis.DATA_ROOT === 'string') {
20 return path.resolve(globalThis.DATA_ROOT, '_cache', 'webpack');
21 }
22
23 // Fallback to the system temp directory.
24 return path.resolve(os.tmpdir(), 'webpack');
25 }
26
27 const cacheDirectory = getCacheDirectory();
28 return {
6 mode: 'production',29 mode: 'production',
7 entry: './public/lib.js',30 entry: './public/lib.js',
8 cache: {31 cache: {
9 type: 'filesystem',32 type: 'filesystem',
10 cacheDirectory: path.resolve(process.cwd(), 'dist/webpack'),33 cacheDirectory: cacheDirectory,
11 store: 'pack',34 store: 'pack',
12 compression: 'gzip',35 compression: 'gzip',
13 },36 },
@@ -33,3 +56,4 @@ export const publicLibConfig = {
33 libraryTarget: 'module',56 libraryTarget: 'module',
34 },57 },
35 };58 };
59}