Ditch webpack-dev-middleware

afccb8517a09c71edc87138b0610a1d2292add02

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

5 files changed, +40 -265Ignore whitespace
package-lock.json+0 -253
@@ -67,7 +67,6 @@
6767 "vectra": "^0.2.2",
6868 "wavefile": "^11.0.0",
6969 "webpack": "^5.95.0",
70- "webpack-dev-middleware": "^7.4.2",
7170 "write-file-atomic": "^5.0.1",
7271 "ws": "^8.17.1",
7372 "yaml": "^2.3.4",
@@ -866,60 +865,6 @@
866865 "@jridgewell/sourcemap-codec": "^1.4.14"
867866 }
868867 },
869- "node_modules/@jsonjoy.com/base64": {
870- "version": "1.1.2",
871- "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz",
872- "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==",
873- "license": "Apache-2.0",
874- "engines": {
875- "node": ">=10.0"
876- },
877- "funding": {
878- "type": "github",
879- "url": "https://github.com/sponsors/streamich"
880- },
881- "peerDependencies": {
882- "tslib": "2"
883- }
884- },
885- "node_modules/@jsonjoy.com/json-pack": {
886- "version": "1.1.0",
887- "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.1.0.tgz",
888- "integrity": "sha512-zlQONA+msXPPwHWZMKFVS78ewFczIll5lXiVPwFPCZUsrOKdxc2AvxU1HoNBmMRhqDZUR9HkC3UOm+6pME6Xsg==",
889- "license": "Apache-2.0",
890- "dependencies": {
891- "@jsonjoy.com/base64": "^1.1.1",
892- "@jsonjoy.com/util": "^1.1.2",
893- "hyperdyperid": "^1.2.0",
894- "thingies": "^1.20.0"
895- },
896- "engines": {
897- "node": ">=10.0"
898- },
899- "funding": {
900- "type": "github",
901- "url": "https://github.com/sponsors/streamich"
902- },
903- "peerDependencies": {
904- "tslib": "2"
905- }
906- },
907- "node_modules/@jsonjoy.com/util": {
908- "version": "1.5.0",
909- "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.5.0.tgz",
910- "integrity": "sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==",
911- "license": "Apache-2.0",
912- "engines": {
913- "node": ">=10.0"
914- },
915- "funding": {
916- "type": "github",
917- "url": "https://github.com/sponsors/streamich"
918- },
919- "peerDependencies": {
920- "tslib": "2"
921- }
922- },
923868 "node_modules/@kwsites/file-exists": {
924869 "version": "1.1.1",
925870 "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz",
@@ -1803,45 +1748,6 @@
18031748 "url": "https://github.com/sponsors/epoberezkin"
18041749 }
18051750 },
1806- "node_modules/ajv-formats": {
1807- "version": "2.1.1",
1808- "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
1809- "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
1810- "license": "MIT",
1811- "dependencies": {
1812- "ajv": "^8.0.0"
1813- },
1814- "peerDependencies": {
1815- "ajv": "^8.0.0"
1816- },
1817- "peerDependenciesMeta": {
1818- "ajv": {
1819- "optional": true
1820- }
1821- }
1822- },
1823- "node_modules/ajv-formats/node_modules/ajv": {
1824- "version": "8.17.1",
1825- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
1826- "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
1827- "license": "MIT",
1828- "dependencies": {
1829- "fast-deep-equal": "^3.1.3",
1830- "fast-uri": "^3.0.1",
1831- "json-schema-traverse": "^1.0.0",
1832- "require-from-string": "^2.0.2"
1833- },
1834- "funding": {
1835- "type": "github",
1836- "url": "https://github.com/sponsors/epoberezkin"
1837- }
1838- },
1839- "node_modules/ajv-formats/node_modules/json-schema-traverse": {
1840- "version": "1.0.0",
1841- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
1842- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
1843- "license": "MIT"
1844- },
18451751 "node_modules/ajv-keywords": {
18461752 "version": "3.5.2",
18471753 "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
@@ -2602,12 +2508,6 @@
26022508 "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
26032509 "license": "MIT"
26042510 },
2605- "node_modules/colorette": {
2606- "version": "2.0.20",
2607- "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
2608- "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
2609- "license": "MIT"
2610- },
26112511 "node_modules/combined-stream": {
26122512 "version": "1.0.8",
26132513 "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
@@ -3785,12 +3685,6 @@
37853685 "dev": true,
37863686 "license": "MIT"
37873687 },
3788- "node_modules/fast-uri": {
3789- "version": "3.0.3",
3790- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz",
3791- "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==",
3792- "license": "BSD-3-Clause"
3793- },
37943688 "node_modules/fastq": {
37953689 "version": "1.15.0",
37963690 "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
@@ -4541,15 +4435,6 @@
45414435 "ms": "^2.0.0"
45424436 }
45434437 },
4544- "node_modules/hyperdyperid": {
4545- "version": "1.2.0",
4546- "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz",
4547- "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==",
4548- "license": "MIT",
4549- "engines": {
4550- "node": ">=10.18"
4551- }
4552- },
45534438 "node_modules/iconv-lite": {
45544439 "version": "0.6.3",
45554440 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
@@ -5176,25 +5061,6 @@
51765061 "node": ">= 0.6"
51775062 }
51785063 },
5179- "node_modules/memfs": {
5180- "version": "4.14.0",
5181- "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.14.0.tgz",
5182- "integrity": "sha512-JUeY0F/fQZgIod31Ja1eJgiSxLn7BfQlCnqhwXFBzFHEw63OdLK7VJUJ7bnzNsWgCyoUP5tEp1VRY8rDaYzqOA==",
5183- "license": "Apache-2.0",
5184- "dependencies": {
5185- "@jsonjoy.com/json-pack": "^1.0.3",
5186- "@jsonjoy.com/util": "^1.3.0",
5187- "tree-dump": "^1.0.1",
5188- "tslib": "^2.0.0"
5189- },
5190- "engines": {
5191- "node": ">= 4.0.0"
5192- },
5193- "funding": {
5194- "type": "github",
5195- "url": "https://github.com/sponsors/streamich"
5196- }
5197- },
51985064 "node_modules/merge-descriptors": {
51995065 "version": "1.0.3",
52005066 "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
@@ -6310,15 +6176,6 @@
63106176 "node": ">=0.10.0"
63116177 }
63126178 },
6313- "node_modules/require-from-string": {
6314- "version": "2.0.2",
6315- "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
6316- "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
6317- "license": "MIT",
6318- "engines": {
6319- "node": ">=0.10.0"
6320- }
6321- },
63226179 "node_modules/resolve-alpn": {
63236180 "version": "1.2.1",
63246181 "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
@@ -6447,59 +6304,6 @@
64476304 "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==",
64486305 "license": "ISC"
64496306 },
6450- "node_modules/schema-utils": {
6451- "version": "4.2.0",
6452- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz",
6453- "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==",
6454- "license": "MIT",
6455- "dependencies": {
6456- "@types/json-schema": "^7.0.9",
6457- "ajv": "^8.9.0",
6458- "ajv-formats": "^2.1.1",
6459- "ajv-keywords": "^5.1.0"
6460- },
6461- "engines": {
6462- "node": ">= 12.13.0"
6463- },
6464- "funding": {
6465- "type": "opencollective",
6466- "url": "https://opencollective.com/webpack"
6467- }
6468- },
6469- "node_modules/schema-utils/node_modules/ajv": {
6470- "version": "8.17.1",
6471- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
6472- "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
6473- "license": "MIT",
6474- "dependencies": {
6475- "fast-deep-equal": "^3.1.3",
6476- "fast-uri": "^3.0.1",
6477- "json-schema-traverse": "^1.0.0",
6478- "require-from-string": "^2.0.2"
6479- },
6480- "funding": {
6481- "type": "github",
6482- "url": "https://github.com/sponsors/epoberezkin"
6483- }
6484- },
6485- "node_modules/schema-utils/node_modules/ajv-keywords": {
6486- "version": "5.1.0",
6487- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
6488- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
6489- "license": "MIT",
6490- "dependencies": {
6491- "fast-deep-equal": "^3.1.3"
6492- },
6493- "peerDependencies": {
6494- "ajv": "^8.8.2"
6495- }
6496- },
6497- "node_modules/schema-utils/node_modules/json-schema-traverse": {
6498- "version": "1.0.0",
6499- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
6500- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
6501- "license": "MIT"
6502- },
65036307 "node_modules/seedrandom": {
65046308 "version": "3.0.5",
65056309 "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz",
@@ -7038,18 +6842,6 @@
70386842 "dev": true,
70396843 "license": "MIT"
70406844 },
7041- "node_modules/thingies": {
7042- "version": "1.21.0",
7043- "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz",
7044- "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==",
7045- "license": "Unlicense",
7046- "engines": {
7047- "node": ">=10.18"
7048- },
7049- "peerDependencies": {
7050- "tslib": "^2"
7051- }
7052- },
70536845 "node_modules/tiktoken": {
70546846 "version": "1.0.16",
70556847 "resolved": "https://registry.npmjs.org/tiktoken/-/tiktoken-1.0.16.tgz",
@@ -7106,22 +6898,6 @@
71066898 "node": ">=18"
71076899 }
71086900 },
7109- "node_modules/tree-dump": {
7110- "version": "1.0.2",
7111- "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz",
7112- "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==",
7113- "license": "Apache-2.0",
7114- "engines": {
7115- "node": ">=10.0"
7116- },
7117- "funding": {
7118- "type": "github",
7119- "url": "https://github.com/sponsors/streamich"
7120- },
7121- "peerDependencies": {
7122- "tslib": "2"
7123- }
7124- },
71256901 "node_modules/truncate-utf8-bytes": {
71266902 "version": "1.0.2",
71276903 "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz",
@@ -7425,35 +7201,6 @@
74257201 }
74267202 }
74277203 },
7428- "node_modules/webpack-dev-middleware": {
7429- "version": "7.4.2",
7430- "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz",
7431- "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==",
7432- "license": "MIT",
7433- "dependencies": {
7434- "colorette": "^2.0.10",
7435- "memfs": "^4.6.0",
7436- "mime-types": "^2.1.31",
7437- "on-finished": "^2.4.1",
7438- "range-parser": "^1.2.1",
7439- "schema-utils": "^4.0.0"
7440- },
7441- "engines": {
7442- "node": ">= 18.12.0"
7443- },
7444- "funding": {
7445- "type": "opencollective",
7446- "url": "https://opencollective.com/webpack"
7447- },
7448- "peerDependencies": {
7449- "webpack": "^5.0.0"
7450- },
7451- "peerDependenciesMeta": {
7452- "webpack": {
7453- "optional": true
7454- }
7455- }
7456- },
74577204 "node_modules/webpack-sources": {
74587205 "version": "3.2.3",
74597206 "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
package.json+0 -1
@@ -57,7 +57,6 @@
5757 "vectra": "^0.2.2",
5858 "wavefile": "^11.0.0",
5959 "webpack": "^5.95.0",
60- "webpack-dev-middleware": "^7.4.2",
6160 "write-file-atomic": "^5.0.1",
6261 "ws": "^8.17.1",
6362 "yaml": "^2.3.4",
server.js+1 -5
@@ -627,10 +627,6 @@ const tavernUrl = new URL(
627627 (':' + server_port),
628628);
629629
630-function prepareFrontendBundle() {
631- return new Promise((resolve) => webpackMiddleware.waitUntilValid(resolve));
632-}
633-
634630/**
635631 * Tasks that need to be run before the server starts listening.
636632 */
@@ -682,7 +678,7 @@ const preSetupTasks = async function () {
682678 initRequestProxy({ enabled: proxyEnabled, url: proxyUrl, bypass: proxyBypass });
683679
684680 // Wait for frontend libs to compile
685681 await prepareFrontendBundlewebpackMiddleware.runWebpackCompiler();
686682};
687683
688684/**
src/middleware/webpack-serve.js+35 -6
@@ -1,10 +1,11 @@
11import process from 'node:process';
22import fspath from 'node:fspath';
33import webpack from 'webpack';
4-import middleware from 'webpack-dev-middleware';
54import { publicLibConfig } from '../../webpack.config.js';
65
76export default function getWebpackServeMiddleware() {
7+ const outputPath = publicLibConfig.output?.path;
8+ const outputFile = publicLibConfig.output?.filename;
89 const compiler = webpack(publicLibConfig);
910
1011 if (process.env.NODE_ENV === 'production' || process.platform === 'android') {
@@ -17,8 +18,36 @@ export default function getWebpackServeMiddleware() {
1718 });
1819 }
1920
20- return middleware(compiler, {
21+ /**
21- // @ts-ignore Use actual file system to ease on heap memory usage
22+ * A very spartan recreation of webpack-dev-middleware.
22- outputFileSystem: fs,
23+ * @param {import('express').Request} req Request object.
23- });
24+ * @param {import('express').Response} res Response object.
25+ * @param {import('express').NextFunction} next Next function.
26+ * @type {import('express').RequestHandler}
27+ */
28+ async function devMiddleware(req, res, next) {
29+ if (req.method === 'GET' && path.parse(req.path).base === outputFile) {
30+ return res.sendFile(outputFile, { root: outputPath });
31+ }
32+
33+ next();
34+ }
35+
36+ /**
37+ * Wait until Webpack is done compiling.
38+ * @returns {Promise<void>}
39+ */
40+ devMiddleware.runWebpackCompiler = () => {
41+ return new Promise((resolve) => {
42+ compiler.run((_error, stats) => {
43+ const output = stats?.toString(publicLibConfig.stats);
44+ if (output) {
45+ console.log(output);
46+ }
47+ resolve();
48+ });
49+ });
50+ };
51+
52+ return devMiddleware;
2453}
webpack.config.js+4 -0
@@ -8,6 +8,8 @@ export const publicLibConfig = {
88 cache: {
99 type: 'filesystem',
1010 cacheDirectory: path.resolve(process.cwd(), 'dist/webpack'),
11+ store: 'pack',
12+ compression: 'gzip',
1113 },
1214 devtool: false,
1315 watch: false,
@@ -16,6 +18,8 @@ export const publicLibConfig = {
1618 preset: 'minimal',
1719 assets: false,
1820 modules: false,
21+ colors: true,
22+ timings: true,
1923 },
2024 experiments: {
2125 outputModule: true,