From 32ac758d0dc3ba9d869a1c017936abf5879a7be7 Mon Sep 17 00:00:00 2001 From: johnnyreilly Date: Sat, 7 Nov 2026 08:07:16 +0000 Subject: [PATCH 01/27] chore: remove unused babel devDependencies Remove `babel`, `babel-polyfill` and `babel-preset-es2016`, plus their knip ignore entries. Nothing at the root uses them: the babel execution tests that reference them are skipped and install their own deps. `babel-preset-react` stays because the babel-es6resolveParent comparison test uses the `react` preset. Co-Authored-By: Claude Opus 5.5 --- knip.json | 3 -- package-lock.json | 89 ----------------------------------------------- package.json | 3 -- 3 files changed, 95 deletions(-) diff --git a/knip.json b/knip.json index 4314a7ef5..c212370ec 100644 --- a/knip.json +++ b/knip.json @@ -7,12 +7,9 @@ "src/**/*.ts" ], "ignoreDependencies": [ - "babel", "babel-core", "babel-loader", - "babel-polyfill", "babel-preset-es2015", - "babel-preset-es2016", "babel-preset-react", "glob", "jasmine-core", diff --git a/package-lock.json b/package-lock.json index d675cd705..8c36ccdda 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,12 +16,9 @@ "devDependencies": { "@types/node": "^26.1.2", "@types/picomatch": "^4.0.0", - "babel": "^6.0.0", "babel-core": "^6.0.0", "babel-loader": "^7.0.0", - "babel-polyfill": "^6.16.0", "babel-preset-es2015": "^6.0.0", - "babel-preset-es2016": "6.24.1", "babel-preset-react": "^6.0.0", "glob": "^7.1.1", "jasmine-core": "^6.0.0", @@ -2117,19 +2114,6 @@ "gulp-header": "^1.7.1" } }, - "node_modules/babel": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel/-/babel-6.23.0.tgz", - "integrity": "sha512-ZDcCaI8Vlct8PJ3DvmyqUz+5X2Ylz3ZuuItBe/74yXosk2dwyVo/aN7MCJ8HJzhnnJ+6yP4o+lDgG9MBe91DLA==", - "deprecated": "In 6.x, the babel package has been deprecated in favor of babel-cli. Check https://opencollective.com/babel to support the Babel maintainers", - "dev": true, - "license": "MIT", - "bin": { - "babel": "lib/cli.js", - "babel-external-helpers": "lib/cli.js", - "babel-node": "lib/cli.js" - } - }, "node_modules/babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -2207,18 +2191,6 @@ "node": ">=0.10.0" } }, - "node_modules/babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha512-gCtfYORSG1fUMX4kKraymq607FWgMWg+j42IFPc18kFQEsmtaibP4UrqsXt8FlEJle25HUd4tsoDR7H2wDhe9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-helper-explode-assignable-expression": "^6.24.1", - "babel-runtime": "^6.22.0", - "babel-types": "^6.24.1" - } - }, "node_modules/babel-helper-builder-react-jsx": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", @@ -2257,18 +2229,6 @@ "lodash": "^4.17.4" } }, - "node_modules/babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha512-qe5csbhbvq6ccry9G7tkXbzNtcDiH4r51rrPUbwwoTzZ18AqxWYRZT6AOmxrpxKnQBW0pYlBI/8vh73Z//78nQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-runtime": "^6.22.0", - "babel-traverse": "^6.24.1", - "babel-types": "^6.24.1" - } - }, "node_modules/babel-helper-function-name": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", @@ -2393,13 +2353,6 @@ "babel-runtime": "^6.22.0" } }, - "node_modules/babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha512-Z/flU+T9ta0aIEKl1tGEmN/pZiI1uXmCiGFRegKacQfEJzp7iNsKloZmyJlQr+75FCJtiFfGIK03SiCvCt9cPQ==", - "dev": true, - "license": "MIT" - }, "node_modules/babel-plugin-syntax-flow": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", @@ -2670,18 +2623,6 @@ "regexpu-core": "^2.0.0" } }, - "node_modules/babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha512-LzXDmbMkklvNhprr20//RStKVcT8Cu+SQtX18eMHLhjHf2yFzwtQ0S2f0jQ+89rokoNdmwoSqYzAhq86FxlLSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", - "babel-plugin-syntax-exponentiation-operator": "^6.8.0", - "babel-runtime": "^6.22.0" - } - }, "node_modules/babel-plugin-transform-flow-strip-types": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", @@ -2758,18 +2699,6 @@ "babel-types": "^6.24.1" } }, - "node_modules/babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-runtime": "^6.26.0", - "core-js": "^2.5.0", - "regenerator-runtime": "^0.10.5" - } - }, "node_modules/babel-preset-es2015": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", @@ -2804,17 +2733,6 @@ "babel-plugin-transform-regenerator": "^6.24.1" } }, - "node_modules/babel-preset-es2016": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2016/-/babel-preset-es2016-6.24.1.tgz", - "integrity": "sha512-h3X19N+xHD3S0LqB1VIWAU3UbsbH7r5T5uHJMlkpWyJZ/gUuKQ1c9SiMYRBLZ9h7whxy5nqglx2U1o/wiz9ScQ==", - "deprecated": "🙌 Thanks for using Babel: we recommend using babel-preset-env now: please read https://babeljs.io/env to update!", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-plugin-transform-exponentiation-operator": "^6.24.1" - } - }, "node_modules/babel-preset-flow": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", @@ -7109,13 +7027,6 @@ "dev": true, "license": "MIT" }, - "node_modules/regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==", - "dev": true, - "license": "MIT" - }, "node_modules/regenerator-transform": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", diff --git a/package.json b/package.json index a3fec5fd8..41e289618 100644 --- a/package.json +++ b/package.json @@ -68,12 +68,9 @@ "devDependencies": { "@types/node": "^26.1.2", "@types/picomatch": "^4.0.0", - "babel": "^6.0.0", "babel-core": "^6.0.0", "babel-loader": "^7.0.0", - "babel-polyfill": "^6.16.0", "babel-preset-es2015": "^6.0.0", - "babel-preset-es2016": "6.24.1", "babel-preset-react": "^6.0.0", "glob": "^7.1.1", "jasmine-core": "^6.0.0", From dfe31f6d94d4c152dbd595efa18daf48715e0eaa Mon Sep 17 00:00:00 2001 From: johnnyreilly Date: Sat, 7 Nov 2026 08:10:40 +0000 Subject: [PATCH 02/27] chore: remove lint-staged lint-staged was configured in package.json, but nothing installs a git hook to run it (no husky or similar), so it never ran. Formatting and linting are already checked in CI by the format and lint workflows. Co-Authored-By: Claude Opus 5.5 --- knip.json | 1 - package-lock.json | 45 --------------------------------------------- package.json | 12 ------------ 3 files changed, 58 deletions(-) diff --git a/knip.json b/knip.json index c212370ec..ad1a53b64 100644 --- a/knip.json +++ b/knip.json @@ -19,7 +19,6 @@ "karma-mocha-reporter", "karma-sourcemap-loader", "karma-webpack", - "lint-staged", "loader-utils", "mocha", "webpack-cli" diff --git a/package-lock.json b/package-lock.json index 8c36ccdda..980c063f8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,6 @@ "karma-sourcemap-loader": "^0.4.0", "karma-webpack": "^5.0.0", "knip": "^6.30.0", - "lint-staged": "^17.3.0", "loader-utils": "^1.4.2", "markdown-toc": "^1.2.0", "mocha": "^6.0.0", @@ -5423,30 +5422,6 @@ "node": ">=6" } }, - "node_modules/lint-staged": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-17.3.0.tgz", - "integrity": "sha512-woZS3vNe3UKqBaLPvbLOtKRY4tLANpWQhom12MGWqC8Mh1lCOO+WgSwmX2amjJAqTY9BkXYW87fCUH5H9Ph6xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^4.0.5", - "string-argv": "^0.3.2", - "tinyexec": "^1.2.4" - }, - "bin": { - "lint-staged": "bin/lint-staged.js" - }, - "engines": { - "node": ">=22.22.1" - }, - "funding": { - "url": "https://opencollective.com/lint-staged" - }, - "optionalDependencies": { - "yaml": "^2.9.0" - } - }, "node_modules/list-item": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/list-item/-/list-item-1.1.1.tgz", @@ -7704,16 +7679,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/string-argv": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.19" - } - }, "node_modules/string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -7907,16 +7872,6 @@ "xtend": "~4.0.1" } }, - "node_modules/tinyexec": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz", - "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/tinyglobby": { "version": "0.2.17", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", diff --git a/package.json b/package.json index 41e289618..2445c1676 100644 --- a/package.json +++ b/package.json @@ -24,17 +24,6 @@ "generate-toc": "markdown-toc -i ./README.md && git add README.md && git commit -m \"chore: update docs\"", "knip": "knip" }, - "lint-staged": { - "src/**/*.*": [ - "npm run format", - "npm run lint", - "git add" - ], - "*.md": [ - "npm run format", - "git add" - ] - }, "repository": { "type": "git", "url": "git+https://github.com/TypeStrong/ts-loader.git" @@ -81,7 +70,6 @@ "karma-sourcemap-loader": "^0.4.0", "karma-webpack": "^5.0.0", "knip": "^6.30.0", - "lint-staged": "^17.3.0", "loader-utils": "^1.4.2", "markdown-toc": "^1.2.0", "mocha": "^6.0.0", From eca9f30f766a68a77b38405e31fff8dc82592562 Mon Sep 17 00:00:00 2001 From: johnnyreilly Date: Sat, 7 Nov 2026 08:14:43 +0000 Subject: [PATCH 03/27] chore: restore babel-polyfill and babel-preset-es2016 The babel execution tests are not skipped (the isNotBabelTest filter is commented out), and they resolve these from the root install: 2.1.4_babel-es2016 and 2.1.4_babel-react use the es2016 preset, and 2.4.1_importCodeSplitting imports babel-polyfill. Co-Authored-By: Claude Opus 5.5 --- knip.json | 2 ++ package-lock.json | 75 +++++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 ++ 3 files changed, 79 insertions(+) diff --git a/knip.json b/knip.json index ad1a53b64..ca1d57848 100644 --- a/knip.json +++ b/knip.json @@ -9,7 +9,9 @@ "ignoreDependencies": [ "babel-core", "babel-loader", + "babel-polyfill", "babel-preset-es2015", + "babel-preset-es2016", "babel-preset-react", "glob", "jasmine-core", diff --git a/package-lock.json b/package-lock.json index 980c063f8..a1cb8ad15 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,9 @@ "@types/picomatch": "^4.0.0", "babel-core": "^6.0.0", "babel-loader": "^7.0.0", + "babel-polyfill": "^6.16.0", "babel-preset-es2015": "^6.0.0", + "babel-preset-es2016": "6.24.1", "babel-preset-react": "^6.0.0", "glob": "^7.1.1", "jasmine-core": "^6.0.0", @@ -2190,6 +2192,18 @@ "node": ">=0.10.0" } }, + "node_modules/babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha512-gCtfYORSG1fUMX4kKraymq607FWgMWg+j42IFPc18kFQEsmtaibP4UrqsXt8FlEJle25HUd4tsoDR7H2wDhe9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, "node_modules/babel-helper-builder-react-jsx": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", @@ -2228,6 +2242,18 @@ "lodash": "^4.17.4" } }, + "node_modules/babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha512-qe5csbhbvq6ccry9G7tkXbzNtcDiH4r51rrPUbwwoTzZ18AqxWYRZT6AOmxrpxKnQBW0pYlBI/8vh73Z//78nQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, "node_modules/babel-helper-function-name": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", @@ -2352,6 +2378,13 @@ "babel-runtime": "^6.22.0" } }, + "node_modules/babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha512-Z/flU+T9ta0aIEKl1tGEmN/pZiI1uXmCiGFRegKacQfEJzp7iNsKloZmyJlQr+75FCJtiFfGIK03SiCvCt9cPQ==", + "dev": true, + "license": "MIT" + }, "node_modules/babel-plugin-syntax-flow": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", @@ -2622,6 +2655,18 @@ "regexpu-core": "^2.0.0" } }, + "node_modules/babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha512-LzXDmbMkklvNhprr20//RStKVcT8Cu+SQtX18eMHLhjHf2yFzwtQ0S2f0jQ+89rokoNdmwoSqYzAhq86FxlLSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, "node_modules/babel-plugin-transform-flow-strip-types": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", @@ -2698,6 +2743,18 @@ "babel-types": "^6.24.1" } }, + "node_modules/babel-polyfill": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "regenerator-runtime": "^0.10.5" + } + }, "node_modules/babel-preset-es2015": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", @@ -2732,6 +2789,17 @@ "babel-plugin-transform-regenerator": "^6.24.1" } }, + "node_modules/babel-preset-es2016": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2016/-/babel-preset-es2016-6.24.1.tgz", + "integrity": "sha512-h3X19N+xHD3S0LqB1VIWAU3UbsbH7r5T5uHJMlkpWyJZ/gUuKQ1c9SiMYRBLZ9h7whxy5nqglx2U1o/wiz9ScQ==", + "deprecated": "🙌 Thanks for using Babel: we recommend using babel-preset-env now: please read https://babeljs.io/env to update!", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-transform-exponentiation-operator": "^6.24.1" + } + }, "node_modules/babel-preset-flow": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", @@ -7002,6 +7070,13 @@ "dev": true, "license": "MIT" }, + "node_modules/regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==", + "dev": true, + "license": "MIT" + }, "node_modules/regenerator-transform": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", diff --git a/package.json b/package.json index 2445c1676..ed10000ba 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,9 @@ "@types/picomatch": "^4.0.0", "babel-core": "^6.0.0", "babel-loader": "^7.0.0", + "babel-polyfill": "^6.16.0", "babel-preset-es2015": "^6.0.0", + "babel-preset-es2016": "6.24.1", "babel-preset-react": "^6.0.0", "glob": "^7.1.1", "jasmine-core": "^6.0.0", From f3c7848b306200c02d6bbcd8a84544f879b76ca0 Mon Sep 17 00:00:00 2001 From: johnnyreilly Date: Sat, 7 Nov 2026 08:38:23 +0000 Subject: [PATCH 04/27] chore: replace semver with a small version-compare helper semver was only used by the execution test runner to skip tests whose folder name starts with a minimum TypeScript/webpack version. A major.minor.patch comparison covers that, including skipping the `_5.0.0_` tests on webpack 4. Co-Authored-By: Claude Opus 5.5 --- package-lock.json | 14 -------------- package.json | 1 - test/execution-tests/run-tests.js | 19 +++++++++++++++---- 3 files changed, 15 insertions(+), 19 deletions(-) diff --git a/package-lock.json b/package-lock.json index a1cb8ad15..6a7acb99c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,7 +37,6 @@ "oxlint": "^1.79.0", "oxlint-tsgolint": "^7.0.2001", "prettier": "^3.9.6", - "semver": "^7.8.5", "typescript": "^7.1.0-beta", "webpack": "^5.74.0", "webpack-cli": "^4.10.0" @@ -7337,19 +7336,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", diff --git a/package.json b/package.json index ed10000ba..259e8ed1e 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,6 @@ "oxlint": "^1.79.0", "oxlint-tsgolint": "^7.0.2001", "prettier": "^3.9.6", - "semver": "^7.8.5", "typescript": "^7.1.0-beta", "webpack": "^5.74.0", "webpack-cli": "^4.10.0" diff --git a/test/execution-tests/run-tests.js b/test/execution-tests/run-tests.js index 285b529fe..2e7f98b33 100644 --- a/test/execution-tests/run-tests.js +++ b/test/execution-tests/run-tests.js @@ -6,7 +6,6 @@ var path = require('path'); var execSync = require('child_process').execSync; var typescript = require('typescript'); var webpack = require('webpack'); -var semver = require('semver'); var pathExists = require('../pathExists'); process.env.NODE_ENV = 'test'; @@ -72,18 +71,18 @@ function isHighEnoughTypeScriptVersion (testName) { var minTsVersionAndTestName = testName.split('_'); if (minTsVersionAndTestName.length === 2) { var minTsVersion = minTsVersionAndTestName[0]; - if (semver.lt(typescript.version, minTsVersion)) { + if (isLowerVersion(typescript.version, minTsVersion)) { console.log('Skipping test ' + testName + ' as its minimum version of ' + minTsVersion + ' is greater than our current version of TypeScript: ' + typescript.version); return false; } } else if (minTsVersionAndTestName.length === 3) { var minTsVersion = minTsVersionAndTestName[0]; - if (semver.lt(typescript.version, minTsVersion)) { + if (isLowerVersion(typescript.version, minTsVersion)) { console.log('Skipping test ' + testName + ' as its minimum version of ' + minTsVersion + ' is greater than our current version of TypeScript: ' + typescript.version); return false; } var minWebpackVersion = minTsVersionAndTestName[1]; - if (semver.lt(webpack.version, minWebpackVersion)) { + if (isLowerVersion(webpack.version, minWebpackVersion)) { console.log('Skipping test ' + testName + ' as its minimum version of ' + minWebpackVersion + ' is greater than our current version of webpack: ' + webpack.version); return false; } @@ -91,6 +90,18 @@ function isHighEnoughTypeScriptVersion (testName) { return true; } +/** Compares major.minor.patch only; prerelease tags like `-beta` are ignored. */ +function isLowerVersion (version, minVersion) { + var actual = version.split('-')[0].split('.').map(Number); + var minimum = minVersion.split('.').map(Number); + for (var i = 0; i < 3; i++) { + if ((actual[i] || 0) !== (minimum[i] || 0)) { + return (actual[i] || 0) < (minimum[i] || 0); + } + } + return false; +} + /** Temporarily exclude loaderOptions until custom transformers work with the default native API path */ function isNotLoaderOptionsTest (testName) { var isLoaderOptionsTest = testName === 'loaderOptions'; From 64a46233537c4f3ffa1fea940f809df5533a695d Mon Sep 17 00:00:00 2001 From: johnnyreilly Date: Sat, 7 Nov 2026 08:45:02 +0000 Subject: [PATCH 05/27] chore: replace glob with a recursive readdir helper The comparison test harness only used glob.sync to list every file under a directory. A small `listFiles` helper built on fs.readdirSync({ recursive: true }) does the same: same results and order, `/`-separated paths on Windows, dotfiles optional, and an empty list for a missing directory. Co-Authored-By: Claude Opus 5.5 --- knip.json | 1 - package-lock.json | 1 - package.json | 1 - .../create-and-execute-test.js | 43 ++++++++++++++++--- 4 files changed, 36 insertions(+), 10 deletions(-) diff --git a/knip.json b/knip.json index ca1d57848..2b8b825b9 100644 --- a/knip.json +++ b/knip.json @@ -13,7 +13,6 @@ "babel-preset-es2015", "babel-preset-es2016", "babel-preset-react", - "glob", "jasmine-core", "karma", "karma-chrome-launcher", diff --git a/package-lock.json b/package-lock.json index 6a7acb99c..08169c32e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,6 @@ "babel-preset-es2015": "^6.0.0", "babel-preset-es2016": "6.24.1", "babel-preset-react": "^6.0.0", - "glob": "^7.1.1", "jasmine-core": "^6.0.0", "karma": "^6.0.0", "karma-chrome-launcher": "^3.1.0", diff --git a/package.json b/package.json index 259e8ed1e..d175759fe 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,6 @@ "babel-preset-es2015": "^6.0.0", "babel-preset-es2016": "6.24.1", "babel-preset-react": "^6.0.0", - "glob": "^7.1.1", "jasmine-core": "^6.0.0", "karma": "^6.0.0", "karma-chrome-launcher": "^3.1.0", diff --git a/test/comparison-tests/create-and-execute-test.js b/test/comparison-tests/create-and-execute-test.js index a35fb4cc1..22ee06f39 100644 --- a/test/comparison-tests/create-and-execute-test.js +++ b/test/comparison-tests/create-and-execute-test.js @@ -3,7 +3,6 @@ const fs = require('fs'); const execSync = require('child_process').execSync; const path = require('path'); const webpack = require('webpack'); -const glob = require('glob'); const pathExists = require('../pathExists'); const aliasLoader = require('../aliasLoader'); const copySync = require('./copySync'); @@ -278,8 +277,8 @@ function storeStats(stats, testState, paths) { function compareFiles(paths, test, patch) { if (saveOutputMode) { - const actualFiles = glob.sync('**/*', { cwd: paths.actualOutput, nodir: true, dot: true }); - const expectedFiles = glob.sync('**/*', { cwd: paths.originalExpectedOutput, nodir: true, dot: true }) + const actualFiles = listFiles(paths.actualOutput); + const expectedFiles = listFiles(paths.originalExpectedOutput) .filter(function (file) { return !file.startsWith('patch'); }); const allFiles = {}; @@ -301,8 +300,8 @@ function compareFiles(paths, test, patch) { } else { // compare actual to expected - const actualFiles = glob.sync('**/*', { cwd: paths.actualOutput, nodir: true, dot: true }), - expectedFiles = glob.sync('**/*', { cwd: paths.expectedOutput, nodir: true, dot: true }) + const actualFiles = listFiles(paths.actualOutput), + expectedFiles = listFiles(paths.expectedOutput) .filter(function (file) { return !file.startsWith('patch'); }), allFiles = {}; @@ -347,6 +346,36 @@ function compareFiles(paths, test, patch) { } } +/** + * Lists every file under a directory, recursively. Replaces the `glob` package's + * `glob.sync` with `{ nodir: true }`, and gives the same results and order. + * + * @example + * listFiles(paths.actualOutput); // ['bundle.js', 'output.txt', 'sub/.hidden.js'] + * listFiles(paths.actualOutput, { includeDotFiles: false }); // ['bundle.js', 'output.txt'] + * + * @param {string} dir - The directory to search. If it doesn't exist, the result is empty. + * @param {object} [options] + * @param {boolean} [options.includeDotFiles=true] - Include files and folders whose name + * starts with `.` (glob's `dot` option). + * @returns {string[]} File paths relative to `dir`, always `/`-separated (also on + * Windows), sorted like glob sorts them. Directories are left out; symlinked files + * are included. + */ +function listFiles(dir, { includeDotFiles = true } = {}) { + if (!fs.existsSync(dir)) { + return []; + } + return fs.readdirSync(dir, { recursive: true }) + .map(function (file) { return file.split(path.sep).join('/'); }) + .filter(function (file) { + return includeDotFiles || !file.split('/').some(function (part) { return part.startsWith('.'); }); + }) + // statSync follows symlinks, so a symlinked file still counts as a file + .filter(function (file) { return fs.statSync(path.join(dir, file)).isFile(); }) + .sort(function (a, b) { return a.localeCompare(b, 'en'); }); +} + /** * A patch file named `.__deleted__` deletes `` from the staged * test, since copying a patch over it can otherwise only add or overwrite @@ -354,7 +383,7 @@ function compareFiles(paths, test, patch) { */ function applyPatchDeletions(patchPath, testStagingPath) { const deletedSuffix = '.__deleted__'; - for (const marker of glob.sync('**/*' + deletedSuffix, { cwd: patchPath, nodir: true, dot: true })) { + for (const marker of listFiles(patchPath).filter(function (file) { return file.endsWith(deletedSuffix); })) { fs.rmSync(path.join(testStagingPath, marker.slice(0, -deletedSuffix.length)), { force: true }); fs.rmSync(path.join(testStagingPath, marker), { force: true }); } @@ -392,7 +421,7 @@ function copyPatchOrEndTest(testStagingPath, watcher, testState, done) { function cleanHashFromOutput(stats, webpackOutput) { const escapedStagingPath = stagingPath.replaceAll('\\', '\\\\'); if (stats) { - glob.sync('**/*', { cwd: webpackOutput, nodir: true }).forEach(function (file) { + listFiles(webpackOutput, { includeDotFiles: false }).forEach(function (file) { const content = fs.readFileSync(path.join(webpackOutput, file), 'utf-8') .split(stats.hash).join('[hash]') .replace(/\r\n/g, '\n') From 9a429d39f1b391195c1dc02c608c949ffef72b92 Mon Sep 17 00:00:00 2001 From: johnnyreilly Date: Sat, 7 Nov 2026 11:00:05 +0000 Subject: [PATCH 06/27] chore: remove markdown-toc It was only used by the generate-toc script, and the README's TOC is already maintained by hand: Prettier has rewritten its bullets, so re-running the generator would fight Prettier. Also fix the one stale TOC label ("Declarations" -> "Declaration Files"). Co-Authored-By: Claude Opus 5.5 --- README.md | 2 +- package-lock.json | 573 ---------------------------------------------- package.json | 2 - 3 files changed, 1 insertion(+), 576 deletions(-) diff --git a/README.md b/README.md index 356e4e6aa..02ecf9993 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ - [Configuration](#configuration) - [`devtool` / sourcemaps](#devtool--sourcemaps) - [Code Splitting and Loading Other Resources](#code-splitting-and-loading-other-resources) - - [Declarations (.d.ts)](#declaration-files-dts) + - [Declaration Files (.d.ts)](#declaration-files-dts) - [Failing the build on TypeScript compilation error](#failing-the-build-on-typescript-compilation-error) - [`paths` module resolution](#paths-module-resolution) - [Options](#options) diff --git a/package-lock.json b/package-lock.json index 08169c32e..372be07b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,7 +31,6 @@ "karma-webpack": "^5.0.0", "knip": "^6.30.0", "loader-utils": "^1.4.2", - "markdown-toc": "^1.2.0", "mocha": "^6.0.0", "oxlint": "^1.79.0", "oxlint-tsgolint": "^7.0.2001", @@ -2023,19 +2022,6 @@ "node": ">=6" } }, - "node_modules/ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha512-ewaIr5y+9CUTGFwZfpECUbFlGcC0GCw1oqR9RI6h1gQCd9Aj2GxSckCnPsVJnmfMZbwFYE+leZGASgkWl06Jow==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-wrap": "0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -2056,16 +2042,6 @@ "node": ">=0.10.0" } }, - "node_modules/ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -2103,16 +2079,6 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/autolinker": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.28.1.tgz", - "integrity": "sha512-zQAFO1Dlsn69eXaO6+7YZc+v84aquQKbwpzCE3L0stj56ERn9hutFxPopViLjo9G+rWwjozRhgS5KJ25Xy19cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "gulp-header": "^1.7.1" - } - }, "node_modules/babel-code-frame": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", @@ -3267,21 +3233,6 @@ "node": ">=0.10.0" } }, - "node_modules/coffee-script": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", - "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==", - "deprecated": "CoffeeScript on NPM has moved to \"coffeescript\" (no hyphen)", - "dev": true, - "license": "MIT", - "bin": { - "cake": "bin/cake", - "coffee": "bin/coffee" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -3327,42 +3278,6 @@ "dev": true, "license": "MIT" }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concat-with-sourcemaps": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", - "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", - "dev": true, - "license": "ISC", - "dependencies": { - "source-map": "^0.6.1" - } - }, - "node_modules/concat-with-sourcemaps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/connect": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", @@ -3414,13 +3329,6 @@ "dev": true, "license": "MIT" }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true, - "license": "MIT" - }, "node_modules/cors": { "version": "2.8.6", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", @@ -3562,16 +3470,6 @@ "dev": true, "license": "MIT" }, - "node_modules/diacritics-map": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/diacritics-map/-/diacritics-map-0.1.0.tgz", - "integrity": "sha512-3omnDTYrGigU0i4cJjvaKwD52B8aoqyX/NEIkukFFkogBemsIbhSa1O414fpTp5nuszJG6lvQ5vBvDVNCbSsaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", @@ -4027,49 +3925,6 @@ "node": ">=0.10.0" } }, - "node_modules/expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-range/node_modules/fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-range/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", - "dev": true, - "license": "MIT", - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -4077,19 +3932,6 @@ "dev": true, "license": "MIT" }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4274,16 +4116,6 @@ } } }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/foreach": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", @@ -4502,23 +4334,6 @@ "dev": true, "license": "ISC" }, - "node_modules/gray-matter": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-2.1.1.tgz", - "integrity": "sha512-vbmvP1Fe/fxuT2QuLVcqb2BfK7upGhhbLIt9/owWEvPYrZZEkelLcq2HqzxosV+PQ67dUFLaAeNpH7C4hhICAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-red": "^0.1.1", - "coffee-script": "^1.12.4", - "extend-shallow": "^2.0.1", - "js-yaml": "^3.8.1", - "toml": "^2.3.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", @@ -4529,19 +4344,6 @@ "node": ">=4.x" } }, - "node_modules/gulp-header": { - "version": "1.8.12", - "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz", - "integrity": "sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==", - "deprecated": "Removed event-stream from gulp-header", - "dev": true, - "license": "MIT", - "dependencies": { - "concat-with-sourcemaps": "*", - "lodash.template": "^4.4.0", - "through2": "^2.0.0" - } - }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -4861,13 +4663,6 @@ "node": ">=8" } }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true, - "license": "MIT" - }, "node_modules/is-callable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", @@ -4901,16 +4696,6 @@ "node": ">= 0.4" } }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -4957,19 +4742,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==", - "dev": true, - "license": "MIT", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -5022,13 +4794,6 @@ "node": ">= 0.4" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, "node_modules/isbinaryfile": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", @@ -5397,19 +5162,6 @@ "node": ">=0.10.0" } }, - "node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/knip": { "version": "6.39.0", "resolved": "https://registry.npmjs.org/knip/-/knip-6.39.0.tgz", @@ -5462,19 +5214,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha512-7vp2Acd2+Kz4XkzxGxaB1FWOi8KjWIWsgdfD5MCb86DWvlLqhRPM+d6Pro3iNEL5VT9mstz5hKAlcd+QR6H3aA==", - "dev": true, - "license": "MIT", - "dependencies": { - "set-getter": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/lcid": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", @@ -5488,22 +5227,6 @@ "node": ">=6" } }, - "node_modules/list-item": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/list-item/-/list-item-1.1.1.tgz", - "integrity": "sha512-S3D0WZ4J6hyM8o5SNKWaMYB1ALSacPZ2nHGEuCjmHZ+dc03gFeNZoNDcqfcnO4vDhTZmNrqrpYZCdXsRh22bzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "expand-range": "^1.8.1", - "extend-shallow": "^2.0.1", - "is-number": "^2.1.0", - "repeat-string": "^1.5.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -5563,35 +5286,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "deprecated": "This package is deprecated. Use https://socket.dev/npm/package/eta instead.", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "node_modules/lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash._reinterpolate": "^3.0.0" - } - }, "node_modules/log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", @@ -5737,43 +5431,6 @@ "node": ">=6" } }, - "node_modules/markdown-link": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/markdown-link/-/markdown-link-0.1.1.tgz", - "integrity": "sha512-TurLymbyLyo+kAUUAV9ggR9EPcDjP/ctlv9QAFiqUH7c+t6FlsbivPo9OKTU8xdOx9oNd2drW/Fi5RRElQbUqA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/markdown-toc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz", - "integrity": "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "concat-stream": "^1.5.2", - "diacritics-map": "^0.1.0", - "gray-matter": "^2.1.0", - "lazy-cache": "^2.0.2", - "list-item": "^1.1.1", - "markdown-link": "^0.1.1", - "minimist": "^1.2.0", - "mixin-deep": "^1.1.3", - "object.pick": "^1.2.0", - "remarkable": "^1.7.1", - "repeat-string": "^1.6.1", - "strip-color": "^0.1.0" - }, - "bin": { - "markdown-toc": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -5784,13 +5441,6 @@ "node": ">= 0.4" } }, - "node_modules/math-random": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", - "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", - "dev": true, - "license": "MIT" - }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -5889,33 +5539,6 @@ "dev": true, "license": "MIT" }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-deep/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -6423,19 +6046,6 @@ "node": ">= 0.8" } }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -6879,13 +6489,6 @@ "node": ">= 0.6" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "license": "MIT" - }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -6931,41 +6534,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/randomatic/node_modules/is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/randomatic/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -7006,22 +6574,6 @@ "node": ">= 0.8" } }, - "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -7128,43 +6680,6 @@ "jsesc": "bin/jsesc" } }, - "node_modules/remarkable": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.4.tgz", - "integrity": "sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.10", - "autolinker": "~0.28.0" - }, - "bin": { - "remarkable": "bin/remarkable.js" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, "node_modules/repeating": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", @@ -7352,19 +6867,6 @@ "dev": true, "license": "ISC" }, - "node_modules/set-getter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.1.tgz", - "integrity": "sha512-9sVWOy+gthr+0G9DzqqLaYNA7+5OKkSmcqjL9cBpDEaZrr3ShQlyX2cZ/O/ozE41oxn/Tt0LGEM/w4Rub3A3gw==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-object-path": "^0.3.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -7729,16 +7231,6 @@ "dev": true, "license": "MIT" }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -7789,16 +7281,6 @@ "node": ">=0.10.0" } }, - "node_modules/strip-color": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/strip-color/-/strip-color-0.1.0.tgz", - "integrity": "sha512-p9LsUieSjWNNAxVCXLeilaDlmuUOrDS5/dF9znM1nZc7EGX5+zEFC0bEevsNIaldjlks+2jns5Siz6F9iK6jwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -7921,17 +7403,6 @@ "source-map": "^0.6.0" } }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "node_modules/tinyglobby": { "version": "0.2.17", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", @@ -7969,19 +7440,6 @@ "node": ">=0.10.0" } }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -8015,13 +7473,6 @@ "node": ">=0.6" } }, - "node_modules/toml": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.6.tgz", - "integrity": "sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ==", - "dev": true, - "license": "MIT" - }, "node_modules/trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", @@ -8054,13 +7505,6 @@ "node": ">= 0.6" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true, - "license": "MIT" - }, "node_modules/typescript": { "version": "7.1.0-beta", "resolved": "https://registry.npmjs.org/typescript/-/typescript-7.1.0-beta.tgz", @@ -8192,13 +7636,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT" - }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -8562,16 +7999,6 @@ } } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index d175759fe..747fcce22 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,6 @@ "clean": "git clean -xfd test/comparison-tests && git clean -xfd test/execution-tests", "docker:build": "docker build -t ts-loader .", "postdocker:build": "docker run -it ts-loader npm test", - "generate-toc": "markdown-toc -i ./README.md && git add README.md && git commit -m \"chore: update docs\"", "knip": "knip" }, "repository": { @@ -72,7 +71,6 @@ "karma-webpack": "^5.0.0", "knip": "^6.30.0", "loader-utils": "^1.4.2", - "markdown-toc": "^1.2.0", "mocha": "^6.0.0", "oxlint": "^1.79.0", "oxlint-tsgolint": "^7.0.2001", From a72fa954ea2762117b624f1281d782b801155452 Mon Sep 17 00:00:00 2001 From: johnnyreilly Date: Sat, 7 Nov 2026 11:21:52 +0000 Subject: [PATCH 07/27] chore: upgrade mocha from 6 to 12 Two changes keep the comparison test runner working with mocha 12: - Pass `--color` instead of `-c`. Mocha 6 restarted itself with the long form in process.argv, which picocolors uses to turn colors on; mocha 12 passes `-c` through as-is, so the colored output snapshots no longer matched. - Pass `--test-to-run=`. Mocha 12 parses arguments with util.parseArgs and treats a separate value as a spec file. The test file now reads its arguments with util.parseArgs too (non-strict, as mocha's own arguments are mixed in), accepts both forms, and fails clearly when the test name is missing. Also point the allowed mocha commands in .claude/settings.json at bin/mocha.js, as mocha 12 removed bin/_mocha. Co-Authored-By: Claude Opus 5.5 --- .claude/settings.json | 4 +- package-lock.json | 1310 +++-------------- package.json | 2 +- .../create-and-execute-test.js | 29 +- test/comparison-tests/run-tests.js | 4 +- 5 files changed, 234 insertions(+), 1115 deletions(-) diff --git a/.claude/settings.json b/.claude/settings.json index c9bd46867..4c4d84c45 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -30,8 +30,8 @@ "Bash(grep *)", "Read(//usr/local/lib/node_modules/**)", "Bash(rm -rf .test)", - "Bash(FORCE_COLOR=1 node node_modules/mocha/bin/_mocha test/comparison-tests/create-and-execute-test.js --reporter spec --test-to-run * --timeout 25000)", - "Bash(node node_modules/mocha/bin/_mocha test/comparison-tests/create-and-execute-test.js --reporter spec --test-to-run * --timeout 25000)", + "Bash(FORCE_COLOR=1 node node_modules/mocha/bin/mocha.js test/comparison-tests/create-and-execute-test.js --reporter spec --test-to-run * --timeout 25000)", + "Bash(node node_modules/mocha/bin/mocha.js test/comparison-tests/create-and-execute-test.js --reporter spec --test-to-run * --timeout 25000)", "Bash(echo \"PID $!\")" ] } diff --git a/package-lock.json b/package-lock.json index 372be07b5..c01f01305 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,7 +31,7 @@ "karma-webpack": "^5.0.0", "knip": "^6.30.0", "loader-utils": "^1.4.2", - "mocha": "^6.0.0", + "mocha": "^12.0.3", "oxlint": "^1.79.0", "oxlint-tsgolint": "^7.0.2001", "prettier": "^3.9.6", @@ -2012,16 +2012,6 @@ "ajv": "^8.8.2" } }, - "node_modules/ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -2070,14 +2060,21 @@ } }, "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-3.0.4.tgz", + "integrity": "sha512-fwWK3Zq22l4XJJjx5mcBHGikIk+hJqO+32dPm0Jur7+rtG5x1scOjSfdT9ZKeWHPpsya/l0HHK4tDImBkTrtvA==", "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "PSF-2.0" }, "node_modules/babel-code-frame": { "version": "6.26.0", @@ -3055,16 +3052,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/caniuse-lite": { "version": "1.0.30001737", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001737.tgz", @@ -3223,16 +3210,6 @@ "node": ">=0.10.0" } }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -3405,30 +3382,6 @@ "ms": "2.0.0" } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha512-hpr5VSFXGamODSCN6P2zdSBY6zJT7DlcBAHiPIa2PWDvfBqJQntSK0ehUoHoS6HGeSS19dgj7E+1xOjfG3zEtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "foreach": "^2.0.5", - "object-keys": "^1.0.8" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -3471,9 +3424,9 @@ "license": "MIT" }, "node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-9.0.0.tgz", + "integrity": "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -3549,16 +3502,6 @@ "node": ">= 0.8" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/engine.io": { "version": "6.6.9", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.9.tgz", @@ -3659,23 +3602,6 @@ "node": ">=4" } }, - "node_modules/es-abstract": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz", - "integrity": "sha512-/uh/DhdqIOSkAWifU+8nG78vlQxdLckUdI/sPgy0VhuXi2qJ7T8czBmqIYtLQVpCIFYafChnsRsB5pyb1JdmCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-to-primitive": "^1.1.1", - "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -3716,21 +3642,6 @@ "node": ">= 0.4" } }, - "node_modules/es-to-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "integrity": "sha512-wXsac552n5sYhgVjyFvhXLunXZFPOiT/WgP7hFhUPU5gtaUQpm9OryPwlWQUS3Qptk8iZzY/2T3J62GtC/toSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.1", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -3772,20 +3683,6 @@ "node": ">=8.0.0" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -3846,85 +3743,6 @@ "node": ">=0.8.x" } }, - "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/execa/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/execa/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/execa/node_modules/semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/execa/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -4051,41 +3869,17 @@ "node": ">=4" } }, - "node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", "dev": true, "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, "engines": { - "node": ">=6" - } - }, - "node_modules/flat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", - "deprecated": "Fixed a prototype pollution security issue in 4.1.0, please upgrade to ^4.1.1 or ^5.0.1.", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "is-buffer": "~2.0.3" + "node": ">=18" }, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat/node_modules/is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flatted": { @@ -4116,13 +3910,6 @@ } } }, - "node_modules/foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha512-ZBbtRiapkZYLsqoPyZOR+uPfto0GRMNQN1GwzZtZt7iZvPPbDDQV0JF5Hx4o/QFQ5c0vyuoZ98T8RSBbopzWtA==", - "dev": true, - "license": "MIT" - }, "node_modules/formatly": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/formatly/-/formatly-0.7.1.tgz", @@ -4236,19 +4023,6 @@ "node": ">= 0.4" } }, - "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/get-tsconfig": { "version": "4.14.3", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.3.tgz", @@ -4334,16 +4108,6 @@ "dev": true, "license": "ISC" }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.x" - } - }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -4422,16 +4186,6 @@ "node": ">= 0.4" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, "node_modules/home-or-tmp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", @@ -4640,16 +4394,6 @@ "loose-envify": "^1.0.0" } }, - "node_modules/invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -4663,16 +4407,6 @@ "node": ">=8" } }, - "node_modules/is-callable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", - "integrity": "sha512-gcmUh1kFielP0yJSKD+A1aOPNlI8ZzruhHum+Geq6M3Ibx5JnwcsTJCktWj+reKIjjtefToy/u8YNRUZq4FHuQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/is-core-module": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", @@ -4686,16 +4420,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha512-P5rExV1phPi42ppoMWy7V63N3i173RY921l4JJ7zonMSxK+OWGPj76GD+cUKUb68l4vQXcJp2SsG+r/A4ABVzg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -4719,16 +4443,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -4742,6 +4456,19 @@ "node": ">=0.10.0" } }, + "node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -4774,24 +4501,17 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha512-Z1cLAG7dXM1vJv8mAGjA+XteO0YzYPwD473+qPAWKycNZxwCH/I56QIohKGYCZSB7j6tajrxi/FvOpAfqGhhRQ==", + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/isbinaryfile": { @@ -4880,17 +4600,26 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-5.5.0.tgz", + "integrity": "sha512-paNr4LFIFPjeeSmwNYdrb8FafLLG/Cr2Af3GjbsHJ5CxIjH4r0c2emlmRdAtpPAieP1gRVzk6buBbVP5gBMGAg==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^3.0.3" }, "bin": { - "js-yaml": "bin/js-yaml.js" + "js-yaml": "bin/js-yaml.mjs" } }, "node_modules/jsesc": { @@ -5214,19 +4943,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "invert-kv": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -5265,20 +4981,6 @@ "json5": "lib/cli.js" } }, - "node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -5405,6 +5107,16 @@ "loose-envify": "cli.js" } }, + "node_modules/lru-cache": { + "version": "11.5.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.3.tgz", + "integrity": "sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, "node_modules/make-dir": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", @@ -5418,19 +5130,6 @@ "node": ">=4" } }, - "node_modules/map-age-cleaner": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz", - "integrity": "sha512-UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-defer": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -5451,21 +5150,6 @@ "node": ">= 0.6" } }, - "node_modules/mem": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", - "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", - "dev": true, - "license": "MIT", - "dependencies": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", - "p-is-promise": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -5509,16 +5193,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/minimatch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", @@ -5539,6 +5213,16 @@ "dev": true, "license": "MIT" }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -5553,332 +5237,172 @@ } }, "node_modules/mocha": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.1.4.tgz", - "integrity": "sha512-PN8CIy4RXsIoxoFJzS4QNnCH4psUCPWc4/rPrst/ecSJJbLBkubMiyGCP2Kj/9YnWbotFqAoeXyXMucj7gwCFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "2.2.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "ms": "2.1.1", - "node-environment-flags": "1.0.5", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.2.2", - "yargs-parser": "13.0.0", - "yargs-unparser": "1.5.0" + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-12.0.3.tgz", + "integrity": "sha512-beammieDdiWdkjANWeWPpkxUROYGi5FN88fPOkLiticz7HTg3Y+Pho3EYE6SUdcuWnZ3h2WD8EXCA55JF4o6wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "browser-stdout": "^1.3.1", + "chokidar": "^5.0.0", + "debug": "^4.3.5", + "diff": "^9.0.0", + "find-up-simple": "^1.0.1", + "glob": "^13.0.0", + "is-path-inside": "^4.0.0", + "is-unicode-supported": "^0.1.0", + "js-yaml": "^5.0.0", + "minimatch": "^10.2.2", + "ms": "^2.1.3", + "picocolors": "^1.1.1", + "serialize-javascript": "^7.1.1", + "strip-json-comments": "^5.0.3", + "supports-color": "^8.1.1", + "workerpool": "^10.0.0" }, "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" + "mocha": "bin/mocha.js" }, "engines": { - "node": ">= 6.0.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/mocha/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha512-wFUFA5bg5dviipbQQ32yOQhl6gcJaJXiHE7dvR8VYPG97+J/GNC5FKGepKdEDUFeXRzDxPF1X/Btc8L+v7oqIQ==", + "node_modules/mocha/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" - } - }, - "node_modules/mocha/node_modules/cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "node": "18 || 20 || >=22" } }, - "node_modules/mocha/node_modules/cliui/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "node_modules/mocha/node_modules/brace-expansion": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", "dev": true, "license": "MIT", "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "balanced-match": "^4.0.2" }, "engines": { - "node": ">=4" + "node": "20 || >=22" } }, - "node_modules/mocha/node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "node_modules/mocha/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/mocha/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true, - "license": "MIT" - }, - "node_modules/mocha/node_modules/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "readdirp": "^5.0.0" }, "engines": { - "node": "*" + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/mocha/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/mocha/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "ms": "^2.1.3" }, "engines": { - "node": "*" - } - }, - "node_modules/mocha/node_modules/minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/mocha/node_modules/mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==", - "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "0.0.8" + "node": ">=6.0" }, - "bin": { - "mkdirp": "bin/cmd.js" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/mocha/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "node_modules/mocha/node_modules/glob": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.7.tgz", + "integrity": "sha512-wfsFgXQ8A3SEI9XGf7Nl3Y9l7ffSrGh7SUCT7vU/2CzYPep9kjxAn1S40F9OPKxAMGCVl7HtNlJhrCJUeUq83g==", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/string-width/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/string-width/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" + "node": "18 || 20 || >=22" }, - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mocha/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "node_modules/mocha/node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "ansi-regex": "^3.0.0" + "brace-expansion": "^5.0.8" }, "engines": { - "node": ">=4" - } - }, - "node_modules/mocha/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" + "node": "18 || 20 || >=22" }, - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mocha/node_modules/wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, - "license": "MIT", - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/mocha/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "node_modules/mocha/node_modules/readdirp": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", + "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mocha/node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "number-is-nan": "^1.0.0" + "node": ">= 20.19.0" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/mocha/node_modules/wrap-ansi/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "node_modules/mocha/node_modules/serialize-javascript": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.1.4.tgz", + "integrity": "sha512-FqlEuoTq/zRmA4Lg6aOqyH3lCHbUtCB0bmHCeFniX2GBdDqMJM3FwdvEhlE5Pim1dlt2FfBdVPmUNNiGhhKqpw==", "dev": true, - "license": "MIT", - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, + "license": "BSD-3-Clause", "engines": { - "node": ">=0.10.0" + "node": ">=20.0.0" } }, - "node_modules/mocha/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^2.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mocha/node_modules/y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true, - "license": "ISC" - }, - "node_modules/mocha/node_modules/yargs": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", - "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^4.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/ms": { @@ -5905,34 +5429,6 @@ "dev": true, "license": "MIT" }, - "node_modules/nice-try": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", - "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-environment-flags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - } - }, - "node_modules/node-environment-flags/node_modules/semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, "node_modules/node-releases": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", @@ -5950,29 +5446,6 @@ "node": ">=0.10.0" } }, - "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -6006,46 +5479,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha512-NwrpYtu1CSNWdNgcEvLmHOHjhMeglj22YJpg/ezASfIFYqNK4F94iUxKRPnRNbOuOMoQb5JS+6Ebi16xtYZbqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -6079,21 +5512,6 @@ "node": ">=0.10.0" } }, - "node_modules/os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -6239,62 +5657,6 @@ "@oxlint-tsgolint/win32-x64": "7.0.2003" } }, - "node_modules/p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/p-is-promise": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha512-zL7VE4JVS2IFSkR2GQKDSPEVxkoH43/p7oEnwpdCndKYJO0HVeRB7fA8TJwuLOTBREtK0ea8eHaxdwcpob5dmg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -6359,6 +5721,23 @@ "dev": true, "license": "MIT" }, + "node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -6489,17 +5868,6 @@ "node": ">= 0.6" } }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -6713,13 +6081,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true, - "license": "ISC" - }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -6860,13 +6221,6 @@ "randombytes": "^2.1.0" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true, - "license": "ISC" - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -6996,13 +6350,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true, - "license": "ISC" - }, "node_modules/slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", @@ -7174,13 +6521,6 @@ "node": ">=0.10.0" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -7231,43 +6571,6 @@ "dev": true, "license": "MIT" }, - "node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha512-wFUFA5bg5dviipbQQ32yOQhl6gcJaJXiHE7dvR8VYPG97+J/GNC5FKGepKdEDUFeXRzDxPF1X/Btc8L+v7oqIQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -7281,16 +6584,6 @@ "node": ">=0.10.0" } }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strip-json-comments": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.3.tgz", @@ -7844,23 +7137,6 @@ "which": "bin/which" } }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true, - "license": "ISC" - }, - "node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, "node_modules/wildcard": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", @@ -7868,6 +7144,13 @@ "dev": true, "license": "MIT" }, + "node_modules/workerpool": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-10.0.3.tgz", + "integrity": "sha512-6z2Iis68Wqth93/G/wJP9u+R3O+d2XTlgWChGCwuT1qLbBsOYueGRZuJ++v3mtDP5KjYdy+WzvWC+VWETSVXJA==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -8044,185 +7327,6 @@ "node": ">=10" } }, - "node_modules/yargs-parser": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", - "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/yargs-unparser": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", - "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat": "^4.1.0", - "lodash": "^4.17.11", - "yargs": "^12.0.5" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-unparser/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha512-wFUFA5bg5dviipbQQ32yOQhl6gcJaJXiHE7dvR8VYPG97+J/GNC5FKGepKdEDUFeXRzDxPF1X/Btc8L+v7oqIQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs-unparser/node_modules/cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "node_modules/yargs-unparser/node_modules/get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha512-A6srK23btrgde1mUYEzplvRPjdwkZXrHsIRNRZnG5p8ZEJHG+QB8ENw16MtH7NWiyDGiSF2giAlJpcls/y2wxQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/yargs-unparser/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargs-unparser/node_modules/require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", - "dev": true, - "license": "ISC" - }, - "node_modules/yargs-unparser/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs-unparser/node_modules/wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargs-unparser/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargs-unparser/node_modules/wrap-ansi/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "dev": true, - "license": "MIT", - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargs-unparser/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargs-unparser/node_modules/y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true, - "license": "ISC" - }, - "node_modules/yargs-unparser/node_modules/yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "node_modules/yargs-unparser/node_modules/yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, "node_modules/yargs/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", diff --git a/package.json b/package.json index 747fcce22..3d49e54b2 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "karma-webpack": "^5.0.0", "knip": "^6.30.0", "loader-utils": "^1.4.2", - "mocha": "^6.0.0", + "mocha": "^12.0.3", "oxlint": "^1.79.0", "oxlint-tsgolint": "^7.0.2001", "prettier": "^3.9.6", diff --git a/test/comparison-tests/create-and-execute-test.js b/test/comparison-tests/create-and-execute-test.js index 22ee06f39..8787d025a 100644 --- a/test/comparison-tests/create-and-execute-test.js +++ b/test/comparison-tests/create-and-execute-test.js @@ -6,15 +6,30 @@ const webpack = require('webpack'); const pathExists = require('../pathExists'); const aliasLoader = require('../aliasLoader'); const copySync = require('./copySync'); +const { parseArgs } = require('util'); const getProgram = require('./getProgram'); -const saveOutputMode = process.argv.indexOf('--save-output') !== -1; - -const indexOfTestToRun = process.argv.indexOf('--test-to-run'); -const testToRun = process.argv[indexOfTestToRun + 1]; - -const indexOfExtraOption = process.argv.indexOf('--extra-option'); -const extraOption = indexOfExtraOption === -1 ? undefined : process.argv[indexOfExtraOption + 1]; +// Not strict: process.argv also holds mocha's own arguments (e.g. --reporter spec). +// run-tests.js passes `--test-to-run=`, because mocha treats a separate +// value as a spec file. +const { values: args } = parseArgs({ + args: process.argv.slice(2), + options: { + 'test-to-run': { type: 'string' }, + 'extra-option': { type: 'string' }, + 'save-output': { type: 'boolean' }, + }, + strict: false, + allowPositionals: true, +}); + +const saveOutputMode = args['save-output'] === true; + +const testToRun = args['test-to-run']; +if (typeof testToRun !== 'string') { + throw new Error('Pass the test to run with --test-to-run='); +} +const extraOption = typeof args['extra-option'] === 'string' ? args['extra-option'] : undefined; if (saveOutputMode) { console.log('Will save output as --save-output was supplied...'); diff --git a/test/comparison-tests/run-tests.js b/test/comparison-tests/run-tests.js index 5dad5d326..4f96885ff 100644 --- a/test/comparison-tests/run-tests.js +++ b/test/comparison-tests/run-tests.js @@ -180,10 +180,10 @@ function getTestNameFromPath(testNameOrPath) { * @param {string} testName */ function runTestAsChildProcess(testName) { - const testToRun = ' --test-to-run ' + testName; + const testToRun = ' --test-to-run=' + testName; const debug = process.argv.indexOf('--debug') > -1; const testCommand = - 'mocha -c --reporter spec ' + + 'mocha --color --reporter spec ' + (debug ? '--inspect-brk=5858 ' : '') + 'test/comparison-tests/create-and-execute-test.js ' + testToRun; From 5b79d3a7290bebd6b41bfa8ad87e252837a29ac5 Mon Sep 17 00:00:00 2001 From: johnnyreilly Date: Sat, 7 Nov 2026 11:33:15 +0000 Subject: [PATCH 08/27] chore: remove webpack-cli It was only used by the execution test runner to run `webpack --bail` for the one test without a karma config (5.6.2_5.0.0_optionsCaching). A small run-webpack.js script now does the same through webpack's Node API: it builds once with `bail: true`, prints the stats, and exits with 1 on errors. `--debug` still works via `node --inspect-brk`. The comparison tests README now suggests `npx webpack-cli` for building a test by hand. Co-Authored-By: Claude Opus 5.5 --- knip.json | 3 +- package-lock.json | 492 +--------------------------- package.json | 3 +- test/comparison-tests/README.md | 2 +- test/execution-tests/run-tests.js | 6 +- test/execution-tests/run-webpack.js | 21 ++ 6 files changed, 28 insertions(+), 499 deletions(-) create mode 100644 test/execution-tests/run-webpack.js diff --git a/knip.json b/knip.json index 2b8b825b9..b739c513c 100644 --- a/knip.json +++ b/knip.json @@ -21,7 +21,6 @@ "karma-sourcemap-loader", "karma-webpack", "loader-utils", - "mocha", - "webpack-cli" + "mocha" ] } diff --git a/package-lock.json b/package-lock.json index c01f01305..6ed2ddbb7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,8 +36,7 @@ "oxlint-tsgolint": "^7.0.2001", "prettier": "^3.9.6", "typescript": "^7.1.0-beta", - "webpack": "^5.74.0", - "webpack-cli": "^4.10.0" + "webpack": "^5.74.0" }, "engines": { "node": ">=22.0.0" @@ -63,16 +62,6 @@ "node": ">=0.1.90" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz", - "integrity": "sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/@emnapi/core": { "version": "1.11.2", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.2.tgz", @@ -1871,45 +1860,6 @@ "@xtuc/long": "4.2.2" } }, - "node_modules/@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "webpack": "4.x.x || 5.x.x", - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "envinfo": "^7.7.3" - }, - "peerDependencies": { - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "webpack-cli": "4.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -3185,31 +3135,6 @@ "node": ">=8" } }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/clone-deep/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -3227,13 +3152,6 @@ "dev": true, "license": "MIT" }, - "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true, - "license": "MIT" - }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -3324,37 +3242,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", @@ -3589,19 +3476,6 @@ "node": ">= 0.4" } }, - "node_modules/envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true, - "license": "MIT", - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -3774,13 +3648,6 @@ ], "license": "BSD-3-Clause" }, - "node_modules/fastest-levenshtein": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", - "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", - "dev": true, - "license": "MIT" - }, "node_modules/fd-package-json": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fd-package-json/-/fd-package-json-2.0.0.tgz", @@ -4108,19 +3975,6 @@ "dev": true, "license": "ISC" }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", @@ -4259,102 +4113,6 @@ "node": ">=0.10.0" } }, - "node_modules/import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -4374,16 +4132,6 @@ "dev": true, "license": "ISC" }, - "node_modules/interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -4407,19 +4155,6 @@ "node": ">=8" } }, - "node_modules/is-core-module": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", - "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -4469,19 +4204,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -4534,16 +4256,6 @@ "dev": true, "license": "ISC" }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/jasmine-core": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-6.3.0.tgz", @@ -5657,16 +5369,6 @@ "@oxlint-tsgolint/win32-x64": "7.0.2003" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/package-manager-detector": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.8.0.tgz", @@ -5704,23 +5406,6 @@ "node": ">=0.10.0" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, "node_modules/path-scurry": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", @@ -5968,19 +5653,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/rechoir": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz", - "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve": "^1.9.0" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/regenerate": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", @@ -6088,43 +5760,6 @@ "dev": true, "license": "MIT" }, - "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", @@ -6228,52 +5863,6 @@ "dev": true, "license": "ISC" }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "license": "MIT", - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shallow-clone/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/side-channel": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", @@ -7032,78 +6621,6 @@ } } }, - "node_modules/webpack-cli": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "cross-spawn": "^7.0.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "@webpack-cli/migrate": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-cli/node_modules/webpack-merge": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz", - "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/webpack-merge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", @@ -7137,13 +6654,6 @@ "which": "bin/which" } }, - "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true, - "license": "MIT" - }, "node_modules/workerpool": { "version": "10.0.3", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-10.0.3.tgz", diff --git a/package.json b/package.json index 3d49e54b2..4cdc5960c 100644 --- a/package.json +++ b/package.json @@ -76,8 +76,7 @@ "oxlint-tsgolint": "^7.0.2001", "prettier": "^3.9.6", "typescript": "^7.1.0-beta", - "webpack": "^5.74.0", - "webpack-cli": "^4.10.0" + "webpack": "^5.74.0" }, "peerDependencies": { "loader-utils": "*", diff --git a/test/comparison-tests/README.md b/test/comparison-tests/README.md index 698a08247..7dfa480b9 100644 --- a/test/comparison-tests/README.md +++ b/test/comparison-tests/README.md @@ -26,7 +26,7 @@ module.exports = { ``` -You can run all the tests in the Comparison Test Pack with `npm run comparison-tests`. You can also go into an individual test directory and manually build a project using `webpack` or `webpack --watch`. This can be useful both when developing the test and also when fixing an issue or adding a feature. +You can run all the tests in the Comparison Test Pack with `npm run comparison-tests`. You can also go into an individual test directory and manually build a project using `npx webpack-cli` or `npx webpack-cli --watch` (webpack-cli is no longer a devDependency, so `npx` fetches it). This can be useful both when developing the test and also when fixing an issue or adding a feature. Each test should have an `expectedOutput` directory which contains any webpack filesystem output (typically `bundle.js` and possibly `bundle.js.map`) and any console output. stdout should go in `output.txt` and stderr should go in `err.txt`. diff --git a/test/execution-tests/run-tests.js b/test/execution-tests/run-tests.js index 2e7f98b33..cfb515168 100644 --- a/test/execution-tests/run-tests.js +++ b/test/execution-tests/run-tests.js @@ -174,9 +174,9 @@ function runTests(testName) { passingTests.push(testName); } else { console.log('running webpack compilation'); - var webpackPath = path.resolve(__dirname, '../../node_modules/webpack/bin/webpack.js'); - var program = debug ? 'node --inspect-brk=5858 ' + webpackPath : 'webpack'; - execSync(`${program} --bail`, { cwd: testPath, stdio: 'inherit' }); + var runWebpackPath = path.join(__dirname, 'run-webpack.js'); + var program = debug ? 'node --inspect-brk=5858 ' : 'node '; + execSync(program + JSON.stringify(runWebpackPath), { cwd: testPath, stdio: 'inherit' }); passingTests.push(testName); } } diff --git a/test/execution-tests/run-webpack.js b/test/execution-tests/run-webpack.js new file mode 100644 index 000000000..b2ebd89ca --- /dev/null +++ b/test/execution-tests/run-webpack.js @@ -0,0 +1,21 @@ +'use strict'; + +// Builds the webpack.config.js in the current directory once, like `webpack --bail`, +// so the execution tests don't need webpack-cli. Exits with 1 if the build has errors. +var path = require('path'); +var webpack = require('webpack'); + +var config = require(path.resolve('webpack.config.js')); +config.bail = true; + +webpack(config, function (err, stats) { + if (err) { + console.error(err); + process.exitCode = 1; + return; + } + console.log(stats.toString({ colors: true })); + if (stats.hasErrors()) { + process.exitCode = 1; + } +}); From 948430edabe8ed0eaf39553d2bd84fde9fb16930 Mon Sep 17 00:00:00 2001 From: johnnyreilly Date: Sat, 7 Nov 2026 11:36:20 +0000 Subject: [PATCH 09/27] chore: remove the Dockerfile and docker scripts The Dockerfile was built on node:18 (ts-loader needs Node 22+) with outdated Chrome install steps, and nothing else used it. The test-probe workflow and CI already cover running the tests on Linux. Also remove .dockerignore (only used by this Dockerfile; the devcontainer builds from its own folder) and their .npmignore entries. Co-Authored-By: Claude Opus 5.5 --- .dockerignore | 6 ------ .npmignore | 2 -- Dockerfile | 41 ----------------------------------------- package.json | 2 -- 4 files changed, 51 deletions(-) delete mode 100644 .dockerignore delete mode 100644 Dockerfile diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index 58769291d..000000000 --- a/.dockerignore +++ /dev/null @@ -1,6 +0,0 @@ -.devcontainer -.github -.vscode -.test -node_modules -examples diff --git a/.npmignore b/.npmignore index 98f5dbc6b..47478965c 100644 --- a/.npmignore +++ b/.npmignore @@ -6,12 +6,10 @@ test src .pnpm-store .github -.dockerignore .gitattributes .travis.yml appveyor.yml CONTRIBUTING.md -Dockerfile HISTORY.md RELEASING.md *.js.map diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 6211c66e1..000000000 --- a/Dockerfile +++ /dev/null @@ -1,41 +0,0 @@ -FROM node:18 - -# See https://crbug.com/795759 -RUN apt-get update && apt-get install -yq libgconf-2-4 - -# Install latest chrome dev package and fonts to support major charsets (Chinese, Japanese, Arabic, Hebrew, Thai and a few others) -# Note: this installs the necessary libs to make the bundled version of Chromium that Puppeteer -# installs, work. -RUN apt-get update && apt-get install -y wget --no-install-recommends \ - && wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \ - && sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' \ - && apt-get update \ - && apt-get install -y google-chrome-unstable fonts-ipafont-gothic fonts-wqy-zenhei fonts-thai-tlwg fonts-kacst fonts-freefont-ttf \ - --no-install-recommends \ - && rm -rf /var/lib/apt/lists/* \ - && apt-get purge --auto-remove -y curl \ - && rm -rf /src/*.deb - -WORKDIR /TypeStrong/ts-loader -COPY .git /TypeStrong/ts-loader/.git - -# install packages -COPY package.json package-lock.json index.js /TypeStrong/ts-loader/ -RUN npm ci - -# build -COPY src /TypeStrong/ts-loader/src -RUN npm run build - -# test -COPY test /TypeStrong/ts-loader/test - -# build and run tests with: -# docker build -t ts-loader . -# docker run -it ts-loader npm test - -# regenerate comparison-tests with: -# docker build -t ts-loader . -# docker run -v $(pwd):/TypeStrong/ts-loader -it ts-loader npm ci -# docker run -v $(pwd):/TypeStrong/ts-loader -it ts-loader npm run build -# docker run -v $(pwd):/TypeStrong/ts-loader -it ts-loader npm run comparison-tests -- --save-output diff --git a/package.json b/package.json index 4cdc5960c..fba405ca9 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,6 @@ "test": "git clean -xfd test/comparison-tests && git clean -xfd test/execution-tests && node test/run-tests.js", "benchmark": "node test/benchmark-tests/run-benchmark.mts", "clean": "git clean -xfd test/comparison-tests && git clean -xfd test/execution-tests", - "docker:build": "docker build -t ts-loader .", - "postdocker:build": "docker run -it ts-loader npm test", "knip": "knip" }, "repository": { From 055fc14433487fa090f1fc1d2e35d13cbb687100 Mon Sep 17 00:00:00 2001 From: johnnyreilly Date: Sat, 7 Nov 2026 11:52:26 +0000 Subject: [PATCH 10/27] chore: remove stale devcontainer --- .devcontainer/Dockerfile | 40 --------------------------------- .devcontainer/devcontainer.json | 32 -------------------------- 2 files changed, 72 deletions(-) delete mode 100644 .devcontainer/Dockerfile delete mode 100644 .devcontainer/devcontainer.json diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile deleted file mode 100644 index 041d8d9a4..000000000 --- a/.devcontainer/Dockerfile +++ /dev/null @@ -1,40 +0,0 @@ -#------------------------------------------------------------------------------------------------------------- -# Based on: -# https://github.com/microsoft/vscode-dev-containers/tree/v0.122.1/containers/typescript-node-14/.devcontainer/Dockerfile -#------------------------------------------------------------------------------------------------------------- - -FROM mcr.microsoft.com/vscode/devcontainers/javascript-node:18 - -# The javascript-node image includes a non-root node user with sudo access. Use -# the "remoteUser" property in devcontainer.json to use it. On Linux, the container -# user's GID/UIDs will be updated to match your local UID/GID when using the image -# or dockerFile property. Update USER_UID/USER_GID below if you are using the -# dockerComposeFile property or want the image itself to start with different ID -# values. See https://aka.ms/vscode-remote/containers/non-root-user for details. -ARG USERNAME=node -ARG USER_UID=1000 -ARG USER_GID=$USER_UID - -# Alter node user as needed. eslint is installed by javascript image -RUN if [ "$USER_GID" != "1000" ] || [ "$USER_UID" != "1000" ]; then \ - groupmod --gid $USER_GID $USERNAME \ - && usermod --uid $USER_UID --gid $USER_GID $USERNAME \ - && chmod -R $USER_UID:$USER_GID /home/$USERNAME \ - && chmod -R $USER_UID:root /usr/local/share/nvm /usr/local/share/npm-global; \ - fi - -# Set the Chrome repo. -RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \ - && echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list - -# Install Chrome. -RUN apt-get update && apt-get -y install google-chrome-stable \ - && rm -rf /var/lib/apt/lists/* - - -# ** [Optional] Uncomment this section to install additional packages. ** -# -# RUN apt-get update \ -# && export DEBIAN_FRONTEND=noninteractive \ -# && apt-get -y install --no-install-recommends - diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json deleted file mode 100644 index bdedbee4c..000000000 --- a/.devcontainer/devcontainer.json +++ /dev/null @@ -1,32 +0,0 @@ -// For format details, see https://aka.ms/vscode-remote/devcontainer.json or this file's README at: -// https://github.com/microsoft/vscode-dev-containers/tree/v0.122.1/containers/typescript-node-14 -{ - "name": "ts-loader devcontainer", - "dockerFile": "Dockerfile", - - // Set *default* container specific settings.json values on container create. - "settings": { - "terminal.integrated.profiles.linux": { - "zsh": { - "path": "/bin/zsh", - "icon": "terminal-bash" - } - }, - "terminal.integrated.defaultProfile.linux": "zsh", - }, - - // Add the IDs of extensions you want installed when the container is created. - "extensions": [ - "oxc.oxc-vscode", - "esbenp.prettier-vscode" - ], - - // Use 'forwardPorts' to make a list of ports inside the container available locally. - "forwardPorts": [/* for debugging execution tests */ 9876], - - // Use 'postCreateCommand' to run commands after the container is created. - "postCreateCommand": "npm ci", - - // Uncomment to connect as a non-root user. See https://aka.ms/vscode-remote/containers/non-root. - // "remoteUser": "node" -} \ No newline at end of file From e858f3ad511fe6cd5cac20c33e07481fdb2dbdb9 Mon Sep 17 00:00:00 2001 From: johnnyreilly Date: Sat, 7 Nov 2026 12:04:51 +0000 Subject: [PATCH 11/27] chore: address review feedback on the test helpers - run-webpack.js accepts the same config shapes as webpack-cli: an object, an array, a function (called with webpack-cli's env) or a Promise. - run-tests.js runs it with execFileSync, so no shell quoting or doubled backslashes on Windows. - listFiles skips a broken symlink, or a file deleted mid-listing, instead of crashing the run, and uses the repo's pathExists helper. Co-Authored-By: Claude Opus 5.5 --- .../create-and-execute-test.js | 20 ++++++++++-- test/execution-tests/run-tests.js | 6 ++-- test/execution-tests/run-webpack.js | 31 ++++++++++++------- 3 files changed, 40 insertions(+), 17 deletions(-) diff --git a/test/comparison-tests/create-and-execute-test.js b/test/comparison-tests/create-and-execute-test.js index 8787d025a..a2601027b 100644 --- a/test/comparison-tests/create-and-execute-test.js +++ b/test/comparison-tests/create-and-execute-test.js @@ -378,7 +378,7 @@ function compareFiles(paths, test, patch) { * are included. */ function listFiles(dir, { includeDotFiles = true } = {}) { - if (!fs.existsSync(dir)) { + if (!pathExists(dir)) { return []; } return fs.readdirSync(dir, { recursive: true }) @@ -386,11 +386,25 @@ function listFiles(dir, { includeDotFiles = true } = {}) { .filter(function (file) { return includeDotFiles || !file.split('/').some(function (part) { return part.startsWith('.'); }); }) - // statSync follows symlinks, so a symlinked file still counts as a file - .filter(function (file) { return fs.statSync(path.join(dir, file)).isFile(); }) + .filter(function (file) { return isFile(path.join(dir, file)); }) .sort(function (a, b) { return a.localeCompare(b, 'en'); }); } +/** + * statSync follows symlinks, so a symlinked file counts as a file. A broken + * symlink, or a file deleted mid-listing, is skipped rather than crashing the run. + * + * @param {string} filePath + * @returns {boolean} + */ +function isFile(filePath) { + try { + return fs.statSync(filePath).isFile(); + } catch { + return false; + } +} + /** * A patch file named `.__deleted__` deletes `` from the staged * test, since copying a patch over it can otherwise only add or overwrite diff --git a/test/execution-tests/run-tests.js b/test/execution-tests/run-tests.js index cfb515168..deeff6e62 100644 --- a/test/execution-tests/run-tests.js +++ b/test/execution-tests/run-tests.js @@ -4,6 +4,7 @@ var fs = require('fs'); var path = require('path'); var execSync = require('child_process').execSync; +var execFileSync = require('child_process').execFileSync; var typescript = require('typescript'); var webpack = require('webpack'); var pathExists = require('../pathExists'); @@ -174,9 +175,8 @@ function runTests(testName) { passingTests.push(testName); } else { console.log('running webpack compilation'); - var runWebpackPath = path.join(__dirname, 'run-webpack.js'); - var program = debug ? 'node --inspect-brk=5858 ' : 'node '; - execSync(program + JSON.stringify(runWebpackPath), { cwd: testPath, stdio: 'inherit' }); + var nodeArgs = debug ? ['--inspect-brk=5858'] : []; + execFileSync(process.execPath, nodeArgs.concat(path.join(__dirname, 'run-webpack.js')), { cwd: testPath, stdio: 'inherit' }); passingTests.push(testName); } } diff --git a/test/execution-tests/run-webpack.js b/test/execution-tests/run-webpack.js index b2ebd89ca..50397aba4 100644 --- a/test/execution-tests/run-webpack.js +++ b/test/execution-tests/run-webpack.js @@ -2,20 +2,29 @@ // Builds the webpack.config.js in the current directory once, like `webpack --bail`, // so the execution tests don't need webpack-cli. Exits with 1 if the build has errors. +// Like webpack-cli, the config can export an object, an array, a function or a Promise. var path = require('path'); var webpack = require('webpack'); -var config = require(path.resolve('webpack.config.js')); -config.bail = true; +var exported = require(path.resolve('webpack.config.js')); +var env = { WEBPACK_BUNDLE: true, WEBPACK_BUILD: true }; -webpack(config, function (err, stats) { - if (err) { +Promise.resolve(typeof exported === 'function' ? exported(env, { env: env }) : exported) + .then(function (config) { + (Array.isArray(config) ? config : [config]).forEach(function (c) { c.bail = true; }); + webpack(config, function (err, stats) { + if (err) { + console.error(err); + process.exitCode = 1; + return; + } + console.log(stats.toString({ colors: true })); + if (stats.hasErrors()) { + process.exitCode = 1; + } + }); + }) + .catch(function (err) { console.error(err); process.exitCode = 1; - return; - } - console.log(stats.toString({ colors: true })); - if (stats.hasErrors()) { - process.exitCode = 1; - } -}); + }); From fb97b918ed90b1c309ae4f4855b07056635085f9 Mon Sep 17 00:00:00 2001 From: johnnyreilly Date: Sat, 7 Nov 2026 12:05:58 +0000 Subject: [PATCH 12/27] chore: drop the .devcontainer entry from .npmignore The folder was removed, so the entry no longer does anything. Co-Authored-By: Claude Opus 5.5 --- .npmignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.npmignore b/.npmignore index 47478965c..c3cfb42f0 100644 --- a/.npmignore +++ b/.npmignore @@ -1,4 +1,3 @@ -.devcontainer .vscode .test examples From 9d7b0bdc864983bb054e156324c0cc78dc39cf6b Mon Sep 17 00:00:00 2001 From: johnnyreilly Date: Sat, 7 Nov 2026 12:11:40 +0000 Subject: [PATCH 13/27] chore: respect the config's stats setting in run-webpack.js Like webpack-cli, print stats using each config's own `stats` setting, with colors only when stdout is a terminal unless the config says otherwise. Co-Authored-By: Claude Opus 5.5 --- test/execution-tests/run-webpack.js | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/test/execution-tests/run-webpack.js b/test/execution-tests/run-webpack.js index 50397aba4..c705954d6 100644 --- a/test/execution-tests/run-webpack.js +++ b/test/execution-tests/run-webpack.js @@ -18,7 +18,13 @@ Promise.resolve(typeof exported === 'function' ? exported(env, { env: env }) : e process.exitCode = 1; return; } - console.log(stats.toString({ colors: true })); + var options = stats.stats + ? { children: stats.stats.map(function (s) { return statsOptions(s.compilation); }) } + : statsOptions(stats.compilation); + var output = stats.toString(options); + if (output) { + console.log(output); + } if (stats.hasErrors()) { process.exitCode = 1; } @@ -28,3 +34,16 @@ Promise.resolve(typeof exported === 'function' ? exported(env, { env: env }) : e console.error(err); process.exitCode = 1; }); + +/** + * The config's own `stats` setting, as webpack-cli uses it: colors only when + * stdout is a terminal, unless the config says otherwise. + */ +function statsOptions(compilation) { + var stats = compilation.compiler.options.stats; + // webpack 4 keeps presets like 'errors-only' as strings; webpack 5 normalises them to objects + if (typeof stats !== 'object' || stats === null) { + return stats; + } + return Object.assign({ colors: !!process.stdout.isTTY }, stats); +} From ff1d8a8587de9b1f5a4112fa9591d9e21077f450 Mon Sep 17 00:00:00 2001 From: johnnyreilly Date: Sat, 7 Nov 2026 13:00:13 +0000 Subject: [PATCH 14/27] chore: remove the unused --extra-option test argument Nothing passed it: run-tests.js only sends --test-to-run and --save-output. Co-Authored-By: Claude Opus 5.5 --- test/comparison-tests/create-and-execute-test.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/test/comparison-tests/create-and-execute-test.js b/test/comparison-tests/create-and-execute-test.js index a2601027b..4e33bf830 100644 --- a/test/comparison-tests/create-and-execute-test.js +++ b/test/comparison-tests/create-and-execute-test.js @@ -16,7 +16,6 @@ const { values: args } = parseArgs({ args: process.argv.slice(2), options: { 'test-to-run': { type: 'string' }, - 'extra-option': { type: 'string' }, 'save-output': { type: 'boolean' }, }, strict: false, @@ -29,7 +28,6 @@ const testToRun = args['test-to-run']; if (typeof testToRun !== 'string') { throw new Error('Pass the test to run with --test-to-run='); } -const extraOption = typeof args['extra-option'] === 'string' ? args['extra-option'] : undefined; if (saveOutputMode) { console.log('Will save output as --save-output was supplied...'); @@ -56,7 +54,7 @@ if (fs.statSync(testPath).isDirectory() && !testIsIgnored) { // @ts-ignore - describe(`${testToRun}${extraOption ? ` - ${extraOption}: true` : ''}`, function () { + describe(testToRun, function () { // @ts-ignore it('should have the correct output', createTest(testToRun, testPath, {})); @@ -166,11 +164,10 @@ function createWebpackConfig(paths, optionsOriginal) { paths.outputPath = path.join(paths.testStagingPath, subFolder); } - const extraOptionMaybe = extraOption ? { [extraOption]: true } : {}; const options = Object.assign({ // colors: false, silent: true - }, optionsOriginal, extraOptionMaybe); + }, optionsOriginal); const tsLoaderPath = path.join(__dirname, "../../index.js"); aliasLoader(config, tsLoaderPath, options); From 74d8dbd01f6da894bc30b6ea34c8f3c30ab11abe Mon Sep 17 00:00:00 2001 From: johnnyreilly Date: Sat, 7 Nov 2026 13:02:47 +0000 Subject: [PATCH 15/27] chore: var to const --- test/execution-tests/run-tests.js | 77 +++++++++++++++---------------- 1 file changed, 38 insertions(+), 39 deletions(-) diff --git a/test/execution-tests/run-tests.js b/test/execution-tests/run-tests.js index deeff6e62..12271e2ab 100644 --- a/test/execution-tests/run-tests.js +++ b/test/execution-tests/run-tests.js @@ -1,31 +1,30 @@ 'use strict'; -// var Server = require('karma').Server; -var fs = require('fs'); -var path = require('path'); -var execSync = require('child_process').execSync; -var execFileSync = require('child_process').execFileSync; -var typescript = require('typescript'); -var webpack = require('webpack'); -var pathExists = require('../pathExists'); +const fs = require('fs'); +const path = require('path'); +const execSync = require('child_process').execSync; +const execFileSync = require('child_process').execFileSync; +const typescript = require('typescript'); +const webpack = require('webpack'); +const pathExists = require('../pathExists'); process.env.NODE_ENV = 'test'; // Parse command line arguments -var indexOfSingleTest = process.argv.indexOf('--single-test'); -var singleTestToRun = indexOfSingleTest !== -1 && process.argv[indexOfSingleTest + 1]; -var watch = process.argv.indexOf('--watch') !== -1 && !!singleTestToRun; +const indexOfSingleTest = process.argv.indexOf('--single-test'); +const singleTestToRun = indexOfSingleTest !== -1 && process.argv[indexOfSingleTest + 1]; +const watch = process.argv.indexOf('--watch') !== -1 && !!singleTestToRun; const indexOfTestCriteria = process.argv.indexOf('--match-test'); const testCriteria = indexOfTestCriteria !== -1 && new RegExp(process.argv[indexOfTestCriteria + 1]); -var passingTests = []; -var failingTests = []; +const passingTests = []; +const failingTests = []; -var start = new Date().getTime(); +const start = new Date().getTime(); console.log('Starting to run test suites...\n'); -var testDir = __dirname; +const testDir = __dirname; if (singleTestToRun) { runTests(singleTestToRun); @@ -46,7 +45,7 @@ else { .forEach(runTests); } -var end = new Date().getTime(); +const end = new Date().getTime(); console.log('\n-------------------------------------------------------------------------\n'); console.log((passingTests.length + failingTests.length) + ' test suites took ' + ((end - start) / 1000) + ' seconds to run.\n'); if (passingTests.length > 0) { @@ -64,25 +63,25 @@ else { // -------------------------------------------------------------- function isTestDirectory (testName) { - var testPath = path.join(testDir, testName); + const testPath = path.join(testDir, testName); return fs.statSync(testPath).isDirectory(); } function isHighEnoughTypeScriptVersion (testName) { - var minTsVersionAndTestName = testName.split('_'); + const minTsVersionAndTestName = testName.split('_'); if (minTsVersionAndTestName.length === 2) { - var minTsVersion = minTsVersionAndTestName[0]; + const minTsVersion = minTsVersionAndTestName[0]; if (isLowerVersion(typescript.version, minTsVersion)) { console.log('Skipping test ' + testName + ' as its minimum version of ' + minTsVersion + ' is greater than our current version of TypeScript: ' + typescript.version); return false; } } else if (minTsVersionAndTestName.length === 3) { - var minTsVersion = minTsVersionAndTestName[0]; + const minTsVersion = minTsVersionAndTestName[0]; if (isLowerVersion(typescript.version, minTsVersion)) { console.log('Skipping test ' + testName + ' as its minimum version of ' + minTsVersion + ' is greater than our current version of TypeScript: ' + typescript.version); return false; } - var minWebpackVersion = minTsVersionAndTestName[1]; + const minWebpackVersion = minTsVersionAndTestName[1]; if (isLowerVersion(webpack.version, minWebpackVersion)) { console.log('Skipping test ' + testName + ' as its minimum version of ' + minWebpackVersion + ' is greater than our current version of webpack: ' + webpack.version); return false; @@ -93,9 +92,9 @@ function isHighEnoughTypeScriptVersion (testName) { /** Compares major.minor.patch only; prerelease tags like `-beta` are ignored. */ function isLowerVersion (version, minVersion) { - var actual = version.split('-')[0].split('.').map(Number); - var minimum = minVersion.split('.').map(Number); - for (var i = 0; i < 3; i++) { + const actual = version.split('-')[0].split('.').map(Number); + const minimum = minVersion.split('.').map(Number); + for (let i = 0; i < 3; i++) { if ((actual[i] || 0) !== (minimum[i] || 0)) { return (actual[i] || 0) < (minimum[i] || 0); } @@ -105,7 +104,7 @@ function isLowerVersion (version, minVersion) { /** Temporarily exclude loaderOptions until custom transformers work with the default native API path */ function isNotLoaderOptionsTest (testName) { - var isLoaderOptionsTest = testName === 'loaderOptions'; + const isLoaderOptionsTest = testName === 'loaderOptions'; if (isLoaderOptionsTest) { console.log('Skipping test ' + testName + ' while the default native API path does not yet support its custom transformer coverage.'); return false; @@ -115,7 +114,7 @@ function isNotLoaderOptionsTest (testName) { /** Temporarily exclude Babel dependent tests */ function isNotBabelTest (testName) { - var isBabelTest = testName.includes('babel'); + const isBabelTest = testName.includes('babel'); if (isBabelTest) { console.log('Skipping test ' + testName + ' as it requires babel. Dropping these tests until babel-loader support for webpack for is in place.'); return false; @@ -124,16 +123,16 @@ function isNotBabelTest (testName) { } function getTestNameFromPath (testNameOrPath) { - var tsLoaderPath = path.resolve(__dirname, '../..'); - var tsLoaderBasename = path.basename(tsLoaderPath); - var executionTestsRelativeRoot = path.relative(tsLoaderPath, __dirname); - var executionTestsAbsoluteRoot = path.join(tsLoaderPath, executionTestsRelativeRoot); + const tsLoaderPath = path.resolve(__dirname, '../..'); + const tsLoaderBasename = path.basename(tsLoaderPath); + const executionTestsRelativeRoot = path.relative(tsLoaderPath, __dirname); + const executionTestsAbsoluteRoot = path.join(tsLoaderPath, executionTestsRelativeRoot); // It wasn’t a path in execution-tests; assume it was a test name if (testNameOrPath.indexOf(path.join(tsLoaderBasename, executionTestsRelativeRoot)) === -1) { return testNameOrPath; } // E.g. 3.0.1_projectReferences/lib/index.ts - var testPathRelativeToExecutionTests = path.relative(executionTestsAbsoluteRoot, testNameOrPath); + const testPathRelativeToExecutionTests = path.relative(executionTestsAbsoluteRoot, testNameOrPath); return testPathRelativeToExecutionTests.split(path.sep)[0]; } @@ -142,7 +141,7 @@ function runTests(testName) { console.log('\n-------------------------------------------------------------------------\n'); console.log('RUNNING THIS TEST SUITE: ' + testName +'\n\n'); - var testPath = path.join(testDir, testName); + const testPath = path.join(testDir, testName); if (!pathExists(testPath)) { console.log('TEST DOES NOT EXIST AT THIS LOCATION: ' + testPath); @@ -150,8 +149,8 @@ function runTests(testName) { return; } - var karmaConfPath = path.join(testPath, 'karma.conf.js'); - var debug = process.argv.indexOf('--debug') > -1; + const karmaConfPath = path.join(testPath, 'karma.conf.js'); + const debug = process.argv.indexOf('--debug') > -1; if (pathExists(path.join(testPath, 'pnpm-lock.yaml'))) { console.log('npm install -g pnpm into ' + testPath); @@ -167,20 +166,20 @@ function runTests(testName) { try { if (pathExists(karmaConfPath)) { - var karmaPath = path.resolve(__dirname, '../../node_modules/karma/bin/karma'); - var singleRunOrWatch = watch ? '' : ' --single-run'; - var program = debug ? 'node --inspect-brk=5858 ' + karmaPath : 'karma'; + const karmaPath = path.resolve(__dirname, '../../node_modules/karma/bin/karma'); + const singleRunOrWatch = watch ? '' : ' --single-run'; + const program = debug ? 'node --inspect-brk=5858 ' + karmaPath : 'karma'; execSync(program + ' start --reporters mocha' + singleRunOrWatch + ' --browsers ChromeHeadlessNoSandbox', { cwd: testPath, stdio: 'inherit' }); passingTests.push(testName); } else { console.log('running webpack compilation'); - var nodeArgs = debug ? ['--inspect-brk=5858'] : []; + const nodeArgs = debug ? ['--inspect-brk=5858'] : []; execFileSync(process.execPath, nodeArgs.concat(path.join(__dirname, 'run-webpack.js')), { cwd: testPath, stdio: 'inherit' }); passingTests.push(testName); } } - catch (err) { + catch (_err) { failingTests.push(testName); } } From 58ccbcdfce465fafee9398857ada66f3db91a712 Mon Sep 17 00:00:00 2001 From: johnnyreilly Date: Sat, 7 Nov 2026 13:21:27 +0000 Subject: [PATCH 16/27] chore: use --test-to-run= in the allowed mocha commands Mocha 12 treats a separate value as a spec file, so match the form the comparison test runner now uses. Co-Authored-By: Claude Opus 5.5 --- .claude/settings.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.claude/settings.json b/.claude/settings.json index 4c4d84c45..5123f4db7 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -30,8 +30,8 @@ "Bash(grep *)", "Read(//usr/local/lib/node_modules/**)", "Bash(rm -rf .test)", - "Bash(FORCE_COLOR=1 node node_modules/mocha/bin/mocha.js test/comparison-tests/create-and-execute-test.js --reporter spec --test-to-run * --timeout 25000)", - "Bash(node node_modules/mocha/bin/mocha.js test/comparison-tests/create-and-execute-test.js --reporter spec --test-to-run * --timeout 25000)", + "Bash(FORCE_COLOR=1 node node_modules/mocha/bin/mocha.js test/comparison-tests/create-and-execute-test.js --reporter spec --test-to-run=* --timeout 25000)", + "Bash(node node_modules/mocha/bin/mocha.js test/comparison-tests/create-and-execute-test.js --reporter spec --test-to-run=* --timeout 25000)", "Bash(echo \"PID $!\")" ] } From 39b155c6a89a38f52369de7f4de048b745d8f726 Mon Sep 17 00:00:00 2001 From: johnnyreilly Date: Sat, 7 Nov 2026 13:21:27 +0000 Subject: [PATCH 17/27] chore: use arrow functions for callbacks in create-and-execute-test.js Named functions stay as declarations, and the test function createTest returns stays a `function` because it uses mocha's `this.timeout`. Co-Authored-By: Claude Opus 5.5 --- .../create-and-execute-test.js | 62 +++++++++---------- 1 file changed, 28 insertions(+), 34 deletions(-) diff --git a/test/comparison-tests/create-and-execute-test.js b/test/comparison-tests/create-and-execute-test.js index 4e33bf830..3bc883ae0 100644 --- a/test/comparison-tests/create-and-execute-test.js +++ b/test/comparison-tests/create-and-execute-test.js @@ -54,7 +54,7 @@ if (fs.statSync(testPath).isDirectory() && !testIsIgnored) { // @ts-ignore - describe(testToRun, function () { + describe(testToRun, () => { // @ts-ignore it('should have the correct output', createTest(testToRun, testPath, {})); @@ -185,7 +185,7 @@ function createWebpackConfig(paths, optionsOriginal) { } function createWebpackWatchHandler(done, paths, testState, options, test) { - return function (err, stats) { + return (err, stats) => { if (testState.doneHasBeenCalled) { return; } @@ -246,7 +246,7 @@ function storeStats(stats, testState, paths) { // do a little magic to normalize `\` to `/` for asset output const newAssets = {}; - Object.keys(stats.compilation.assets).forEach(function (asset) { + Object.keys(stats.compilation.assets).forEach((asset) => { if (stats.compilation.assets[asset].size()) { const diskAssetPath = path.join(paths.outputPath, asset); const newPath = path.join(paths.actualOutput, path.relative(paths.testStagingPath, diskAssetPath)); @@ -291,16 +291,16 @@ function compareFiles(paths, test, patch) { if (saveOutputMode) { const actualFiles = listFiles(paths.actualOutput); const expectedFiles = listFiles(paths.originalExpectedOutput) - .filter(function (file) { return !file.startsWith('patch'); }); + .filter((file) => !file.startsWith('patch')); const allFiles = {}; - actualFiles.forEach(function (file) { allFiles[file] = true }); - expectedFiles.forEach(function (file) { + actualFiles.forEach((file) => { allFiles[file] = true; }); + expectedFiles.forEach((file) => { if (!allFiles.hasOwnProperty(file)) { fs.rmSync(path.join(paths.originalExpectedOutput, file), { recursive: true, force: true }); } }); - Object.keys(allFiles).forEach(function (file) { + Object.keys(allFiles).forEach((file) => { // const actual = getNormalisedFileContent(file, paths.actualOutput); // const expected = getNormalisedFileContent(file, paths.expectedOutput); @@ -314,12 +314,12 @@ function compareFiles(paths, test, patch) { // compare actual to expected const actualFiles = listFiles(paths.actualOutput), expectedFiles = listFiles(paths.expectedOutput) - .filter(function (file) { return !file.startsWith('patch'); }), + .filter((file) => !file.startsWith('patch')), allFiles = {}; - actualFiles.forEach(function (file) { allFiles[file] = true }); - expectedFiles.forEach(function (file) { allFiles[file] = true }); - Object.keys(allFiles).forEach(function (file) { + actualFiles.forEach((file) => { allFiles[file] = true; }); + expectedFiles.forEach((file) => { allFiles[file] = true; }); + Object.keys(allFiles).forEach((file) => { // vue-loader's webpack5 pitching mechanism re-requests each SFC // block (script/template) through the full loader chain, and // which of the resulting "pitching" vs "final" modules webpack @@ -379,12 +379,10 @@ function listFiles(dir, { includeDotFiles = true } = {}) { return []; } return fs.readdirSync(dir, { recursive: true }) - .map(function (file) { return file.split(path.sep).join('/'); }) - .filter(function (file) { - return includeDotFiles || !file.split('/').some(function (part) { return part.startsWith('.'); }); - }) - .filter(function (file) { return isFile(path.join(dir, file)); }) - .sort(function (a, b) { return a.localeCompare(b, 'en'); }); + .map((file) => file.split(path.sep).join('/')) + .filter((file) => includeDotFiles || !file.split('/').some((part) => part.startsWith('.'))) + .filter((file) => isFile(path.join(dir, file))) + .sort((a, b) => a.localeCompare(b, 'en')); } /** @@ -409,7 +407,7 @@ function isFile(filePath) { */ function applyPatchDeletions(patchPath, testStagingPath) { const deletedSuffix = '.__deleted__'; - for (const marker of listFiles(patchPath).filter(function (file) { return file.endsWith(deletedSuffix); })) { + for (const marker of listFiles(patchPath).filter((file) => file.endsWith(deletedSuffix))) { fs.rmSync(path.join(testStagingPath, marker.slice(0, -deletedSuffix.length)), { force: true }); fs.rmSync(path.join(testStagingPath, marker), { force: true }); } @@ -422,13 +420,13 @@ function copyPatchOrEndTest(testStagingPath, watcher, testState, done) { testState.iteration++; // can get inconsistent results if copying right away // Probably due to the reaons in PR 1109: https://github.com/TypeStrong/ts-loader/pull/1109 - setTimeout(function () { + setTimeout(() => { copySync(patchPath, testStagingPath); applyPatchDeletions(patchPath, testStagingPath); }, 1000); } else { - watcher.close(function () { + watcher.close(() => { // done is occasionally called twice for no known reason // when this happens the build fails with "Error: done() called multiple times" - not a meaningful failure if (!testState.doneHasBeenCalled) { @@ -447,7 +445,7 @@ function copyPatchOrEndTest(testStagingPath, watcher, testState, done) { function cleanHashFromOutput(stats, webpackOutput) { const escapedStagingPath = stagingPath.replaceAll('\\', '\\\\'); if (stats) { - listFiles(webpackOutput, { includeDotFiles: false }).forEach(function (file) { + listFiles(webpackOutput, { includeDotFiles: false }).forEach((file) => { const content = fs.readFileSync(path.join(webpackOutput, file), 'utf-8') .split(stats.hash).join('[hash]') .replace(/\r\n/g, '\n') @@ -479,7 +477,7 @@ function getNormalisedFileContent(file, location) { json.version = "FakeTsVersion"; const fileInfos = json.program && json.program.fileInfos; if (fileInfos) { - Object.keys(fileInfos).forEach(fileInfoName => { + Object.keys(fileInfos).forEach((fileInfoName) => { if (fileInfoName.indexOf("typescript") !== -1) { fileInfos[fileInfoName] = { version: fileInfoName, signature: fileInfoName, affectsGlobalScope: fileInfos[fileInfoName].affectsGlobalScope }; } @@ -506,25 +504,21 @@ function getNormalisedFileContent(file, location) { .replace(/\s+Asset\s+Size\s+Chunks\s+Chunk Names/, ' Asset Size Chunks Chunk Names') .replace(/ test\/comparison-tests\//,' /test/comparison-tests/') // Ignore 'at Object.loader (dist\index.js:32:15)' style row number / column number differences - .replace(/(\(dist[/|\\]\w*.js:)(\d*)(:)(\d*)(\))/g, function(_match, openingBracketPathAndColon, _lineNumber, colon, _columnNumber, closingBracket){ - return openingBracketPathAndColon + 'irrelevant-line-number' + colon + 'irrelevant-column-number' + closingBracket; - }) + .replace(/(\(dist[/|\\]\w*.js:)(\d*)(:)(\d*)(\))/g, (_match, openingBracketPathAndColon, _lineNumber, colon, _columnNumber, closingBracket) => + openingBracketPathAndColon + 'irrelevant-line-number' + colon + 'irrelevant-column-number' + closingBracket) // Ignore path differences in TS error output - .replace(/(TS6305:[^']+')([^']+?)([^\\/']+')([^']+')([^']+?)([^\\/']+'.*)$/gm, function(_match, messageStart, _outputFileBaseDir, outputFileName, messageMiddle, _sourceFileBaseDir, sourceFileName) { - return messageStart + outputFileName + messageMiddle + sourceFileName; - }) + .replace(/(TS6305:[^']+')([^']+?)([^\\/']+')([^']+')([^']+?)([^\\/']+'.*)$/gm, (_match, messageStart, _outputFileBaseDir, outputFileName, messageMiddle, _sourceFileBaseDir, sourceFileName) => + messageStart + outputFileName + messageMiddle + sourceFileName) // TS18003's "No inputs were found in config file '...'" embeds // whatever config file identifier the compiler was opened // with, which can differ in path depth between platforms; // only the file name itself is meaningful for the test. - .replace(/(TS18003: No inputs were found in config file ')([^']*?)([^\\/']+')/g, function(_match, messageStart, _baseDir, fileNameAndQuote) { - return messageStart + fileNameAndQuote; - }) + .replace(/(TS18003: No inputs were found in config file ')([^']*?)([^\\/']+')/g, (_match, messageStart, _baseDir, fileNameAndQuote) => + messageStart + fileNameAndQuote) : normaliseString(originalContent)) // Ignore 'at C:/source/ts-loader/dist/index.js:90:19' style row number / column number differences - .replace(/at (.*)(dist[/|\\]\w*.js:)(\d*)(:)(\d*)/g, function(_match, _spaceAndStartOfPath, remainingPathAndColon, _lineNumber, colon, _columnNumber){ - return 'at ' + remainingPathAndColon + 'irrelevant-line-number' + colon + 'irrelevant-column-number'; - }) + .replace(/at (.*)(dist[/|\\]\w*.js:)(\d*)(:)(\d*)/g, (_match, _spaceAndStartOfPath, remainingPathAndColon, _lineNumber, colon, _columnNumber) => + 'at ' + remainingPathAndColon + 'irrelevant-line-number' + colon + 'irrelevant-column-number') // strip C:/projects/ts-loader/.test/ .replace(/([a-zA-Z]:\/)?[\w|/]*\/(ts-(loader)?|workspace)\/\.test/ig, '') // Some diagnostics (TS5055, TS6059) embed a path relative to a From 00bab3b235cd34dbf38c60983531b8effe78737a Mon Sep 17 00:00:00 2001 From: johnnyreilly Date: Sat, 7 Nov 2026 13:21:27 +0000 Subject: [PATCH 18/27] chore: add type-check scripts for the test harnesses `npm run check:comparison-tests` and `npm run check:execution-tests` type-check the harness scripts with tsc. The comparison tests' tsconfig now also covers link-test-lib.js, and the execution tests get a tsconfig covering run-tests.js and run-webpack.js. To pass, run-webpack.js types the webpack callback's stats as Stats or MultiStats, treats missing stats as a failed build, and uses const; and an unused catch binding in the comparison run-tests.js is renamed _err. Co-Authored-By: Claude Opus 5.5 --- package.json | 2 ++ test/comparison-tests/run-tests.js | 2 +- test/comparison-tests/tsconfig.json | 1 + test/execution-tests/run-webpack.js | 24 ++++++++++++++---------- test/execution-tests/tsconfig.json | 17 +++++++++++++++++ 5 files changed, 35 insertions(+), 11 deletions(-) create mode 100644 test/execution-tests/tsconfig.json diff --git a/package.json b/package.json index fba405ca9..9805632be 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,8 @@ ], "scripts": { "build": "tsc --version && tsc --project \"./src\"", + "check:comparison-tests": "tsc --version && tsc --project \"./test/comparison-tests\"", + "check:execution-tests": "tsc --version && tsc --project \"./test/execution-tests\"", "format": "prettier --write \"src/**/*.*\" \"*.md\"", "format:check": "prettier --check \"src/**/*.*\" \"*.md\"", "lint": "tsc --project \"./src\" --noEmit && oxlint src", diff --git a/test/comparison-tests/run-tests.js b/test/comparison-tests/run-tests.js index 4f96885ff..22960b46c 100644 --- a/test/comparison-tests/run-tests.js +++ b/test/comparison-tests/run-tests.js @@ -194,7 +194,7 @@ function runTestAsChildProcess(testName) { { stdio: 'inherit' } ); return true; - } catch (err) { + } catch (_err) { return false; } } diff --git a/test/comparison-tests/tsconfig.json b/test/comparison-tests/tsconfig.json index e157bfbf7..d7f03f464 100644 --- a/test/comparison-tests/tsconfig.json +++ b/test/comparison-tests/tsconfig.json @@ -14,6 +14,7 @@ "copySync.js", "create-and-execute-test.js", "getProgram.js", + "link-test-lib.js", "newline.loader.js", "run-tests.js" ] diff --git a/test/execution-tests/run-webpack.js b/test/execution-tests/run-webpack.js index c705954d6..f03318663 100644 --- a/test/execution-tests/run-webpack.js +++ b/test/execution-tests/run-webpack.js @@ -3,25 +3,29 @@ // Builds the webpack.config.js in the current directory once, like `webpack --bail`, // so the execution tests don't need webpack-cli. Exits with 1 if the build has errors. // Like webpack-cli, the config can export an object, an array, a function or a Promise. -var path = require('path'); -var webpack = require('webpack'); +const path = require('path'); +const webpack = require('webpack'); -var exported = require(path.resolve('webpack.config.js')); -var env = { WEBPACK_BUNDLE: true, WEBPACK_BUILD: true }; +const exported = require(path.resolve('webpack.config.js')); +const env = { WEBPACK_BUNDLE: true, WEBPACK_BUILD: true }; Promise.resolve(typeof exported === 'function' ? exported(env, { env: env }) : exported) .then(function (config) { (Array.isArray(config) ? config : [config]).forEach(function (c) { c.bail = true; }); - webpack(config, function (err, stats) { - if (err) { - console.error(err); + webpack(config, /** + * An array of configs gives MultiStats. + * @param {Error | null | undefined} err + * @param {import('webpack').Stats | import('webpack').MultiStats | undefined} stats + */ function (err, stats) { + if (err || !stats) { + console.error(err || new Error('webpack returned no stats')); process.exitCode = 1; return; } - var options = stats.stats + const options = 'stats' in stats ? { children: stats.stats.map(function (s) { return statsOptions(s.compilation); }) } : statsOptions(stats.compilation); - var output = stats.toString(options); + const output = stats.toString(options); if (output) { console.log(output); } @@ -40,7 +44,7 @@ Promise.resolve(typeof exported === 'function' ? exported(env, { env: env }) : e * stdout is a terminal, unless the config says otherwise. */ function statsOptions(compilation) { - var stats = compilation.compiler.options.stats; + const stats = compilation.compiler.options.stats; // webpack 4 keeps presets like 'errors-only' as strings; webpack 5 normalises them to objects if (typeof stats !== 'object' || stats === null) { return stats; diff --git a/test/execution-tests/tsconfig.json b/test/execution-tests/tsconfig.json new file mode 100644 index 000000000..1f5a1d122 --- /dev/null +++ b/test/execution-tests/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "strictNullChecks": true, + "allowJs": true, + "checkJs": true, + "module": "commonjs", + "noEmit": true, + "skipLibCheck": true, + "lib": ["es2021"], + "types": ["node"], + "strict": false + }, + "files": [ + "run-webpack.js", + "run-tests.js" + ] +} \ No newline at end of file From 0f2b2b533d10550a82a55a85a4394a5602b8589c Mon Sep 17 00:00:00 2001 From: johnnyreilly Date: Sat, 7 Nov 2026 13:22:06 +0000 Subject: [PATCH 19/27] ci: type-check the test harnesses in the lint workflow Run `npm run check:comparison-tests` and `npm run check:execution-tests` after `npm run lint`, so type errors in the harness scripts fail CI. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/lint.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index ff64d9df5..3916b7c69 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -19,3 +19,9 @@ jobs: - name: lint run: npm run lint + + - name: type-check comparison test harness + run: npm run check:comparison-tests + + - name: type-check execution test harness + run: npm run check:execution-tests From 01d42016c0908e0d0a49b4c468e4bad082cf2283 Mon Sep 17 00:00:00 2001 From: johnnyreilly Date: Sat, 7 Nov 2026 13:31:42 +0000 Subject: [PATCH 20/27] chore: build src with module node20 ts-loader runs in Node, so check imports with Node's resolution rules rather than a bundler's. `module: node20` implies `moduleResolution: node16`, and emits the same CommonJS: the build output (.js, .d.ts and maps) is byte-identical. Also drop `declarationDir`, which matched `outDir`. Co-Authored-By: Claude Opus 5.5 --- src/tsconfig.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/tsconfig.json b/src/tsconfig.json index 02d857449..699706dbe 100644 --- a/src/tsconfig.json +++ b/src/tsconfig.json @@ -7,11 +7,9 @@ "noUnusedLocals": true, "noUnusedParameters": true, "strict": true, - "module": "commonjs", - "moduleResolution": "bundler", + "module": "node20", "declaration": true, "outDir": "../dist", - "declarationDir": "../dist", "declarationMap": true, "sourceMap": true, "skipLibCheck": true From 1374066b10c2a96e94999ddbd50399c43a4daa42 Mon Sep 17 00:00:00 2001 From: johnnyreilly Date: Sat, 7 Nov 2026 13:31:42 +0000 Subject: [PATCH 21/27] chore: share a tsconfig base between the test harness checks The comparison and execution test tsconfigs had identical compiler options, so move them to test/tsconfig.base.json (with lib es2022, to match src). The execution tests check now also covers test/run-tests.js and test/karmaConfig.js, which nothing type-checked before. Co-Authored-By: Claude Opus 5.5 --- test/comparison-tests/tsconfig.json | 30 ++++++++++------------------- test/execution-tests/tsconfig.json | 19 +++--------------- test/tsconfig.base.json | 13 +++++++++++++ 3 files changed, 26 insertions(+), 36 deletions(-) create mode 100644 test/tsconfig.base.json diff --git a/test/comparison-tests/tsconfig.json b/test/comparison-tests/tsconfig.json index d7f03f464..dfd2c7002 100644 --- a/test/comparison-tests/tsconfig.json +++ b/test/comparison-tests/tsconfig.json @@ -1,21 +1,11 @@ { - "compilerOptions": { - "strictNullChecks": true, - "allowJs": true, - "checkJs": true, - "module": "commonjs", - "noEmit": true, - "skipLibCheck": true, - "lib": ["es2021"], - "types": ["node"], - "strict": false - }, - "files": [ - "copySync.js", - "create-and-execute-test.js", - "getProgram.js", - "link-test-lib.js", - "newline.loader.js", - "run-tests.js" - ] -} \ No newline at end of file + "extends": "../tsconfig.base.json", + "files": [ + "copySync.js", + "create-and-execute-test.js", + "getProgram.js", + "link-test-lib.js", + "newline.loader.js", + "run-tests.js" + ] +} diff --git a/test/execution-tests/tsconfig.json b/test/execution-tests/tsconfig.json index 1f5a1d122..a12ed772c 100644 --- a/test/execution-tests/tsconfig.json +++ b/test/execution-tests/tsconfig.json @@ -1,17 +1,4 @@ { - "compilerOptions": { - "strictNullChecks": true, - "allowJs": true, - "checkJs": true, - "module": "commonjs", - "noEmit": true, - "skipLibCheck": true, - "lib": ["es2021"], - "types": ["node"], - "strict": false - }, - "files": [ - "run-webpack.js", - "run-tests.js" - ] -} \ No newline at end of file + "extends": "../tsconfig.base.json", + "files": ["../run-tests.js", "../karmaConfig.js", "run-tests.js", "run-webpack.js"] +} diff --git a/test/tsconfig.base.json b/test/tsconfig.base.json new file mode 100644 index 000000000..add973bf1 --- /dev/null +++ b/test/tsconfig.base.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "module": "commonjs", + "noEmit": true, + "skipLibCheck": true, + "lib": ["es2022"], + "types": ["node"], + "strict": false, + "strictNullChecks": true + } +} From a5b6c730ff127b341d103e934b085a296186eb12 Mon Sep 17 00:00:00 2001 From: johnnyreilly Date: Sat, 7 Nov 2026 13:31:42 +0000 Subject: [PATCH 22/27] ci: type-check the benchmark tests Add `npm run check:benchmark-tests` and run it in the lint workflow, as nothing type-checked the benchmark .mts files. Also drop `esModuleInterop` from their tsconfig, as TypeScript 7 always enables it. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/lint.yml | 3 +++ package.json | 1 + test/benchmark-tests/tsconfig.json | 19 +++++++++---------- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 3916b7c69..e6f5ef50f 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -25,3 +25,6 @@ jobs: - name: type-check execution test harness run: npm run check:execution-tests + + - name: type-check benchmark tests + run: npm run check:benchmark-tests diff --git a/package.json b/package.json index 9805632be..e6cdb4368 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ ], "scripts": { "build": "tsc --version && tsc --project \"./src\"", + "check:benchmark-tests": "tsc --version && tsc --project \"./test/benchmark-tests\"", "check:comparison-tests": "tsc --version && tsc --project \"./test/comparison-tests\"", "check:execution-tests": "tsc --version && tsc --project \"./test/execution-tests\"", "format": "prettier --write \"src/**/*.*\" \"*.md\"", diff --git a/test/benchmark-tests/tsconfig.json b/test/benchmark-tests/tsconfig.json index 6a049a5f3..c925802f2 100644 --- a/test/benchmark-tests/tsconfig.json +++ b/test/benchmark-tests/tsconfig.json @@ -1,12 +1,11 @@ { - "compilerOptions": { - "module": "nodenext", - "noEmit": true, - "allowImportingTsExtensions": true, - "esModuleInterop": true, - "skipLibCheck": true, - "lib": ["es2022"], - "types": ["node"], - "strict": true - } + "compilerOptions": { + "module": "nodenext", + "noEmit": true, + "allowImportingTsExtensions": true, + "skipLibCheck": true, + "lib": ["es2022"], + "types": ["node"], + "strict": true + } } From e9587b9a542b2885f333effadf48b67822384081 Mon Sep 17 00:00:00 2001 From: johnnyreilly Date: Sat, 7 Nov 2026 13:47:39 +0000 Subject: [PATCH 23/27] chore: remove @ts-ignore comments from the comparison test harness - Declare the mocha globals the harness uses (describe, it, and the test's `this.timeout` and `done`) in globals.d.ts, as mocha 12 ships no types and this avoids a dependency on @types/mocha. - Check for webpack() returning null (per its types) and fail the test with a clear error. - Type newline.loader.js's `this` as webpack's LoaderContext. Co-Authored-By: Claude Opus 5.5 --- test/comparison-tests/create-and-execute-test.js | 14 ++++++-------- test/comparison-tests/globals.d.ts | 13 +++++++++++++ test/comparison-tests/newline.loader.js | 7 +++++-- test/comparison-tests/tsconfig.json | 1 + 4 files changed, 25 insertions(+), 10 deletions(-) create mode 100644 test/comparison-tests/globals.d.ts diff --git a/test/comparison-tests/create-and-execute-test.js b/test/comparison-tests/create-and-execute-test.js index 3bc883ae0..f086b1aaf 100644 --- a/test/comparison-tests/create-and-execute-test.js +++ b/test/comparison-tests/create-and-execute-test.js @@ -53,9 +53,7 @@ if (fs.statSync(testPath).isDirectory() && testToRun !== 'testLib' && !testIsIgnored) { - // @ts-ignore describe(testToRun, () => { - // @ts-ignore it('should have the correct output', createTest(testToRun, testPath, {})); if (testToRun === 'declarationOutput' || @@ -68,7 +66,6 @@ if (fs.statSync(testPath).isDirectory() && testToRun === 'unbundledFileErrorsWatch' || testToRun === 'pathsAliasWatch') { return; } - // @ts-ignore it('should work with transpileOnly', createTest(testToRun, testPath, { transpileOnly: true })); }); } @@ -115,11 +112,12 @@ function createTest(test, testPath, options) { // Need to wait > FS_ACCURACY as defined in watchpack. // See PR 1109 for details: https://github.com/TypeStrong/ts-loader/pull/1109 setTimeout(() => { - // execute webpack - // @ts-ignore - webpack will not be null at runtime - testState.watcher = webpack( - createWebpackConfig(paths, options) - ).watch({ aggregateTimeout: 1500 }, createWebpackWatchHandler(done, paths, testState, options, test)); + const compiler = webpack(createWebpackConfig(paths, options)); + if (!compiler) { + done(new Error('webpack did not return a compiler')); + return; + } + testState.watcher = compiler.watch({ aggregateTimeout: 1500 }, createWebpackWatchHandler(done, paths, testState, options, test)); }, 200); }; diff --git a/test/comparison-tests/globals.d.ts b/test/comparison-tests/globals.d.ts new file mode 100644 index 000000000..daa8d10f0 --- /dev/null +++ b/test/comparison-tests/globals.d.ts @@ -0,0 +1,13 @@ +// The mocha globals create-and-execute-test.js uses. Mocha 12 ships no types, and +// this saves a dependency on @types/mocha. + +interface MochaTestContext { + timeout(ms: number): void; +} + +declare function describe(title: string, fn: () => void): void; + +declare function it( + title: string, + fn: (this: MochaTestContext, done: (error?: unknown) => void) => void, +): void; diff --git a/test/comparison-tests/newline.loader.js b/test/comparison-tests/newline.loader.js index 434018bb9..3ef75185b 100644 --- a/test/comparison-tests/newline.loader.js +++ b/test/comparison-tests/newline.loader.js @@ -1,5 +1,8 @@ +/** + * @this {import('webpack').LoaderContext} + * @param {string} contents + */ module.exports = function(contents) { - // @ts-ignore this.cacheable(); return contents.replace(/\r\n/g, '\n'); -} \ No newline at end of file +} diff --git a/test/comparison-tests/tsconfig.json b/test/comparison-tests/tsconfig.json index dfd2c7002..3f876f297 100644 --- a/test/comparison-tests/tsconfig.json +++ b/test/comparison-tests/tsconfig.json @@ -4,6 +4,7 @@ "copySync.js", "create-and-execute-test.js", "getProgram.js", + "globals.d.ts", "link-test-lib.js", "newline.loader.js", "run-tests.js" From 87a8d08a159d244a71749c428206d454726834f0 Mon Sep 17 00:00:00 2001 From: johnnyreilly Date: Sat, 7 Nov 2026 13:48:58 +0000 Subject: [PATCH 24/27] chore: upgrade deps --- package-lock.json | 448 ++++++++++++++++++++++------------------------ 1 file changed, 217 insertions(+), 231 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6ed2ddbb7..12d765409 100644 --- a/package-lock.json +++ b/package-lock.json @@ -169,9 +169,9 @@ } }, "node_modules/@oxc-parser/binding-android-arm-eabi": { - "version": "0.150.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.150.0.tgz", - "integrity": "sha512-oQef2Zu4Prz1KLKznz3HqZzU9uVoA5PMoDZuuLmqms7hKmKSAPzlaMnLllJq3t+rgKmfJJ2siPrpZfFrW06btw==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.156.0.tgz", + "integrity": "sha512-RMq7DKNzEp1T51QKNLTn0NryNEt2IYfh7mZBlIdi2Ju52ltOEDMeIXv0XBpA6dL7j7ChjlcovtGcc1Jv4qMipg==", "cpu": [ "arm" ], @@ -186,9 +186,9 @@ } }, "node_modules/@oxc-parser/binding-android-arm64": { - "version": "0.150.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.150.0.tgz", - "integrity": "sha512-B6ofpoFiAUwIZ0MJ2IgHPvZK8FAtL4qzSZRwOkAKIfxEobE1mQC8nDdiFZj7pUaJiVUVCsfkMsBJKedzO8rZvA==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.156.0.tgz", + "integrity": "sha512-mwkWKhOBpmh8fWc3m4MiLsmEAtx0YuHmvyo9ff557cnb3QZ2kt2eauSz75wCGIpiZG3gUsJ4WwzEjm4R4/BHig==", "cpu": [ "arm64" ], @@ -203,9 +203,9 @@ } }, "node_modules/@oxc-parser/binding-darwin-arm64": { - "version": "0.150.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.150.0.tgz", - "integrity": "sha512-J+9IHKzx/bSz1JetOfD4zKXSK9sOm4/a7+0qomJODcTL6JsRXGeV/ZdkAPSIDydfFmWzYCraMlQEosSZEyBYkQ==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.156.0.tgz", + "integrity": "sha512-6pGR5fUszM9M4eBBapqpGjCRJolFwuCldx8bRQjqXyM09cQysBTWVF2Ttg4UNJVxYSaw5RRINbveCOOCrsuGvA==", "cpu": [ "arm64" ], @@ -220,9 +220,9 @@ } }, "node_modules/@oxc-parser/binding-darwin-x64": { - "version": "0.150.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.150.0.tgz", - "integrity": "sha512-v6IPfcAcSYrBWXV5Tce1DmxDMXLhEYpIIWiRFPJopgCVscZdLaV4MRQOUxvL3usQlw+yrwYOjBFB9IwBx+jUiQ==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.156.0.tgz", + "integrity": "sha512-M9QghL7uCAqMKjYJv1rDGblfEvkeQu3QzTPd7Uwo16gG3uO7m9ikVQ9OL8FZTnKzU4vbCEby6kTlEkqN+JeEMA==", "cpu": [ "x64" ], @@ -237,9 +237,9 @@ } }, "node_modules/@oxc-parser/binding-freebsd-x64": { - "version": "0.150.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.150.0.tgz", - "integrity": "sha512-AoR/4jD02HET0KO0yNT4nbTE+XJUxiO9jB1X/ycEjUE3WrIJ3IjV/Vf+gskhWLcqqeXfvNnkDtBR7epllAm88A==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.156.0.tgz", + "integrity": "sha512-lX0ANxSwAOrpOT7NHB+YsrBqDJ8sOVon5m7GS9eQtkuUeNzQMMGpFsJLsStawTbrdwOF5KDVxgPWcKmt/DIZUQ==", "cpu": [ "x64" ], @@ -254,9 +254,9 @@ } }, "node_modules/@oxc-parser/binding-linux-arm-gnueabihf": { - "version": "0.150.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.150.0.tgz", - "integrity": "sha512-A/hycCFjLUrCmLoL5O/vBp40ohlaXO1Ta3v5hqYZxicYFs129wZmgZJggcW4mYGYbZebQLhup+N8JjeQl8qwyw==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.156.0.tgz", + "integrity": "sha512-iPgYpasRcqk7X3TGncQg7B+6RotDvG8weug0UrgF+FXLf4KmaNDyT91BKONlqbHcNgK9Nryp7AEZGuQn32fP6g==", "cpu": [ "arm" ], @@ -271,9 +271,9 @@ } }, "node_modules/@oxc-parser/binding-linux-arm-musleabihf": { - "version": "0.150.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.150.0.tgz", - "integrity": "sha512-pbqahg1Pkz7J4RKmXm30s/iQu99hv64ayXCu8P4p75HcEH5azOdR4eGqiB6lFGkFR3mMpzaYsSKLkS8oJbjmeQ==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.156.0.tgz", + "integrity": "sha512-sJqJDEZevtkEfoxrXfaRTkSt6Itckr549cIfBbs11UgXv8bFyqQsXTQa6iKm8mTiWYmCDDFJf7TLnqxcbqzPOw==", "cpu": [ "arm" ], @@ -288,9 +288,9 @@ } }, "node_modules/@oxc-parser/binding-linux-arm64-gnu": { - "version": "0.150.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.150.0.tgz", - "integrity": "sha512-HV11aRbBQGwqv8bEo+K/6qr88uB4fEe1mhXncMhlVCrj+WpBSraxrUzHaPVmeQRU6x6x8v/3DuCbbo93rpp+fw==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.156.0.tgz", + "integrity": "sha512-mrQs5OdRiqKskRuWEORPKT6YGIFhrpVvCvL9hqVaIh60EzgR4qjPvSsV6hWZcOfyWHBTbdEvfnDJPh/eQlxPRQ==", "cpu": [ "arm64" ], @@ -308,9 +308,9 @@ } }, "node_modules/@oxc-parser/binding-linux-arm64-musl": { - "version": "0.150.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.150.0.tgz", - "integrity": "sha512-k6pVkJqALwtEuP4zukVhGRhdIy4+ofChUIUUsAHHyqDZlNsknmel3JjbggrJiWGaes6h/dIcWmEXsKW4SmK9oQ==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.156.0.tgz", + "integrity": "sha512-ZtPqgCU3+wpU7dvX7YbaEiw71r0UdguzuPhcx4PIEZSs4XFqc6F5wXCtNdb6M7m3DMErlxrwosryoXrzYOY/Gg==", "cpu": [ "arm64" ], @@ -328,9 +328,9 @@ } }, "node_modules/@oxc-parser/binding-linux-ppc64-gnu": { - "version": "0.150.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.150.0.tgz", - "integrity": "sha512-tEFg39mw/rHO5n8GK2DR4ZMFfsPQZtnQIPbsIpjoQRomJc/2tRfsCSmCT6gNit+NZGoeJG5aH9ATDH5bf0WnoQ==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.156.0.tgz", + "integrity": "sha512-ZuGRT/adReZZJn3PYNneb1HQIOH0iIZ2fzFgC1/XJYpMQ5KsRKmWIEzy3wEFsUwIOTomCmnmTZ/zbFYo9z9VeA==", "cpu": [ "ppc64" ], @@ -348,9 +348,9 @@ } }, "node_modules/@oxc-parser/binding-linux-riscv64-gnu": { - "version": "0.150.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.150.0.tgz", - "integrity": "sha512-0JO7IFkoek6HqV589Menx3hJySNXi6quRhO4tq2P7kpEHKEXoDATnoPVUpn5B7gDH2KLkdo751N0uIrGJFCTCw==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.156.0.tgz", + "integrity": "sha512-T+iWCeAOoEAJpHqr6/pogHIv98g9p8Ctccysm/h962hG4ayX5OL2c0Ih4oYe+JuFndLXy/OASvwMlTPe76sIiw==", "cpu": [ "riscv64" ], @@ -368,9 +368,9 @@ } }, "node_modules/@oxc-parser/binding-linux-riscv64-musl": { - "version": "0.150.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.150.0.tgz", - "integrity": "sha512-7XPzREnyAS5wHU9aB+49Uaqgoo1gVCklHc3DRlc3fJy2tXD/eAJFN1QFz/crj+Ulup5P1+axNREF+/RGaB/IRA==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.156.0.tgz", + "integrity": "sha512-wL55bI2kVKfwdxScbw60zVgzAqbQbmE5zpSPWPZoZ9RSG8egm6ITE/UWE5mDWlglxz1QElJCcUbpaJCtHD11BQ==", "cpu": [ "riscv64" ], @@ -388,9 +388,9 @@ } }, "node_modules/@oxc-parser/binding-linux-s390x-gnu": { - "version": "0.150.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.150.0.tgz", - "integrity": "sha512-7n7ZxcbRWDFaTdyj8M8p0O9OfzoMKm8O6syBAIgcSutbOALq0Bb9G52Me+XH0anMLZV+NgXc726gqgG2q39vcQ==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.156.0.tgz", + "integrity": "sha512-+D+JilhLqwrDLODYEl4qtovVwgxKALb23FkAWBiPvgmUWYgjCV83KKuwwxZJM8GCdKlNA1vt3iKtow8HUFjXtg==", "cpu": [ "s390x" ], @@ -408,9 +408,9 @@ } }, "node_modules/@oxc-parser/binding-linux-x64-gnu": { - "version": "0.150.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.150.0.tgz", - "integrity": "sha512-Vx0GSA9ZCRTUiczoEQnIIyXkMvtEY8uc6IiwLQtMe5ci2sXPqjrry0Ek5fsPP1k2kCzkML3ow9UOOEgnEDi7Bw==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.156.0.tgz", + "integrity": "sha512-jRfwpN4xKrsEpC+SgrUPY5k0mINYZn7aLrt22I3uQFoumiSgHgsLYgS9f84ntbkvSydH4HiwGuDa2b1XCHaJzw==", "cpu": [ "x64" ], @@ -428,9 +428,9 @@ } }, "node_modules/@oxc-parser/binding-linux-x64-musl": { - "version": "0.150.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.150.0.tgz", - "integrity": "sha512-ii4/9m3viDLssMnfXU7/Pni/3nYplApuGayceX4qsVGaqqQJCx3tHIH9M/HWIeSty5i8LjS21zPYT6lVIkwLxw==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.156.0.tgz", + "integrity": "sha512-P/ajnypgLmxmuRRyCIZcp2o4lOwmCaXYH5+eqDTcCW+MCTI+csKSw/Zc6GB67jZoVa4ey3q1jXEt7S60adBEMQ==", "cpu": [ "x64" ], @@ -448,9 +448,9 @@ } }, "node_modules/@oxc-parser/binding-openharmony-arm64": { - "version": "0.150.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-openharmony-arm64/-/binding-openharmony-arm64-0.150.0.tgz", - "integrity": "sha512-ZtoxX5rez36ZWkwtiEhjkCPnlTPoQ2I7lIL0IYZ1yjxMYohbvoOjBmUIZzrf9W/HouONq0omIfTeCWEY+R380w==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-openharmony-arm64/-/binding-openharmony-arm64-0.156.0.tgz", + "integrity": "sha512-WSN6rQZZc9KqgZ4lMfjVDvqKhVOCjey/YEZIPisGXmwBqwgWOzru207dyiH50LHcf1n9LO2oceGk/id6RL9v0g==", "cpu": [ "arm64" ], @@ -465,9 +465,9 @@ } }, "node_modules/@oxc-parser/binding-win32-arm64-msvc": { - "version": "0.150.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.150.0.tgz", - "integrity": "sha512-VqeRb5JX/bKYBrff7TUDvJyKY0914UzuCkuXIGxJS4FUmvMNfqkCbc7Sq90iMz9DlmAtlggwaBYQ9eg3h3ltiw==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.156.0.tgz", + "integrity": "sha512-l21Tz6tjraGBC3JefVeJZ9pojD0fCiB62PydAv+i9nrqJX7z/pDmyDNYLamDr/PRcQ4UQbFwkSnz7NKBB9UMLw==", "cpu": [ "arm64" ], @@ -482,9 +482,9 @@ } }, "node_modules/@oxc-parser/binding-win32-ia32-msvc": { - "version": "0.150.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.150.0.tgz", - "integrity": "sha512-EPqJfeZ4Pgg2BJSsCV8GozxV0FDltRzpVtGVa1r2noJu1iu+opOw3gtBWXwIo9odCT/MdFfyHxdy0/CRqs3OqA==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.156.0.tgz", + "integrity": "sha512-CUq0ZFl/RODqPiIgfNNSamkpTj5x8AjBTkR/y1DNVIQiTGnmWqjHcn3o08ZW3q/LgkI4g9G9g6UirmmQFvuOZw==", "cpu": [ "ia32" ], @@ -499,9 +499,9 @@ } }, "node_modules/@oxc-parser/binding-win32-x64-msvc": { - "version": "0.150.0", - "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.150.0.tgz", - "integrity": "sha512-n5YMzbqwPQqozbkrexi0lNZrUz5cnPHalYpFWe6Dau7AmKIWNo+y24IwzDuZEQtEdUHuKhXmMMih/MPjOI+CMw==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.156.0.tgz", + "integrity": "sha512-dcpx5Y1x2v/cs7U/q3SZMvmxfyXjVvqC86jMuw2ZZUbHDd7W2cW7uSMQfg3GLVaE68Su3H9xd/Pc4v6QNyeSRg==", "cpu": [ "x64" ], @@ -516,9 +516,9 @@ } }, "node_modules/@oxc-project/types": { - "version": "0.150.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.150.0.tgz", - "integrity": "sha512-rDS5/31E9HfPl/CIzGrn0DOlvBbXFseQ5URJ9sYMfstbKLD/c6Gm9vmRzRGDdAXyOIL4zmO37lc9RIwYqVruZw==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.156.0.tgz", + "integrity": "sha512-1Duyg48TdJNdyhEB8Xn1L36bT9Pv6GUtlKjHxOys8xkaF/rQq3XJE+bAurSK/AgIz5mGFsb77cn9Pb20+WCScw==", "dev": true, "license": "MIT", "funding": { @@ -821,9 +821,9 @@ ] }, "node_modules/@oxlint-tsgolint/darwin-arm64": { - "version": "7.0.2003", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-arm64/-/darwin-arm64-7.0.2003.tgz", - "integrity": "sha512-TgV33rXr6ueXBwvc+0nssUkTBSXHJxv77I8p4RCjDjCnvexHtmoPiudVRDfj3S3puMDdeQdHW6jdUgUPy3nr/w==", + "version": "7.0.2006", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-arm64/-/darwin-arm64-7.0.2006.tgz", + "integrity": "sha512-uc0MEHXZUDW23Zmo5X28eSNeSnP17jKnh9GiehpVZqhfy99ks8spyXT5Llar3tjDN7ppnQN0Qd9FK6WNkdD+fQ==", "cpu": [ "arm64" ], @@ -835,9 +835,9 @@ ] }, "node_modules/@oxlint-tsgolint/darwin-x64": { - "version": "7.0.2003", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-x64/-/darwin-x64-7.0.2003.tgz", - "integrity": "sha512-hY3FMAjIaPDdK3FNxyRXRfHPOFeoBn6dmnLyKZgQ2IbTTD1adXhl6PfCIqHhCPvurigv7nf7mYuWZZ19MmJzmg==", + "version": "7.0.2006", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/darwin-x64/-/darwin-x64-7.0.2006.tgz", + "integrity": "sha512-+x1/pa3S3VMC9cif8XKTOCQUuqRT+wu1Ix+FK5svXa2xbXCuE7+4S0SfmuSnK/mk9AI5+xBxZFhILxmCPUZ1hA==", "cpu": [ "x64" ], @@ -849,9 +849,9 @@ ] }, "node_modules/@oxlint-tsgolint/linux-arm64": { - "version": "7.0.2003", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-arm64/-/linux-arm64-7.0.2003.tgz", - "integrity": "sha512-eAET4JpyfBbg8SO0K74o4R55tEjVC292pIyxGOw2XGf8x/HrPNyxwQ478jMYOM54FIVOHc8sJ6VRHxluy6lucw==", + "version": "7.0.2006", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-arm64/-/linux-arm64-7.0.2006.tgz", + "integrity": "sha512-90v7HX8m54kHXn5DpjNEN18Fb7xwJMREe/wji3USyAf9pTMv7a3qZ3cPoLViIcIzxPLmkcYZIs1j1H3Z2gbVLA==", "cpu": [ "arm64" ], @@ -863,9 +863,9 @@ ] }, "node_modules/@oxlint-tsgolint/linux-x64": { - "version": "7.0.2003", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-x64/-/linux-x64-7.0.2003.tgz", - "integrity": "sha512-GXdyO/XyqDJ3s/llR/oOktLsYNjZtWSQBy0JMc+/0gsNPvTcseKPhn9c6KcFyWmnr6H4vljYALbujonqSzzEGw==", + "version": "7.0.2006", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/linux-x64/-/linux-x64-7.0.2006.tgz", + "integrity": "sha512-/k0wsEqHiA5dWBJYuld3Vecv6bIhKCasxpho/aFkvh870Qox33MuTkKUGWIVm/njAxw7W4pu1a/Xfa3jwuKuPQ==", "cpu": [ "x64" ], @@ -877,9 +877,9 @@ ] }, "node_modules/@oxlint-tsgolint/win32-arm64": { - "version": "7.0.2003", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-arm64/-/win32-arm64-7.0.2003.tgz", - "integrity": "sha512-TWauXnPfet0VgpmrstoAK58eJ4gbuwPUuUTQmYQAzE/RG1CpnxXtrKUJULf6lyerPE4KN3gM+DflIA1hOH+38Q==", + "version": "7.0.2006", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-arm64/-/win32-arm64-7.0.2006.tgz", + "integrity": "sha512-CQT5sqcLZLNZSWLzUUEjQmp74UX8h1agp3ZJ8pfRktHbx6gfBa8a7CjrnRrZ9VXlwnXVkpw7m5KBO6y+S5MQRA==", "cpu": [ "arm64" ], @@ -891,9 +891,9 @@ ] }, "node_modules/@oxlint-tsgolint/win32-x64": { - "version": "7.0.2003", - "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-x64/-/win32-x64-7.0.2003.tgz", - "integrity": "sha512-DoRmfe7j8VqNlukp8liRVW45GQDhzRccNenjD/pdzelgtffW47pCMd1xbJLkPaPbKnTwID3onn3VZlL7JbebEA==", + "version": "7.0.2006", + "resolved": "https://registry.npmjs.org/@oxlint-tsgolint/win32-x64/-/win32-x64-7.0.2006.tgz", + "integrity": "sha512-VZsGowXcp3vQNkjoGeVCOTf4aGrRpRk6bBJWhefnJVPr6z+dX+LKqqHfwaqnFvg66Q2iJpXqklRW38YO21ee+Q==", "cpu": [ "x64" ], @@ -905,9 +905,9 @@ ] }, "node_modules/@oxlint/binding-android-arm-eabi": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.86.0.tgz", - "integrity": "sha512-63Ozq6yQn79B2UxjSZ9huJmI+3/ZPI7hxAe6TyFh9oQL447KnIMoffOdtog+h4KILbQr61ZRvFPW5gYbAUgpgQ==", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.92.0.tgz", + "integrity": "sha512-k3Sd4ixQfiOrybv1gT+AMI81HSdtAFsiCFx+xXxWdFkmKW2HNrSiOfwn20o5nl/ggwbzU1oNLDeU/fRPinTVZQ==", "cpu": [ "arm" ], @@ -922,9 +922,9 @@ } }, "node_modules/@oxlint/binding-android-arm64": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.86.0.tgz", - "integrity": "sha512-JdLGp44phbf/0Du236Dt06yfK6Qw8xhTFeDvHJdjk167r59OfP5+BL31mgMYVnswS8e+j6tFuccSY0QDC/lgCw==", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.92.0.tgz", + "integrity": "sha512-OZzgEuiTSG11QkBWdXEguiLOT6lL09KtfcC/BmvUQWBAjU5eVyBxIAsmWAXv8L85/eT6RE0GBEWTEFBAbYE74g==", "cpu": [ "arm64" ], @@ -939,9 +939,9 @@ } }, "node_modules/@oxlint/binding-darwin-arm64": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.86.0.tgz", - "integrity": "sha512-h+vkOr4ik6KLFCXdtNVEj9xfnXfNUpPoF95QjORdhiSpLqQePzcN81kGHjAgsw1/G7WBWK5KsFKbI2UK8EyzMA==", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.92.0.tgz", + "integrity": "sha512-We6XS7tIqxgUoany6uyGjj7mNsh/mwf4Gt9gUzhxG65NKo2Ow9s6tDfrVuI0FVg8n3YmpW5PBx80qFxiLwAfsA==", "cpu": [ "arm64" ], @@ -956,9 +956,9 @@ } }, "node_modules/@oxlint/binding-darwin-x64": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.86.0.tgz", - "integrity": "sha512-wbglRuH5eKsp68keTOOeKDHU1astWSRYFsh2bwKQTAPb44rD6kVgzYI1ZrAJRTc6/7PH55ZXFCQx0rQXrj0UdA==", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.92.0.tgz", + "integrity": "sha512-jKJWijmi6AxAZcXXWA6R/NLVZHxoRTbIMnV8znsHzeiVfuEefYcyR8SJGfbBPmkG+kveLFRcBGw0fBrjLqtGmQ==", "cpu": [ "x64" ], @@ -973,9 +973,9 @@ } }, "node_modules/@oxlint/binding-freebsd-x64": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.86.0.tgz", - "integrity": "sha512-yTQ7QSOlNfQsrfbeVweTiegQJLKPjUKgXp/JpGiFzza6Hp29S9LAoH77TM3L0RjK39iQRZB5lk5iq2t241Mfag==", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.92.0.tgz", + "integrity": "sha512-wkw01wvJPM8/4jh+MV3cp11859VuBc94N2q5uOzcBgdGIRAqMCg1O0W/+xsZ1fsInvuUcv2Xo4nd1nzcKhi9kg==", "cpu": [ "x64" ], @@ -990,9 +990,9 @@ } }, "node_modules/@oxlint/binding-linux-arm-gnueabihf": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.86.0.tgz", - "integrity": "sha512-QYJGy0E2Tv8GAayyBIeHFTwQb8u+zrvrOYrifuDGZDr9ad5XsDhiMScpZymhS9fwWjqrgG2ZUwT4vpY0ISqp4Q==", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.92.0.tgz", + "integrity": "sha512-Elm6nW308MzmR8knvk0tPqQ4XE+PGKztjXv7kVZTRLkhBQZRXHUQoBLc4E30fiIuF6gkZO5f3EpJtQc4Ok/fXw==", "cpu": [ "arm" ], @@ -1007,9 +1007,9 @@ } }, "node_modules/@oxlint/binding-linux-arm-musleabihf": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.86.0.tgz", - "integrity": "sha512-oQo83CafLT8p3qh0AGkN0tSUIh5Hm63mfDsoqUmBQUBnSZLNBAbyRaAftfGY5a0cKZ34dG6jAtMYgcY5kZqt5g==", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.92.0.tgz", + "integrity": "sha512-oylpBAoeogddjhTlSPsXrzGq/aeJsvaULz/hYXvWtGn/Wt8LPLC7gFhucCicbRnzEKsShrZxIA0KyHmtFNnijQ==", "cpu": [ "arm" ], @@ -1024,9 +1024,9 @@ } }, "node_modules/@oxlint/binding-linux-arm64-gnu": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.86.0.tgz", - "integrity": "sha512-EM6wy5c2UM12qPb7iDJDBAZvHyfEJGH6iosFgaFiaRZpirz99//EHcUyD2KAskz07x1TULuiAtsojf4nvWWksw==", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.92.0.tgz", + "integrity": "sha512-/EWOI0wwY+74UGvC93TldpoNP8moIcidVUPbUSoX16/SEdF7ah209yxSQia4+9JdCRWYA3+yQMofXMgWKk/16Q==", "cpu": [ "arm64" ], @@ -1044,9 +1044,9 @@ } }, "node_modules/@oxlint/binding-linux-arm64-musl": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.86.0.tgz", - "integrity": "sha512-vCiUQb9ZNzZalxYRU4mlZwUqT5f+c7Sk9DwUOplWHtik3Dl4r3DVnUB5tBeRuTAUe6MUVCTylNW7TkkN8J1oTw==", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.92.0.tgz", + "integrity": "sha512-9Se7Zuazr104yc2PaluriJW2rqvtaN6FSi9MSjQgZGeYb6LKvEcJ586tpjek0l7hNQNoir8MID7OENPH6juN1w==", "cpu": [ "arm64" ], @@ -1064,9 +1064,9 @@ } }, "node_modules/@oxlint/binding-linux-ppc64-gnu": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.86.0.tgz", - "integrity": "sha512-T0AzE89yjTYmOhB/hb6i+rWTpe2mYt+xiguBhs9DEPIJTZ1H8OYqsE4VxJHHw2Wlq8Mztwvp2P8NV87ZOuhPRw==", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.92.0.tgz", + "integrity": "sha512-88IAchs204I/xxAbAo3NRyz1m/29tn8jUAPvc4tK4FzrT2PLwZertd93ANF6231vwbAhYiD5gl0cX8Po5xsjWQ==", "cpu": [ "ppc64" ], @@ -1084,9 +1084,9 @@ } }, "node_modules/@oxlint/binding-linux-riscv64-gnu": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.86.0.tgz", - "integrity": "sha512-s49r0K2f5Oc7fJoMUO1WkdhYK5Ob79uYRwWQ/XNoGysaOq3RUGmGUbHSuXiyydTTA+P9xEdDEnnlZVXiaSJhlw==", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.92.0.tgz", + "integrity": "sha512-KtFdVdkfvBGcsrmnbjYJ9/XTDABnaniiwnptAcAm0pkaR2zhZ3sr/Xy+N1Xbz1Yq5Jegu7SoeNv9caTP0b5OTA==", "cpu": [ "riscv64" ], @@ -1104,9 +1104,9 @@ } }, "node_modules/@oxlint/binding-linux-riscv64-musl": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.86.0.tgz", - "integrity": "sha512-JIa2tYR8ayb3nvcMSZzn4O/xTy13S7MHllu7cBD+B5qDQXXSRy/Vwk1aNpiTjZmBJGwKCHOy/NvnY5Xcwg27uQ==", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.92.0.tgz", + "integrity": "sha512-V43CO5FPgHtwHup4H5+dIdwzZX2FhREQGsSBZx8V1UyFEAul0Q13qviKqZfSMM6G41CGtCekVpJGGOxW5v1y8Q==", "cpu": [ "riscv64" ], @@ -1124,9 +1124,9 @@ } }, "node_modules/@oxlint/binding-linux-s390x-gnu": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.86.0.tgz", - "integrity": "sha512-XwXMyBsAuWZkhZU74UNcfQKr1CJJAKnS80dZzOnjl6A4fKcf91IjFgidegQugMHA5SN8ulwDXEDV1yPntjXgQQ==", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.92.0.tgz", + "integrity": "sha512-WooxeACzGH5q34olo7JgAk7XbVkTUNfwhR/TzmhwVs/y1p2R7ZWJo14hiyxiGcoYZR1iBnbBFHectADqb/KSog==", "cpu": [ "s390x" ], @@ -1144,9 +1144,9 @@ } }, "node_modules/@oxlint/binding-linux-x64-gnu": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.86.0.tgz", - "integrity": "sha512-C1WjukSyMnr66b+w1/tV8RFVv6d9v0MzDf4p9IxVXknqgmTHBgZh1pccN1eHzFr0b9Tbb3OXoPsAAdAuHAQfeA==", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.92.0.tgz", + "integrity": "sha512-lW2pLF1oFvNN780YUCtDyoUm8oFzZGJNcOFe9RtLMX5v5+FcWfAQvHUMMPF8H8kJB0HAi3dFmWDWLa5VPuY9mw==", "cpu": [ "x64" ], @@ -1164,9 +1164,9 @@ } }, "node_modules/@oxlint/binding-linux-x64-musl": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.86.0.tgz", - "integrity": "sha512-ap6KLmvC38c6MdYzsIh25cXQupqYvjd37tMNftzrX1DCtkX1Gcf2B+S2B17dD4lKa5c5gJog7DQJyDo82PBKyw==", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.92.0.tgz", + "integrity": "sha512-2BJAAB/eqPn7iD7mFVfs+1ZVUogAYOMCTaUgjAvbtNGg2ppCDE7gcv/9VSO6GCDybdFUqlcyeyjn9hRpl1ZHog==", "cpu": [ "x64" ], @@ -1184,9 +1184,9 @@ } }, "node_modules/@oxlint/binding-openharmony-arm64": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.86.0.tgz", - "integrity": "sha512-996Q9w/2GLwNyy5Djs39Jt09aFlr4b7TPhoj7dvo5FHmcyiF68nPz73HNc5UAYKIYeK+M9JzPQ4Wg1r1dXvP6A==", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.92.0.tgz", + "integrity": "sha512-iLtjNqqa/2IV5qu/3rrkpVd42Ia3yeCn4fSZoEr+m5FoGHtZvAV6J6YuU3lewg5Rg5ORGvwhdgN+7gNzwkl7tA==", "cpu": [ "arm64" ], @@ -1201,9 +1201,9 @@ } }, "node_modules/@oxlint/binding-win32-arm64-msvc": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.86.0.tgz", - "integrity": "sha512-9uTCHYTknNkug5+46ViSoUMuOuGWK61D87QnblU6CXaWKJC630Z7dbls61vdHxya/cR2ycQZ6Mm6ckgF6Cag5g==", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.92.0.tgz", + "integrity": "sha512-ryxiR3ZqB0OJzydMu+bVC3R7ZtoU7X1rI8sEgTBCCvQvgVwoCwqSFlfmhgiZ+9wZ4IdTsFeu9tdiF9KtRCbSHQ==", "cpu": [ "arm64" ], @@ -1218,9 +1218,9 @@ } }, "node_modules/@oxlint/binding-win32-ia32-msvc": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.86.0.tgz", - "integrity": "sha512-a47ga7EKVfMU8rO0i1m3mGwfNRj3FhQyt1d/ukO/E9u1HHF3KpR3tyb3VhuJBGEVPF8uR4exSyHUyx7xbE+uxw==", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.92.0.tgz", + "integrity": "sha512-DaE9OChj4nsdEST32BP7saGu8WtjOinTy/eS88dZ0TvTfDV26ebRDhsI1rL9OKXfO+DgehzhAQMqdPr2jgfcFw==", "cpu": [ "ia32" ], @@ -1235,9 +1235,9 @@ } }, "node_modules/@oxlint/binding-win32-x64-msvc": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.86.0.tgz", - "integrity": "sha512-az4dzifCRzES1crwu6pDFXzJTIanrdxXFL9TbiJWrx9LKcuacbR83aPvxDA1LKLNswi/RoqitC7Afcflhu3zBQ==", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.92.0.tgz", + "integrity": "sha512-0AyhqX0ciFuEnHIL+B4PIMMX3s/IpGHNEbbUqwsNhSrzWUSlEOPw/q7qFnRsEJfiKedcqVfUE/aXYuSMtpiFyw==", "cpu": [ "x64" ], @@ -1316,9 +1316,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "26.6.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.4.tgz", - "integrity": "sha512-ldVPDCzj7fsaGZrLB0NuHuTvJcsNasysBAqMolr/cgxrLd1xbqxIr3XJiPnHHJUCxj5sNF1vnRj9aWnrVh5Jcg==", + "version": "26.6.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.6.tgz", + "integrity": "sha512-MzQj+8Kx3XI40OmUAE6Qoh58ZMNstNNMwn2nfd3qWsfe7nDNSqJNzes4njhz6AHwrSHOffSLwXU6yb474Q4aog==", "dev": true, "license": "MIT", "dependencies": { @@ -3778,9 +3778,9 @@ } }, "node_modules/formatly": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/formatly/-/formatly-0.7.1.tgz", - "integrity": "sha512-ESuCEJE0SGgabl9q+zABI8LhJDmF+8nhpuqDzuM48HfJ9QTD5o6PqFJDFZY7w6f8xsh5lixuj5nJsQNvYOWvKQ==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/formatly/-/formatly-0.11.4.tgz", + "integrity": "sha512-TeCC10lP8KCgoX+Fe5lryILIT0/Dy+nP0OSVnsuB5CwXoLuOdqxCYlPFF1inR8S/zTy1ec7TjhS2TeRKWzzImA==", "dev": true, "license": "MIT", "dependencies": { @@ -3791,7 +3791,7 @@ "formatly": "bin/index.mjs" }, "engines": { - "node": ">=18.3.0" + "node": ">=18.14.0" } }, "node_modules/fs-extra": { @@ -4604,9 +4604,9 @@ } }, "node_modules/knip": { - "version": "6.39.0", - "resolved": "https://registry.npmjs.org/knip/-/knip-6.39.0.tgz", - "integrity": "sha512-Y7g6Ve1ATMox1u1v+gx3z9LTlvzVLTJISm/LVn9TgBU4qc7OoC63AWGO8qCFPVDDdaqlYdXkDDvvO1METBfTRw==", + "version": "6.44.2", + "resolved": "https://registry.npmjs.org/knip/-/knip-6.44.2.tgz", + "integrity": "sha512-6URO7pnqtOnyvSsXfW6+8C9j1lfcicxUCysXO0RgMtHTZ96HqCXh29op8iabeQW5JeIc8dJWwzSdJVWDokeScQ==", "dev": true, "funding": [ { @@ -4620,19 +4620,18 @@ ], "license": "ISC", "dependencies": { - "fdir": "^6.5.0", - "formatly": "^0.7.0", + "formatly": "^0.11.4", "get-tsconfig": "4.14.3", "jiti": "^2.7.0", - "oxc-parser": "^0.150.0", + "oxc-parser": "^0.156.0", "oxc-resolver": "11.24.2", "picomatch": "^4.0.7", - "smol-toml": "^1.8.0", + "smol-toml": "^1.9.0", "strip-json-comments": "5.0.3", "tinyglobby": "^0.2.17", - "unbash": "^4.0.11", + "unbash": "^6.0.1", "yaml": "^2.9.1", - "zod": "^4.4.3" + "zod": "^4.6.5" }, "bin": { "knip": "bin/knip.js", @@ -4642,19 +4641,6 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/knip/node_modules/picomatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", - "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -5235,13 +5221,13 @@ } }, "node_modules/oxc-parser": { - "version": "0.150.0", - "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.150.0.tgz", - "integrity": "sha512-zwajKw1GUa57IOdafIS7/yOObGF2NihwIfZfs5yJTRprMSkiwhWOc/k+n8bwnUPbHr2/XsjfBO8KyTPaW3VpWg==", + "version": "0.156.0", + "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.156.0.tgz", + "integrity": "sha512-7JhjgOfZjrIFJH5TlHrpRua864Si5GvwrPr5+eIRCY2sszhKXo6pyhP0HQKOGTtfO4UowwZ72XTGba0+lZphOQ==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/types": "^0.150.0" + "@oxc-project/types": "^0.156.0" }, "engines": { "node": "^20.19.0 || >=22.12.0" @@ -5250,25 +5236,25 @@ "url": "https://github.com/sponsors/oxc-project" }, "optionalDependencies": { - "@oxc-parser/binding-android-arm-eabi": "0.150.0", - "@oxc-parser/binding-android-arm64": "0.150.0", - "@oxc-parser/binding-darwin-arm64": "0.150.0", - "@oxc-parser/binding-darwin-x64": "0.150.0", - "@oxc-parser/binding-freebsd-x64": "0.150.0", - "@oxc-parser/binding-linux-arm-gnueabihf": "0.150.0", - "@oxc-parser/binding-linux-arm-musleabihf": "0.150.0", - "@oxc-parser/binding-linux-arm64-gnu": "0.150.0", - "@oxc-parser/binding-linux-arm64-musl": "0.150.0", - "@oxc-parser/binding-linux-ppc64-gnu": "0.150.0", - "@oxc-parser/binding-linux-riscv64-gnu": "0.150.0", - "@oxc-parser/binding-linux-riscv64-musl": "0.150.0", - "@oxc-parser/binding-linux-s390x-gnu": "0.150.0", - "@oxc-parser/binding-linux-x64-gnu": "0.150.0", - "@oxc-parser/binding-linux-x64-musl": "0.150.0", - "@oxc-parser/binding-openharmony-arm64": "0.150.0", - "@oxc-parser/binding-win32-arm64-msvc": "0.150.0", - "@oxc-parser/binding-win32-ia32-msvc": "0.150.0", - "@oxc-parser/binding-win32-x64-msvc": "0.150.0" + "@oxc-parser/binding-android-arm-eabi": "0.156.0", + "@oxc-parser/binding-android-arm64": "0.156.0", + "@oxc-parser/binding-darwin-arm64": "0.156.0", + "@oxc-parser/binding-darwin-x64": "0.156.0", + "@oxc-parser/binding-freebsd-x64": "0.156.0", + "@oxc-parser/binding-linux-arm-gnueabihf": "0.156.0", + "@oxc-parser/binding-linux-arm-musleabihf": "0.156.0", + "@oxc-parser/binding-linux-arm64-gnu": "0.156.0", + "@oxc-parser/binding-linux-arm64-musl": "0.156.0", + "@oxc-parser/binding-linux-ppc64-gnu": "0.156.0", + "@oxc-parser/binding-linux-riscv64-gnu": "0.156.0", + "@oxc-parser/binding-linux-riscv64-musl": "0.156.0", + "@oxc-parser/binding-linux-s390x-gnu": "0.156.0", + "@oxc-parser/binding-linux-x64-gnu": "0.156.0", + "@oxc-parser/binding-linux-x64-musl": "0.156.0", + "@oxc-parser/binding-openharmony-arm64": "0.156.0", + "@oxc-parser/binding-win32-arm64-msvc": "0.156.0", + "@oxc-parser/binding-win32-ia32-msvc": "0.156.0", + "@oxc-parser/binding-win32-x64-msvc": "0.156.0" } }, "node_modules/oxc-resolver": { @@ -5303,9 +5289,9 @@ } }, "node_modules/oxlint": { - "version": "1.86.0", - "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.86.0.tgz", - "integrity": "sha512-og0lhgvZfgGF//gOOmZXvtr+GmBbAGEnbEhv/QUg7UW2Wi4wHMnJbnMD+zuHgPdJxdklfgpPupdlAaAySyxrZg==", + "version": "1.92.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.92.0.tgz", + "integrity": "sha512-y9iRiRwVjVFqzKNXZJ9bT/GYRdf+F9Gy+a1Yju2Aq3xqqa4FJYXHI8VrxlpzxKDvkYRohvJX42m/eH+qkQPOFw==", "dev": true, "license": "MIT", "bin": { @@ -5318,28 +5304,28 @@ "url": "https://github.com/sponsors/oxc-project" }, "optionalDependencies": { - "@oxlint/binding-android-arm-eabi": "1.86.0", - "@oxlint/binding-android-arm64": "1.86.0", - "@oxlint/binding-darwin-arm64": "1.86.0", - "@oxlint/binding-darwin-x64": "1.86.0", - "@oxlint/binding-freebsd-x64": "1.86.0", - "@oxlint/binding-linux-arm-gnueabihf": "1.86.0", - "@oxlint/binding-linux-arm-musleabihf": "1.86.0", - "@oxlint/binding-linux-arm64-gnu": "1.86.0", - "@oxlint/binding-linux-arm64-musl": "1.86.0", - "@oxlint/binding-linux-ppc64-gnu": "1.86.0", - "@oxlint/binding-linux-riscv64-gnu": "1.86.0", - "@oxlint/binding-linux-riscv64-musl": "1.86.0", - "@oxlint/binding-linux-s390x-gnu": "1.86.0", - "@oxlint/binding-linux-x64-gnu": "1.86.0", - "@oxlint/binding-linux-x64-musl": "1.86.0", - "@oxlint/binding-openharmony-arm64": "1.86.0", - "@oxlint/binding-win32-arm64-msvc": "1.86.0", - "@oxlint/binding-win32-ia32-msvc": "1.86.0", - "@oxlint/binding-win32-x64-msvc": "1.86.0" + "@oxlint/binding-android-arm-eabi": "1.92.0", + "@oxlint/binding-android-arm64": "1.92.0", + "@oxlint/binding-darwin-arm64": "1.92.0", + "@oxlint/binding-darwin-x64": "1.92.0", + "@oxlint/binding-freebsd-x64": "1.92.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.92.0", + "@oxlint/binding-linux-arm-musleabihf": "1.92.0", + "@oxlint/binding-linux-arm64-gnu": "1.92.0", + "@oxlint/binding-linux-arm64-musl": "1.92.0", + "@oxlint/binding-linux-ppc64-gnu": "1.92.0", + "@oxlint/binding-linux-riscv64-gnu": "1.92.0", + "@oxlint/binding-linux-riscv64-musl": "1.92.0", + "@oxlint/binding-linux-s390x-gnu": "1.92.0", + "@oxlint/binding-linux-x64-gnu": "1.92.0", + "@oxlint/binding-linux-x64-musl": "1.92.0", + "@oxlint/binding-openharmony-arm64": "1.92.0", + "@oxlint/binding-win32-arm64-msvc": "1.92.0", + "@oxlint/binding-win32-ia32-msvc": "1.92.0", + "@oxlint/binding-win32-x64-msvc": "1.92.0" }, "peerDependencies": { - "oxlint-tsgolint": ">=7.0.2003", + "oxlint-tsgolint": ">=7.0.2005", "vite-plus": "*" }, "peerDependenciesMeta": { @@ -5352,27 +5338,27 @@ } }, "node_modules/oxlint-tsgolint": { - "version": "7.0.2003", - "resolved": "https://registry.npmjs.org/oxlint-tsgolint/-/oxlint-tsgolint-7.0.2003.tgz", - "integrity": "sha512-VnK4zlqgmgq/7ZcjzCk/WpN8kKFsYGcB85Io9qT3wL4K8Un3RKmJkp793crNETieMusPMKOA4a+Mw2wbteI6TQ==", + "version": "7.0.2006", + "resolved": "https://registry.npmjs.org/oxlint-tsgolint/-/oxlint-tsgolint-7.0.2006.tgz", + "integrity": "sha512-5B3UtH71kycPHUC1kFEIffivEAs49SUmkJuHZOZnTY0NPj4legp0bcsCQucuLVNCoJzDucS68P2C4WIhP+LypQ==", "dev": true, "license": "MIT", "bin": { "tsgolint": "bin/tsgolint.js" }, "optionalDependencies": { - "@oxlint-tsgolint/darwin-arm64": "7.0.2003", - "@oxlint-tsgolint/darwin-x64": "7.0.2003", - "@oxlint-tsgolint/linux-arm64": "7.0.2003", - "@oxlint-tsgolint/linux-x64": "7.0.2003", - "@oxlint-tsgolint/win32-arm64": "7.0.2003", - "@oxlint-tsgolint/win32-x64": "7.0.2003" + "@oxlint-tsgolint/darwin-arm64": "7.0.2006", + "@oxlint-tsgolint/darwin-x64": "7.0.2006", + "@oxlint-tsgolint/linux-arm64": "7.0.2006", + "@oxlint-tsgolint/linux-x64": "7.0.2006", + "@oxlint-tsgolint/win32-arm64": "7.0.2006", + "@oxlint-tsgolint/win32-x64": "7.0.2006" } }, "node_modules/package-manager-detector": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.8.0.tgz", - "integrity": "sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.9.0.tgz", + "integrity": "sha512-zAMfbta9nPA8AKkA4WdmNAT8R8s6Dk0/xwPsqNnRidMFcLo1YkLuPDTgs2f64XdzS8vbLNnoJ+uUIkgbz7oRHA==", "dev": true, "license": "MIT" }, @@ -5430,9 +5416,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "license": "MIT", "engines": { "node": ">=12" @@ -5528,9 +5514,9 @@ } }, "node_modules/prettier": { - "version": "3.9.6", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", - "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==", + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.10.tgz", + "integrity": "sha512-skGHTH1Yb9QvaTC4hWnRTzEYtCpApF0UMBPz+t/0ZPzP8ihefo/btKd+QA7pUE0fEwA1SbS/NmhyEcstdXOIdA==", "dev": true, "license": "MIT", "bin": { @@ -6451,9 +6437,9 @@ } }, "node_modules/unbash": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/unbash/-/unbash-4.0.12.tgz", - "integrity": "sha512-PnKvRX+Fbxl/usVlTr/31tXIOVAH+8OdC9qaxUQcvurwEnoc3Vk/ipi2Ce8IjMxzK9byfSGdsUBjqqJGc1o5lw==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/unbash/-/unbash-6.0.4.tgz", + "integrity": "sha512-t3OptUArewg9OpYGDskTSlxhyLDahfmZ4d36hE44Efb1y3HRLLpzsVqwH+AwBVymP4t7pP71xN+nnduudn2awA==", "dev": true, "license": "ISC", "engines": { From f1877c38c53f04a8bacd0cab47d5b33966f29b0a Mon Sep 17 00:00:00 2001 From: johnnyreilly Date: Sat, 7 Nov 2026 14:12:40 +0000 Subject: [PATCH 25/27] fix: harden the comparison test harness after review - Reject an empty --test-to-run, which made the whole comparison-tests folder "the test" (and cleared the .test staging folder), and a value starting with `-`, which means parseArgs took the next flag as the name. - listFiles walks directories itself instead of using readdirSync's recursive mode, which follows symlinked folders: a link back to a parent listed the same files over and over. Symlinked folders aren't followed; symlinked files still count. Dot-folders are skipped without being walked, and only symlinks need a stat call. - Only a missing target (ENOENT) or a link loop (ELOOP) makes a symlink "not a file"; other errors are thrown, so --save-output can't delete the snapshot of a file it couldn't read. Co-Authored-By: Claude Opus 5.5 --- .../create-and-execute-test.js | 50 +++++++++++++------ 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/test/comparison-tests/create-and-execute-test.js b/test/comparison-tests/create-and-execute-test.js index f086b1aaf..74903361f 100644 --- a/test/comparison-tests/create-and-execute-test.js +++ b/test/comparison-tests/create-and-execute-test.js @@ -25,7 +25,9 @@ const { values: args } = parseArgs({ const saveOutputMode = args['save-output'] === true; const testToRun = args['test-to-run']; -if (typeof testToRun !== 'string') { +// An empty name would make the whole comparison-tests folder "the test"; a name starting +// with `-` means parseArgs took the next flag (e.g. --save-output) as the value. +if (typeof testToRun !== 'string' || testToRun === '' || testToRun.startsWith('-')) { throw new Error('Pass the test to run with --test-to-run='); } @@ -358,7 +360,9 @@ function compareFiles(paths, test, patch) { /** * Lists every file under a directory, recursively. Replaces the `glob` package's - * `glob.sync` with `{ nodir: true }`, and gives the same results and order. + * `glob.sync` with `{ nodir: true }`, and gives the same results and order, except + * that symlinked folders aren't followed: a link back to a parent folder would + * otherwise list the same files again and again. * * @example * listFiles(paths.actualOutput); // ['bundle.js', 'output.txt', 'sub/.hidden.js'] @@ -376,25 +380,43 @@ function listFiles(dir, { includeDotFiles = true } = {}) { if (!pathExists(dir)) { return []; } - return fs.readdirSync(dir, { recursive: true }) - .map((file) => file.split(path.sep).join('/')) - .filter((file) => includeDotFiles || !file.split('/').some((part) => part.startsWith('.'))) - .filter((file) => isFile(path.join(dir, file))) - .sort((a, b) => a.localeCompare(b, 'en')); + /** @type {string[]} */ + const files = []; + walk(''); + return files.sort((a, b) => a.localeCompare(b, 'en')); + + /** @param {string} relativeDir */ + function walk(relativeDir) { + for (const entry of fs.readdirSync(path.join(dir, relativeDir), { withFileTypes: true })) { + if (!includeDotFiles && entry.name.startsWith('.')) { + continue; + } + const relativePath = relativeDir ? relativeDir + '/' + entry.name : entry.name; + if (entry.isDirectory()) { + walk(relativePath); + } else if (entry.isFile() || (entry.isSymbolicLink() && isSymlinkToFile(path.join(dir, relativePath)))) { + files.push(relativePath); + } + } + } } /** - * statSync follows symlinks, so a symlinked file counts as a file. A broken - * symlink, or a file deleted mid-listing, is skipped rather than crashing the run. + * statSync follows the link. A broken link, or a loop of links, isn't a file. Any + * other error (e.g. permissions) is thrown, so --save-output can't mistake an + * unreadable file for a missing one and delete its snapshot. * - * @param {string} filePath + * @param {string} linkPath * @returns {boolean} */ -function isFile(filePath) { +function isSymlinkToFile(linkPath) { try { - return fs.statSync(filePath).isFile(); - } catch { - return false; + return fs.statSync(linkPath).isFile(); + } catch (error) { + if (error.code === 'ENOENT' || error.code === 'ELOOP') { + return false; + } + throw error; } } From 1ab6c32294da86d4b4dfe050c91cced01e4c54f0 Mon Sep 17 00:00:00 2001 From: johnnyreilly Date: Sat, 7 Nov 2026 14:12:40 +0000 Subject: [PATCH 26/27] fix: resolve configs in run-webpack.js the way webpack-cli does - Pass `argv.bail: true` to a config function, as `webpack --bail` did. - Call function (or Promise) entries in an exported array. - Start the Promise chain first, so a config function that throws goes through the script's own error handling. - Use arrow functions for callbacks, matching create-and-execute-test.js. Co-Authored-By: Claude Opus 5.5 --- test/execution-tests/run-webpack.js | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/test/execution-tests/run-webpack.js b/test/execution-tests/run-webpack.js index f03318663..7f9fc9cbc 100644 --- a/test/execution-tests/run-webpack.js +++ b/test/execution-tests/run-webpack.js @@ -2,28 +2,34 @@ // Builds the webpack.config.js in the current directory once, like `webpack --bail`, // so the execution tests don't need webpack-cli. Exits with 1 if the build has errors. -// Like webpack-cli, the config can export an object, an array, a function or a Promise. +// Like webpack-cli, the config can export an object, a function or a Promise, or an +// array of them. const path = require('path'); const webpack = require('webpack'); const exported = require(path.resolve('webpack.config.js')); const env = { WEBPACK_BUNDLE: true, WEBPACK_BUILD: true }; +// What webpack-cli passes a config function for `webpack --bail` +const argv = { env, bail: true }; -Promise.resolve(typeof exported === 'function' ? exported(env, { env: env }) : exported) - .then(function (config) { - (Array.isArray(config) ? config : [config]).forEach(function (c) { c.bail = true; }); +// Starting from Promise.resolve() means a config function that throws is caught below +Promise.resolve() + .then(() => resolveConfig(exported)) + .then((config) => (Array.isArray(config) ? Promise.all(config.map(resolveConfig)) : config)) + .then((config) => { + (Array.isArray(config) ? config : [config]).forEach((c) => { c.bail = true; }); webpack(config, /** * An array of configs gives MultiStats. * @param {Error | null | undefined} err * @param {import('webpack').Stats | import('webpack').MultiStats | undefined} stats - */ function (err, stats) { + */ (err, stats) => { if (err || !stats) { console.error(err || new Error('webpack returned no stats')); process.exitCode = 1; return; } const options = 'stats' in stats - ? { children: stats.stats.map(function (s) { return statsOptions(s.compilation); }) } + ? { children: stats.stats.map((s) => statsOptions(s.compilation)) } : statsOptions(stats.compilation); const output = stats.toString(options); if (output) { @@ -34,11 +40,16 @@ Promise.resolve(typeof exported === 'function' ? exported(env, { env: env }) : e } }); }) - .catch(function (err) { + .catch((err) => { console.error(err); process.exitCode = 1; }); +/** Calls a config function (which may return a Promise) as webpack-cli does. */ +function resolveConfig(config) { + return typeof config === 'function' ? config(env, argv) : config; +} + /** * The config's own `stats` setting, as webpack-cli uses it: colors only when * stdout is a terminal, unless the config says otherwise. From d05b6d8c93a7066b90fefcefed16b745a6b89737 Mon Sep 17 00:00:00 2001 From: johnnyreilly Date: Sat, 7 Nov 2026 14:12:40 +0000 Subject: [PATCH 27/27] docs: list the check: scripts in AGENTS.md AGENTS.md said lint had no separate type-check script, which is no longer true. Co-Authored-By: Claude Opus 5.5 --- AGENTS.md | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 7adab6253..c1372ed66 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -21,14 +21,19 @@ Keep comments in `src/` sparse: only the non-obvious _why_ (a Windows-only path Note: test scripts clean test directories first using `git clean -xfd`. ```bash -npm run build # compile src/ → dist/ (tsc --project "./src") -npm run lint # type-check + oxlint (no separate typecheck script) -npm test # full test suite (comparison + execution tests) -npm run comparison-tests # fast subset: compare webpack output against snapshots -npm run execution-tests # run compiled code via Karma/Jasmine -npm run benchmark # compare this build's compile speed against another ts-loader checkout +npm run build # compile src/ → dist/ (tsc --project "./src") +npm run lint # type-check src/ + oxlint +npm run check:comparison-tests # type-check the comparison test harness scripts +npm run check:execution-tests # type-check the execution test harness scripts (and test/run-tests.js) +npm run check:benchmark-tests # type-check the benchmark scripts +npm test # full test suite (comparison + execution tests) +npm run comparison-tests # fast subset: compare webpack output against snapshots +npm run execution-tests # run compiled code via Karma/Jasmine +npm run benchmark # compare this build's compile speed against another ts-loader checkout ``` +The lint workflow runs `npm run lint` and all three `check:` scripts. + To run a single test: ```bash