diff --git a/.github/workflows/cross-runtime.yml b/.github/workflows/cross-runtime.yml index fa3c44a7..c814f343 100644 --- a/.github/workflows/cross-runtime.yml +++ b/.github/workflows/cross-runtime.yml @@ -49,6 +49,13 @@ jobs: env: HUSKY: "0" + # jest is no longer a project dev-dep (the Node.js test runner is used + # instead), so install it ad-hoc just for this job. The bridge shim + # (`test/_runner.js`) adapts the suite to jest's globals exactly as it + # does on the legacy-test matrix. + - name: Install jest + run: npm install --no-save --no-package-lock --no-audit jest@^30 + - name: Use Deno uses: denoland/setup-deno@667a34cdef165d8d2b2e98dde39547c9daac7282 # v2.0.4 with: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 887172bb..f5dc2dc6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -34,6 +34,7 @@ jobs: steps: - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 + # macOS arm64 runners don't ship Node.js 10/12/14, so force x64. - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 id: calculate_architecture with: @@ -50,34 +51,58 @@ jobs: with: node-version: ${{ matrix.node-version }} architecture: ${{ steps.calculate_architecture.outputs.result }} - # Legacy Node (10-16) reinstalls deps after dropping/bypassing - # package-lock.json, so there's no lockfile for setup-node's npm - # cache to key on. + # Legacy Node (10-16) reinstalls deps after dropping the lockfile, + # so there's nothing for setup-node's npm cache to key on. cache: ${{ (matrix.node-version == '10.x' || matrix.node-version == '12.x' || matrix.node-version == '14.x' || matrix.node-version == '16.x') && '' || 'npm' }} - - name: Install dependencies + # TODO: drop the legacy install + jest steps below once `engines.node` + # is bumped to >= 18. That also makes `jest.config.js`, the jest branch + # of `test/_runner.js`, and `test/polyfill-text-encoding.js` dead code. + # + # The `node:test` based suite needs Node.js 18+; the library itself + # still supports Node.js >= 10.13, so legacy versions run the same test + # files under jest via the runner shim (`test/_runner.js`). jest, memfs + # and the runtime deps are installed ad-hoc so the modern dev toolchain + # (eslint, typescript, prettier) is never required by the legacy leg. + - name: Install jest (Node 10) + if: matrix.node-version == '10.x' shell: bash run: | rm -f package-lock.json - npm config set progress false + yarn add -D jest@^27 memfs@^3 --ignore-scripts --ignore-engines - if [ "${{ matrix.node-version }}" = "10.x" ]; then - yarn add -D typescript@^4 jest@^27 memfs@^3 --ignore-scripts --ignore-engines - else - npm install -g npm@7 - npm install -D typescript@^4 jest@^27 memfs@^3 --ignore-scripts --no-audit --prefer-offline --no-save --no-package-lock - fi - if: matrix.node-version == '10.x' || matrix.node-version == '12.x' || matrix.node-version == '14.x' || matrix.node-version == '16.x' + - name: Install jest (Node 12-16) + if: matrix.node-version == '12.x' || matrix.node-version == '14.x' || matrix.node-version == '16.x' + shell: bash + run: | + rm -f package-lock.json + npm config set progress false + npm install -g npm@7 + npm install -D jest@^27 memfs@^3 --ignore-scripts --no-audit --prefer-offline --no-save --no-package-lock - name: Install dependencies - run: npm ci if: matrix.node-version != '10.x' && matrix.node-version != '12.x' && matrix.node-version != '14.x' && matrix.node-version != '16.x' + run: npm ci + + - name: Run tests (legacy via jest) + if: matrix.node-version == '10.x' || matrix.node-version == '12.x' || matrix.node-version == '14.x' || matrix.node-version == '16.x' + run: npx jest --ci + + # The built-in coverage lcov reporter and `--test-coverage-include` are + # only available on Node.js 22+, so 18/20 run the suite without + # collecting coverage. + - name: Run tests + if: matrix.node-version == '18.x' || matrix.node-version == '20.x' + run: npm run test:only - name: Run tests with coverage - run: npm run test:coverage -- --ci + if: matrix.node-version == '22.x' || matrix.node-version == '24.x' || matrix.node-version == '25.x' + run: npm run test:coverage - uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0 + if: matrix.node-version == '22.x' || matrix.node-version == '24.x' || matrix.node-version == '25.x' with: + files: ./coverage/lcov.info flags: integration token: ${{ secrets.CODECOV_TOKEN }} diff --git a/eslint.config.mjs b/eslint.config.mjs index 11792b69..357d9398 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -24,12 +24,27 @@ export default defineConfig([ }, { // Cross-runtime smoke scripts run standalone on node/bun/deno and in a - // browser sandbox; relax the library-grade JSDoc typing rules for them. + // browser sandbox; relax library-grade JSDoc rules, allow console + // output (they're CLI scripts) and skip the `engines.node` version + // checks (these files target newer runtimes by design). files: ["test/smoke/**/*"], rules: { "jsdoc/no-restricted-syntax": "off", "jsdoc/reject-any-type": "off", "unicorn/prefer-native-coercion-functions": "off", + "n/no-unsupported-features/es-builtins": "off", + "n/no-unsupported-features/es-syntax": "off", + "n/no-unsupported-features/node-builtins": "off", + "no-console": "off", + }, + }, + { + // The test suite relies on `node:test` and modern `node:assert` helpers, + // which are newer than the `engines.node` range the published library + // targets. Tests are dev-only, so the builtin version check does not apply. + files: ["test/*.js"], + rules: { + "n/no-unsupported-features/node-builtins": "off", }, }, ]); diff --git a/jest.config.js b/jest.config.js index 8f795cf1..0095b48b 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,6 +1,14 @@ "use strict"; +// TODO: drop this file together with `test/_runner.js`'s jest branch and the +// legacy-only steps in the `test` CI job once `engines.node` is bumped to >= 18. + +// Jest config is only consumed by the legacy leg of the test matrix +// (Node.js < 18) where `node:test` is not available. Modern runs use +// `node --test` via scripts/test.js and ignore this file. module.exports = { + roots: ["/test"], moduleFileExtensions: ["js", "mjs", "cjs", "ts"], + modulePathIgnorePatterns: ["/test/fixtures/"], setupFiles: ["/test/polyfill-text-encoding.js"], }; diff --git a/package-lock.json b/package-lock.json index 635b9377..fe7869a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,13 +17,11 @@ "@changesets/get-github-info": "^0.8.0", "@codspeed/core": "^5.2.0", "@types/graceful-fs": "^4.1.6", - "@types/jest": "^30.0.0", "@types/node": "^24.10.4", "cspell": "^10.0.0", "eslint": "^9.39.2", "eslint-config-webpack": "^4.9.5", "husky": "^9.1.7", - "jest": "^30.3.0", "lint-staged": "^17.0.4", "memfs": "^4.56.11", "prettier": "^3.7.4", @@ -55,13 +53,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", - "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", + "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -70,9 +68,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", - "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, "license": "MIT", "engines": { @@ -80,21 +78,21 @@ } }, "node_modules/@babel/core": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", - "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -121,14 +119,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", - "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -138,14 +136,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -165,9 +163,9 @@ } }, "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, "license": "MIT", "engines": { @@ -175,29 +173,29 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -206,20 +204,10 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, "license": "MIT", "engines": { @@ -227,9 +215,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, "license": "MIT", "engines": { @@ -237,9 +225,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, "license": "MIT", "engines": { @@ -247,27 +235,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", - "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", - "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.6" + "@babel/types": "^7.29.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -276,249 +264,10 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", - "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", - "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", - "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/runtime": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", - "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", "dev": true, "license": "MIT", "engines": { @@ -526,33 +275,33 @@ } }, "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", - "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.6", - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", "debug": "^4.3.1" }, "engines": { @@ -560,26 +309,19 @@ } }, "node_modules/@babel/types": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", - "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true, - "license": "MIT" - }, "node_modules/@changesets/apply-release-plan": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.1.1.tgz", @@ -602,16 +344,6 @@ "semver": "^7.5.3" } }, - "node_modules/@changesets/apply-release-plan/node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/@changesets/apply-release-plan/node_modules/prettier": { "version": "2.8.8", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", @@ -889,94 +621,6 @@ "stack-trace": "1.0.0-pre2" } }, - "node_modules/@codspeed/core/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@codspeed/core/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@codspeed/core/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@codspeed/core/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@codspeed/core/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/@codspeed/core/node_modules/yocto-queue": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", - "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@cspell/cspell-bundled-dicts": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-10.0.1.tgz", @@ -1606,44 +1250,10 @@ "node": ">=22.18.0" } }, - "node_modules/@emnapi/core": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz", - "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz", - "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", - "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@es-joy/jsdoccomment": { - "version": "0.86.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.86.0.tgz", - "integrity": "sha512-ukZmRQ81WiTpDWO6D/cTBM7XbrNtutHKvAVnZN/8pldAwLoJArGOvkNyxPTBGsPjsoaQBJxlH+tE2TNA/92Qgw==", + "node_modules/@es-joy/jsdoccomment": { + "version": "0.86.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.86.0.tgz", + "integrity": "sha512-ukZmRQ81WiTpDWO6D/cTBM7XbrNtutHKvAVnZN/8pldAwLoJArGOvkNyxPTBGsPjsoaQBJxlH+tE2TNA/92Qgw==", "dev": true, "license": "MIT", "dependencies": { @@ -1774,6 +1384,33 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/@eslint/js": { "version": "9.39.4", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", @@ -1788,17 +1425,17 @@ } }, "node_modules/@eslint/markdown": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@eslint/markdown/-/markdown-8.0.1.tgz", - "integrity": "sha512-WWKmld/EyNdEB8GMq7JMPX1SDWgyJAM1uhtCi5ySrqYQM4HQjmg11EX/q3ZpnpRXHfdccFtli3NBvvGaYjWyQw==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@eslint/markdown/-/markdown-8.0.2.tgz", + "integrity": "sha512-W+/0qHp0WbvFEljUvvECNpSWrUHpBWIWwp7F3QqEwQKmaRCmfEWvk6VfUia9pTQ0th6HyBGBsPfg/kG3/aQxLA==", "dev": true, "license": "MIT", "workspaces": [ "examples/*" ], "dependencies": { - "@eslint/core": "^1.1.1", - "@eslint/plugin-kit": "^0.6.1", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.1", "github-slugger": "^2.0.0", "mdast-util-from-markdown": "^2.0.2", "mdast-util-frontmatter": "^2.0.1", @@ -1827,13 +1464,13 @@ } }, "node_modules/@eslint/markdown/node_modules/@eslint/plugin-kit": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.6.1.tgz", - "integrity": "sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", + "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^1.1.1", + "@eslint/core": "^1.2.1", "levn": "^0.4.1" }, "engines": { @@ -1865,29 +1502,43 @@ } }, "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, "engines": { "node": ">=18.18.0" } }, "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanfs/core": "^0.19.1", + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -1938,4372 +1589,1506 @@ } } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, "license": "MIT", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=6.0.0" } }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { - "sprintf-js": "~1.0.2" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@istanbuljs/load-nyc-config/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==", + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/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" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@istanbuljs/load-nyc-config/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==", + "node_modules/@jsonjoy.com/buffers": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-17.67.0.tgz", + "integrity": "sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==", "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, + "license": "Apache-2.0", "engines": { - "node": ">=6" + "node": ">=10.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/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" + "type": "github", + "url": "https://github.com/sponsors/streamich" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/@jsonjoy.com/codegen": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", + "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.3.0.tgz", - "integrity": "sha512-PAwCvFJ4696XP2qZj+LAn1BWjZaJ6RjG6c7/lkMaUJnkyMS34ucuIsfqYvfskVNvUI27R/u4P1HMYFnlVXG/Ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.3.0", - "@types/node": "*", - "chalk": "^4.1.2", - "jest-message-util": "30.3.0", - "jest-util": "30.3.0", - "slash": "^3.0.0" + "node": ">=10.0" }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@jest/console/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@jsonjoy.com/fs-core": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.57.6.tgz", + "integrity": "sha512-uI++Wx6VkBJqVmkb4ZeExwAVpZiA2Do5NrEtXoDk0Pdvce3ytFXJoviT1sLOj16+qDIMnD5nWPfOhVpnDmRJKg==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "color-convert": "^2.0.1" + "@jsonjoy.com/fs-node-builtins": "4.57.6", + "@jsonjoy.com/fs-node-utils": "4.57.6", + "thingies": "^2.5.0" }, "engines": { - "node": ">=8" + "node": ">=10.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@jsonjoy.com/fs-fsa": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.57.6.tgz", + "integrity": "sha512-pKkw/yC5CzSZKhIIUIsH1przOa+K5jGmZIg1sWaSF24JojyrUFbjcQv7QrcGAudriei6HQ6R0BFj+V8NbQinJw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@jsonjoy.com/fs-core": "4.57.6", + "@jsonjoy.com/fs-node-builtins": "4.57.6", + "@jsonjoy.com/fs-node-utils": "4.57.6", + "thingies": "^2.5.0" }, "engines": { - "node": ">=10" + "node": ">=10.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@jest/core": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.3.0.tgz", - "integrity": "sha512-U5mVPsBxLSO6xYbf+tgkymLx+iAhvZX43/xI1+ej2ZOPnPdkdO1CzDmFKh2mZBn2s4XZixszHeQnzp1gm/DIxw==", + "node_modules/@jsonjoy.com/fs-node": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.57.6.tgz", + "integrity": "sha512-Kbn1jdkvDN4F2+BhoB6mMu7NCbhP0bgA5NcI1aJj/Q5UcU+I1JLLW+dEQean33iV4tXv35AzBVKPICnDltBpxw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@jest/console": "30.3.0", - "@jest/pattern": "30.0.1", - "@jest/reporters": "30.3.0", - "@jest/test-result": "30.3.0", - "@jest/transform": "30.3.0", - "@jest/types": "30.3.0", - "@types/node": "*", - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "exit-x": "^0.2.2", - "graceful-fs": "^4.2.11", - "jest-changed-files": "30.3.0", - "jest-config": "30.3.0", - "jest-haste-map": "30.3.0", - "jest-message-util": "30.3.0", - "jest-regex-util": "30.0.1", - "jest-resolve": "30.3.0", - "jest-resolve-dependencies": "30.3.0", - "jest-runner": "30.3.0", - "jest-runtime": "30.3.0", - "jest-snapshot": "30.3.0", - "jest-util": "30.3.0", - "jest-validate": "30.3.0", - "jest-watcher": "30.3.0", - "pretty-format": "30.3.0", - "slash": "^3.0.0" + "@jsonjoy.com/fs-core": "4.57.6", + "@jsonjoy.com/fs-node-builtins": "4.57.6", + "@jsonjoy.com/fs-node-utils": "4.57.6", + "@jsonjoy.com/fs-print": "4.57.6", + "@jsonjoy.com/fs-snapshot": "4.57.6", + "glob-to-regex.js": "^1.0.0", + "thingies": "^2.5.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=10.0" }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@jsonjoy.com/fs-node-builtins": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.57.6.tgz", + "integrity": "sha512-V4DgEFT3Cg5S9fCMOZSCVdTxdJWWLBO0WnAazV7hnCM96u5zXHyW/ubDAfcSVwqjkMJ50W1Y44IXtxRoIwaCVg==", "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, + "license": "Apache-2.0", "engines": { - "node": ">=8" + "node": ">=10.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@jsonjoy.com/fs-node-to-fsa": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.57.6.tgz", + "integrity": "sha512-+JptNw3iifihxH2rEXrninDzX4FFVW8JD/wPR8GbJPAeL9CQUSblrlumOPB5gZuS7tYRX+PJPLtT7XzKoRhv/Q==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@jsonjoy.com/fs-fsa": "4.57.6", + "@jsonjoy.com/fs-node-builtins": "4.57.6", + "@jsonjoy.com/fs-node-utils": "4.57.6" }, "engines": { - "node": ">=10" + "node": ">=10.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/diff-sequences": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.3.0.tgz", - "integrity": "sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/environment": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.3.0.tgz", - "integrity": "sha512-SlLSF4Be735yQXyh2+mctBOzNDx5s5uLv88/j8Qn1wH679PDcwy67+YdADn8NJnGjzlXtN62asGH/T4vWOkfaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/fake-timers": "30.3.0", - "@jest/types": "30.3.0", - "@types/node": "*", - "jest-mock": "30.3.0" + "type": "github", + "url": "https://github.com/sponsors/streamich" }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@jest/expect": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.3.0.tgz", - "integrity": "sha512-76Nlh4xJxk2D/9URCn3wFi98d2hb19uWE1idLsTt2ywhvdOldbw3S570hBgn25P4ICUZ/cBjybrBex2g17IDbg==", + "node_modules/@jsonjoy.com/fs-node-utils": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.57.6.tgz", + "integrity": "sha512-foyUrfS7WmYEUzqYXSNxmJBcSj04TABrkpFabwO9SCDCpVCfJ+qG+2sk5FjfiflG2n0SDFZDCJ6vYlJAEpxJFg==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "expect": "30.3.0", - "jest-snapshot": "30.3.0" + "@jsonjoy.com/fs-node-builtins": "4.57.6" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@jest/expect-utils": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.3.0.tgz", - "integrity": "sha512-j0+W5iQQ8hBh7tHZkTQv3q2Fh/M7Je72cIsYqC4OaktgtO7v1So9UTjp6uPBHIaB6beoF/RRsCgMJKvti0wADA==", + "node_modules/@jsonjoy.com/fs-print": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.57.6.tgz", + "integrity": "sha512-96eAn4Dudtt67LTeuU47yUD+pg9/G/oKpI10zei9ljk3X3WK4lYKc+n3cpaPCAbKPzoyfxl0mXm8f8Y7BOSFXw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@jest/get-type": "30.1.0" + "@jsonjoy.com/fs-node-utils": "4.57.6", + "tree-dump": "^1.1.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@jest/fake-timers": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.3.0.tgz", - "integrity": "sha512-WUQDs8SOP9URStX1DzhD425CqbN/HxUYCTwVrT8sTVBfMvFqYt/s61EK5T05qnHu0po6RitXIvP9otZxYDzTGQ==", + "node_modules/@jsonjoy.com/fs-snapshot": { + "version": "4.57.6", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.57.6.tgz", + "integrity": "sha512-V57CMzbOgTzUWGOWQ8GzHQdpJP6JnrYVNCtTBNxVYEnlVRvo4uEJqHhtAT8vhDFrIuJOXLrTL1Fki4h5oI7xxg==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@jest/types": "30.3.0", - "@sinonjs/fake-timers": "^15.0.0", - "@types/node": "*", - "jest-message-util": "30.3.0", - "jest-mock": "30.3.0", - "jest-util": "30.3.0" + "@jsonjoy.com/buffers": "^17.65.0", + "@jsonjoy.com/fs-node-utils": "4.57.6", + "@jsonjoy.com/json-pack": "^17.65.0", + "@jsonjoy.com/util": "^17.65.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@jest/get-type": { - "version": "30.1.0", - "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", - "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/base64": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-17.67.0.tgz", + "integrity": "sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@jest/globals": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.3.0.tgz", - "integrity": "sha512-+owLCBBdfpgL3HU+BD5etr1SvbXpSitJK0is1kiYjJxAAJggYMRQz5hSdd5pq1sSggfxPbw2ld71pt4x5wwViA==", + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/codegen": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-17.67.0.tgz", + "integrity": "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==", "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "30.3.0", - "@jest/expect": "30.3.0", - "@jest/types": "30.3.0", - "jest-mock": "30.3.0" - }, + "license": "Apache-2.0", "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@jest/pattern": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", - "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pack": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-17.67.0.tgz", + "integrity": "sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@types/node": "*", - "jest-regex-util": "30.0.1" + "@jsonjoy.com/base64": "17.67.0", + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0", + "@jsonjoy.com/json-pointer": "17.67.0", + "@jsonjoy.com/util": "17.67.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@jest/reporters": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.3.0.tgz", - "integrity": "sha512-a09z89S+PkQnL055bVj8+pe2Caed2PBOaczHcXCykW5ngxX9EWx/1uAwncxc/HiU0oZqfwseMjyhxgRjS49qPw==", + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pointer": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-17.67.0.tgz", + "integrity": "sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "30.3.0", - "@jest/test-result": "30.3.0", - "@jest/transform": "30.3.0", - "@jest/types": "30.3.0", - "@jridgewell/trace-mapping": "^0.3.25", - "@types/node": "*", - "chalk": "^4.1.2", - "collect-v8-coverage": "^1.0.2", - "exit-x": "^0.2.2", - "glob": "^10.5.0", - "graceful-fs": "^4.2.11", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^5.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "30.3.0", - "jest-util": "30.3.0", - "jest-worker": "30.3.0", - "slash": "^3.0.0", - "string-length": "^4.0.2", - "v8-to-istanbul": "^9.0.1" + "@jsonjoy.com/util": "17.67.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=10.0" }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@jest/reporters/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/util": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-17.67.0.tgz", + "integrity": "sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "color-convert": "^2.0.1" + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0" }, "engines": { - "node": ">=8" + "node": ">=10.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@jest/reporters/node_modules/brace-expansion": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", - "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", + "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "balanced-match": "^1.0.0" + "@jsonjoy.com/base64": "^1.1.2", + "@jsonjoy.com/buffers": "^1.2.0", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/json-pointer": "^1.0.2", + "@jsonjoy.com/util": "^1.9.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@jsonjoy.com/json-pack/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "license": "Apache-2.0", "engines": { - "node": ">=10" + "node": ">=10.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@jest/reporters/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "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", + "node_modules/@jsonjoy.com/json-pointer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", + "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", "dev": true, - "license": "ISC", + "license": "Apache-2.0", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/util": "^1.9.0" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": ">=10.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@jest/reporters/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "node_modules/@jsonjoy.com/util": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", + "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", "dev": true, - "license": "ISC", + "license": "Apache-2.0", "dependencies": { - "brace-expansion": "^2.0.2" + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=10.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util/node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@manypkg/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.5.5", + "@types/node": "^12.7.1", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0" } }, - "node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "node_modules/@manypkg/find-root/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@manypkg/find-root/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": { - "@sinclair/typebox": "^0.34.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=8" } }, - "node_modules/@jest/snapshot-utils": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.3.0.tgz", - "integrity": "sha512-ORbRN9sf5PP82v3FXNSwmO1OTDR2vzR2YTaR+E3VkSBZ8zadQE6IqYdYEeFH1NIkeB2HIGdF02dapb6K0Mj05g==", + "node_modules/@manypkg/find-root/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.3.0", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "natural-compare": "^1.4.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6 <7 || >=8" } }, - "node_modules/@jest/snapshot-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@manypkg/find-root/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": { - "color-convert": "^2.0.1" + "p-locate": "^4.1.0" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/snapshot-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@manypkg/find-root/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": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/source-map": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", - "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", + "node_modules/@manypkg/find-root/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": { - "@jridgewell/trace-mapping": "^0.3.25", - "callsites": "^3.1.0", - "graceful-fs": "^4.2.11" + "p-limit": "^2.2.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=8" } }, - "node_modules/@jest/test-result": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.3.0.tgz", - "integrity": "sha512-e/52nJGuD74AKTSe0P4y5wFRlaXP0qmrS17rqOMHeSwm278VyNyXE3gFO/4DTGF9w+65ra3lo3VKj0LBrzmgdQ==", + "node_modules/@manypkg/find-root/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", - "dependencies": { - "@jest/console": "30.3.0", - "@jest/types": "30.3.0", - "@types/istanbul-lib-coverage": "^2.0.6", - "collect-v8-coverage": "^1.0.2" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=8" } }, - "node_modules/@jest/test-sequencer": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.3.0.tgz", - "integrity": "sha512-dgbWy9b8QDlQeRZcv7LNF+/jFiiYHTKho1xirauZ7kVwY7avjFF6uTT0RqlgudB5OuIPagFdVtfFMosjVbk1eA==", + "node_modules/@manypkg/get-packages": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz", + "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "30.3.0", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.3.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "@babel/runtime": "^7.5.5", + "@changesets/types": "^4.0.1", + "@manypkg/find-root": "^1.1.0", + "fs-extra": "^8.1.0", + "globby": "^11.0.0", + "read-yaml-file": "^1.1.0" } }, - "node_modules/@jest/transform": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.3.0.tgz", - "integrity": "sha512-TLKY33fSLVd/lKB2YI1pH69ijyUblO/BQvCj566YvnwuzoTNr648iE0j22vRvVNk2HsPwByPxATg3MleS3gf5A==", + "node_modules/@manypkg/get-packages/node_modules/@changesets/types": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz", + "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@manypkg/get-packages/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.27.4", - "@jest/types": "30.3.0", - "@jridgewell/trace-mapping": "^0.3.25", - "babel-plugin-istanbul": "^7.0.1", - "chalk": "^4.1.2", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.3.0", - "jest-regex-util": "30.0.1", - "jest-util": "30.3.0", - "pirates": "^4.0.7", - "slash": "^3.0.0", - "write-file-atomic": "^5.0.1" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=6 <7 || >=8" } }, - "node_modules/@jest/transform/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">= 8" } }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">= 8" } }, - "node_modules/@jest/types": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", - "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", - "@types/istanbul-lib-coverage": "^2.0.6", - "@types/istanbul-reports": "^3.0.4", - "@types/node": "*", - "@types/yargs": "^17.0.33", - "chalk": "^4.1.2" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 8" } }, - "node_modules/@jest/types/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@pkgr/core": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.3.6.tgz", + "integrity": "sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==", "dev": true, "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://opencollective.com/pkgr" } }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/base62": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/base62/-/base62-1.0.0.tgz", + "integrity": "sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@stylistic/eslint-plugin": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.10.0.tgz", + "integrity": "sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/types": "^8.56.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.3" }, "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "eslint": "^9.0.0 || ^10.0.0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" + "@types/ms": "*" } }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" + "@types/node": "*" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0.0" + "dependencies": { + "@types/unist": "*" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/katex": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.8.tgz", + "integrity": "sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.24", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz", + "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" + "@types/unist": "*" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", "dev": true, "license": "MIT" }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "node_modules/@types/node": { + "version": "24.13.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.1.tgz", + "integrity": "sha512-RSpUJGmvsJ1ZeBehQZFhIdpsz+bIpES0nIQXko4Ybq+N+kX6XvOq3Jo+iJ82FWLdblFq85AsMikd3m35jgezYg==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "undici-types": "~7.18.0" } }, - "node_modules/@jsdevtools/ono": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "dev": true, "license": "MIT" }, - "node_modules/@jsonjoy.com/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.61.0.tgz", + "integrity": "sha512-bFNvl9ZczlVb+wR2Akszf3gHfKVj/8WanXaGJ3UstTA7brNKg0cNdk6X1Psu5V7MZ2oQtzZKOEzIUehaoxbDGw==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.61.0", + "@typescript-eslint/type-utils": "8.61.0", + "@typescript-eslint/utils": "8.61.0", + "@typescript-eslint/visitor-keys": "8.61.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, "engines": { - "node": ">=10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "tslib": "2" + "@typescript-eslint/parser": "^8.61.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@jsonjoy.com/buffers": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-17.67.0.tgz", - "integrity": "sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" + "node": ">= 4" } }, - "node_modules/@jsonjoy.com/codegen": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", - "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", + "node_modules/@typescript-eslint/parser": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.61.0.tgz", + "integrity": "sha512-5B7PfA2e1NQGCnDHd/0lW7W3gvp3d59Ryw54FYO8Uswxo9f6ikw3AZV+Xj/TvpImmpsiYyUqAfhC6kJID1jF6w==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.61.0", + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/typescript-estree": "8.61.0", + "@typescript-eslint/visitor-keys": "8.61.0", + "debug": "^4.4.3" + }, "engines": { - "node": ">=10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "tslib": "2" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@jsonjoy.com/fs-core": { - "version": "4.57.6", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.57.6.tgz", - "integrity": "sha512-uI++Wx6VkBJqVmkb4ZeExwAVpZiA2Do5NrEtXoDk0Pdvce3ytFXJoviT1sLOj16+qDIMnD5nWPfOhVpnDmRJKg==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.0.tgz", + "integrity": "sha512-DV42F7MLJO6Rax7SK1yg43tcnEfGUrurSpSxKuVX+a3RCTzBlH3fuxprrOJXKCJGAaw82xXocikJ0uQaqwXgGA==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@jsonjoy.com/fs-node-builtins": "4.57.6", - "@jsonjoy.com/fs-node-utils": "4.57.6", - "thingies": "^2.5.0" + "@typescript-eslint/tsconfig-utils": "^8.61.0", + "@typescript-eslint/types": "^8.61.0", + "debug": "^4.4.3" }, "engines": { - "node": ">=10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "tslib": "2" + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@jsonjoy.com/fs-fsa": { - "version": "4.57.6", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.57.6.tgz", - "integrity": "sha512-pKkw/yC5CzSZKhIIUIsH1przOa+K5jGmZIg1sWaSF24JojyrUFbjcQv7QrcGAudriei6HQ6R0BFj+V8NbQinJw==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.0.tgz", + "integrity": "sha512-IWdXFHFSb6mlC3HPc7QsLDm5zYEbUla6trDEHf32D3/dnuUyXd87plScSNXSbm0/RxMvObpI17sv/EDTGrGZkA==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@jsonjoy.com/fs-core": "4.57.6", - "@jsonjoy.com/fs-node-builtins": "4.57.6", - "@jsonjoy.com/fs-node-utils": "4.57.6", - "thingies": "^2.5.0" + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/visitor-keys": "8.61.0" }, "engines": { - "node": ">=10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@jsonjoy.com/fs-node": { - "version": "4.57.6", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.57.6.tgz", - "integrity": "sha512-Kbn1jdkvDN4F2+BhoB6mMu7NCbhP0bgA5NcI1aJj/Q5UcU+I1JLLW+dEQean33iV4tXv35AzBVKPICnDltBpxw==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.0.tgz", + "integrity": "sha512-O5Amvdv9ztMpxpf+vmFULGG78IE6Qwdr3bCGvqwG4nwc9H2qXkOYJJnRbRHyMkQTjv1d03olqwwwzHLMqpFePQ==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-core": "4.57.6", - "@jsonjoy.com/fs-node-builtins": "4.57.6", - "@jsonjoy.com/fs-node-utils": "4.57.6", - "@jsonjoy.com/fs-print": "4.57.6", - "@jsonjoy.com/fs-snapshot": "4.57.6", - "glob-to-regex.js": "^1.0.0", - "thingies": "^2.5.0" - }, + "license": "MIT", "engines": { - "node": ">=10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-node-builtins": { - "version": "4.57.6", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.57.6.tgz", - "integrity": "sha512-V4DgEFT3Cg5S9fCMOZSCVdTxdJWWLBO0WnAazV7hnCM96u5zXHyW/ubDAfcSVwqjkMJ50W1Y44IXtxRoIwaCVg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@jsonjoy.com/fs-node-to-fsa": { - "version": "4.57.6", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.57.6.tgz", - "integrity": "sha512-+JptNw3iifihxH2rEXrninDzX4FFVW8JD/wPR8GbJPAeL9CQUSblrlumOPB5gZuS7tYRX+PJPLtT7XzKoRhv/Q==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.61.0.tgz", + "integrity": "sha512-TuBiQYIkd97yBfInHCTKVYMbX4kvEmpOEuixIuzCU9p8BGT1SfyyO0d0IfDMbPIHcjn/hWnusUX5e8v5Xg+X8A==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@jsonjoy.com/fs-fsa": "4.57.6", - "@jsonjoy.com/fs-node-builtins": "4.57.6", - "@jsonjoy.com/fs-node-utils": "4.57.6" + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/typescript-estree": "8.61.0", + "@typescript-eslint/utils": "8.61.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" }, "engines": { - "node": ">=10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "tslib": "2" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@jsonjoy.com/fs-node-utils": { - "version": "4.57.6", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.57.6.tgz", - "integrity": "sha512-foyUrfS7WmYEUzqYXSNxmJBcSj04TABrkpFabwO9SCDCpVCfJ+qG+2sk5FjfiflG2n0SDFZDCJ6vYlJAEpxJFg==", + "node_modules/@typescript-eslint/types": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.0.tgz", + "integrity": "sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-node-builtins": "4.57.6" - }, + "license": "MIT", "engines": { - "node": ">=10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@jsonjoy.com/fs-print": { - "version": "4.57.6", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.57.6.tgz", - "integrity": "sha512-96eAn4Dudtt67LTeuU47yUD+pg9/G/oKpI10zei9ljk3X3WK4lYKc+n3cpaPCAbKPzoyfxl0mXm8f8Y7BOSFXw==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.0.tgz", + "integrity": "sha512-42zatd5qSvvcV1JdDBCLxYRznvP4eIHpPoZXdkPFnAmanA4FuZ5dibSnCBggY8hQnqajPpoGjXFdZ7fIJKQnlA==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@jsonjoy.com/fs-node-utils": "4.57.6", - "tree-dump": "^1.1.0" + "@typescript-eslint/project-service": "8.61.0", + "@typescript-eslint/tsconfig-utils": "8.61.0", + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/visitor-keys": "8.61.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" }, "engines": { - "node": ">=10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "tslib": "2" + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@jsonjoy.com/fs-snapshot": { - "version": "4.57.6", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.57.6.tgz", - "integrity": "sha512-V57CMzbOgTzUWGOWQ8GzHQdpJP6JnrYVNCtTBNxVYEnlVRvo4uEJqHhtAT8vhDFrIuJOXLrTL1Fki4h5oI7xxg==", + "node_modules/@typescript-eslint/typescript-estree/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": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/buffers": "^17.65.0", - "@jsonjoy.com/fs-node-utils": "4.57.6", - "@jsonjoy.com/json-pack": "^17.65.0", - "@jsonjoy.com/util": "^17.65.0" - }, + "license": "MIT", "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" + "node": "18 || 20 || >=22" } }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/base64": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-17.67.0.tgz", - "integrity": "sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/codegen": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-17.67.0.tgz", - "integrity": "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==", - "dev": true, - "license": "Apache-2.0", "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" + "node": "18 || 20 || >=22" } }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pack": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-17.67.0.tgz", - "integrity": "sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, - "license": "Apache-2.0", + "license": "BlueOak-1.0.0", "dependencies": { - "@jsonjoy.com/base64": "17.67.0", - "@jsonjoy.com/buffers": "17.67.0", - "@jsonjoy.com/codegen": "17.67.0", - "@jsonjoy.com/json-pointer": "17.67.0", - "@jsonjoy.com/util": "17.67.0", - "hyperdyperid": "^1.2.0", - "thingies": "^2.5.0", - "tree-dump": "^1.1.0" + "brace-expansion": "^5.0.5" }, "engines": { - "node": ">=10.0" + "node": "18 || 20 || >=22" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pointer": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-17.67.0.tgz", - "integrity": "sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==", + "node_modules/@typescript-eslint/utils": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.0.tgz", + "integrity": "sha512-3bzFt7ImFMW/jVYwJamDoe/dMOdFLSC6pom6rRjdh4SZJEYupyMzem8e7vKZLclLfpHjlwSAXOUxtKxGXUiLqA==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@jsonjoy.com/util": "17.67.0" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.61.0", + "@typescript-eslint/types": "8.61.0", + "@typescript-eslint/typescript-estree": "8.61.0" }, "engines": { - "node": ">=10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "tslib": "2" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/util": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-17.67.0.tgz", - "integrity": "sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.0.tgz", + "integrity": "sha512-QVLZu3ZPQEE+HICQyAMZ2yLQhxf0meY/wx6Hx14YcTNj13JB3qHlX3lJ02L3fLGHgERRH71kvYDwiXIguT3AjQ==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@jsonjoy.com/buffers": "17.67.0", - "@jsonjoy.com/codegen": "17.67.0" + "@typescript-eslint/types": "8.61.0", + "eslint-visitor-keys": "^5.0.0" }, "engines": { - "node": ">=10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@jsonjoy.com/json-pack": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", - "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/base64": "^1.1.2", - "@jsonjoy.com/buffers": "^1.2.0", - "@jsonjoy.com/codegen": "^1.0.0", - "@jsonjoy.com/json-pointer": "^1.0.2", - "@jsonjoy.com/util": "^1.9.0", - "hyperdyperid": "^1.2.0", - "thingies": "^2.5.0", - "tree-dump": "^1.1.0" - }, "engines": { - "node": ">=10.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" + "url": "https://opencollective.com/eslint" } }, - "node_modules/@jsonjoy.com/json-pack/node_modules/@jsonjoy.com/buffers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", - "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, - "node_modules/@jsonjoy.com/json-pointer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", - "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/codegen": "^1.0.0", - "@jsonjoy.com/util": "^1.9.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } + "license": "MIT" }, - "node_modules/@jsonjoy.com/util": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", - "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/buffers": "^1.0.0", - "@jsonjoy.com/codegen": "^1.0.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } + "license": "MIT" }, - "node_modules/@jsonjoy.com/util/node_modules/@jsonjoy.com/buffers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", - "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } + "license": "MIT" }, - "node_modules/@manypkg/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==", + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.5.5", - "@types/node": "^12.7.1", - "find-up": "^4.1.0", - "fs-extra": "^8.1.0" + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" } }, - "node_modules/@manypkg/find-root/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", "dev": true, "license": "MIT" }, - "node_modules/@manypkg/find-root/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==", + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, - "node_modules/@manypkg/find-root/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" + "@xtuc/ieee754": "^1.2.0" } }, - "node_modules/@manypkg/find-root/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==", + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" + "@xtuc/long": "4.2.2" } }, - "node_modules/@manypkg/find-root/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==", + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, - "node_modules/@manypkg/find-root/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==", + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, - "node_modules/@manypkg/get-packages": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz", - "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==", + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.5.5", - "@changesets/types": "^4.0.1", - "@manypkg/find-root": "^1.1.0", - "fs-extra": "^8.1.0", - "globby": "^11.0.0", - "read-yaml-file": "^1.1.0" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, - "node_modules/@manypkg/get-packages/node_modules/@changesets/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz", - "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@manypkg/get-packages/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", - "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.10.0" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pkgr/core": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", - "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/pkgr" - } - }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sinclair/typebox": { - "version": "0.34.49", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", - "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sindresorhus/base62": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/base62/-/base62-1.0.0.tgz", - "integrity": "sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.3.0.tgz", - "integrity": "sha512-m2xozxSfCIxjDdvbhIWazlP2i2aha/iUmbl94alpsIbd3iLTfeXgfBVbwyWogB6l++istyGZqamgA/EcqYf+Bg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.1" - } - }, - "node_modules/@stylistic/eslint-plugin": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.10.0.tgz", - "integrity": "sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/types": "^8.56.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "estraverse": "^5.3.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": "^9.0.0 || ^10.0.0" - } - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/debug": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", - "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "30.0.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", - "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^30.0.0", - "pretty-format": "^30.0.0" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/katex": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.8.tgz", - "integrity": "sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/lodash": { - "version": "4.17.24", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz", - "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "24.12.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.0.tgz", - "integrity": "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~7.16.0" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/yargs": { - "version": "17.0.35", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", - "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", - "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.59.3", - "@typescript-eslint/type-utils": "8.59.3", - "@typescript-eslint/utils": "8.59.3", - "@typescript-eslint/visitor-keys": "8.59.3", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.59.3", - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", - "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.59.3", - "@typescript-eslint/types": "8.59.3", - "@typescript-eslint/typescript-estree": "8.59.3", - "@typescript-eslint/visitor-keys": "8.59.3", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", - "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.59.3", - "@typescript-eslint/types": "^8.59.3", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", - "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.59.3", - "@typescript-eslint/visitor-keys": "8.59.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", - "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", - "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.59.3", - "@typescript-eslint/typescript-estree": "8.59.3", - "@typescript-eslint/utils": "8.59.3", - "debug": "^4.4.3", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", - "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", - "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.59.3", - "@typescript-eslint/tsconfig-utils": "8.59.3", - "@typescript-eslint/types": "8.59.3", - "@typescript-eslint/visitor-keys": "8.59.3", - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/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": "18 || 20 || >=22" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.5" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", - "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.59.3", - "@typescript-eslint/types": "8.59.3", - "@typescript-eslint/typescript-estree": "8.59.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", - "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.59.3", - "eslint-visitor-keys": "^5.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "dev": true, - "license": "ISC" - }, - "node_modules/@unrs/resolver-binding-android-arm-eabi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", - "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-android-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", - "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", - "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", - "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", - "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", - "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", - "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", - "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", - "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", - "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", - "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", - "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", - "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", - "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", - "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", - "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^0.2.11" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", - "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", - "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", - "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-phases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "acorn": "^8.14.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/are-docs-informative": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", - "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", - "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.0", - "es-object-atoms": "^1.1.1", - "get-intrinsic": "^1.3.0", - "is-string": "^1.1.1", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-timsort": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", - "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", - "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-shim-unscopables": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axios": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz", - "integrity": "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.16.0", - "form-data": "^4.0.5", - "proxy-from-env": "^2.1.0" - } - }, - "node_modules/babel-jest": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.3.0.tgz", - "integrity": "sha512-gRpauEU2KRrCox5Z296aeVHR4jQ98BCnu0IO332D/xpHNOsIH/bgSRk9k6GbKIbBw8vFeN6ctuu6tV8WOyVfYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/transform": "30.3.0", - "@types/babel__core": "^7.20.5", - "babel-plugin-istanbul": "^7.0.1", - "babel-preset-jest": "30.3.0", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "slash": "^3.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0 || ^8.0.0-0" - } - }, - "node_modules/babel-jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", - "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", - "dev": true, - "license": "BSD-3-Clause", - "workspaces": [ - "test/babel-8" - ], - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-instrument": "^6.0.2", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.3.0.tgz", - "integrity": "sha512-+TRkByhsws6sfPjVaitzadk1I0F5sPvOVUH5tyTSzhePpsGIVrdeunHSw/C36QeocS95OOk8lunc4rlu5Anwsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/babel__core": "^7.20.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", - "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - }, - "peerDependencies": { - "@babel/core": "^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/babel-preset-jest": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.3.0.tgz", - "integrity": "sha512-6ZcUbWHC+dMz2vfzdNwi87Z1gQsLNK2uLuK1Q89R11xdvejcivlYYwDlEv0FHX3VwEXpbBQ9uufB/MUNpZGfhQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-plugin-jest-hoist": "30.3.0", - "babel-preset-current-node-syntax": "^1.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0 || ^8.0.0-beta.1" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/baseline-browser-mapping": { - "version": "2.9.17", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.17.tgz", - "integrity": "sha512-agD0MgJFUP/4nvjqzIB29zRPUuCF7Ge6mEv9s8dHrtYD7QWXRcx75rOADE/d5ah1NI+0vkDl0yorDd5U852IQQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "node_modules/better-path-resolve": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz", - "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-windows": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/builtin-modules": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-5.0.0.tgz", - "integrity": "sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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.30001765", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001765.tgz", - "integrity": "sha512-LWcNtSyZrakjECqmpP4qdg0MMGdN368D7X8XvvAqOcqMv0RxnlqVKZl2V6/mBR68oYMxOZPLw/gO7DuisMHUvQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk-template": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.2.tgz", - "integrity": "sha512-2bxTP2yUH7AJj/VAXfcA+4IcWGdQ87HwBANLt5XxGTeomo8yG0y95N1um9i5StvhT/Bl0/2cARA5v1PpPXUxUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.2.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/chalk/chalk-template?sponsor=1" - } - }, - "node_modules/change-case": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", - "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chardet": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", - "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", - "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", - "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/clean-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", - "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/clean-regexp/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.2.0.tgz", - "integrity": "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "slice-ansi": "^8.0.0", - "string-width": "^8.2.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", - "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", - "dev": true, - "license": "MIT" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", - "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/comment-json": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-5.0.0.tgz", - "integrity": "sha512-uiqLcOiVDJtBP8WGkZHEP+FZIhTzP1dxvn59EfoYUi9gqupjrBWVQkO2atDrbnKPwLeotFYDsuNb26uBMqB+hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-timsort": "^1.0.3", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/comment-parser": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.6.tgz", - "integrity": "sha512-ObxuY6vnbWTN6Od72xfwN9DbzC7Y2vv8u1Soi9ahRKL37gb6y1qk6/dgjs+3JWuXJHWvsg3BXIwzd/rkmAwavg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/core-js-compat": { - "version": "3.49.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", - "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "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/cspell": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/cspell/-/cspell-10.0.1.tgz", - "integrity": "sha512-Gg6w/flT3fKfl3la62hfTnhtNnDQ+9mU7kUhVqw/axl/Ms4oENw0oJMkWFIoj4f6nL/SDPz7KcPXd2XbkKFNmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/cspell-json-reporter": "10.0.1", - "@cspell/cspell-performance-monitor": "10.0.1", - "@cspell/cspell-pipe": "10.0.1", - "@cspell/cspell-types": "10.0.1", - "@cspell/cspell-worker": "10.0.1", - "@cspell/dynamic-import": "10.0.1", - "@cspell/url": "10.0.1", - "ansi-regex": "^6.2.2", - "chalk": "^5.6.2", - "chalk-template": "^1.1.2", - "commander": "^14.0.3", - "cspell-config-lib": "10.0.1", - "cspell-dictionary": "10.0.1", - "cspell-gitignore": "10.0.1", - "cspell-glob": "10.0.1", - "cspell-io": "10.0.1", - "cspell-lib": "10.0.1", - "fast-json-stable-stringify": "^2.1.0", - "flatted": "^3.4.2", - "semver": "^7.8.1", - "tinyglobby": "^0.2.16" - }, - "bin": { - "cspell": "bin.mjs", - "cspell-esm": "bin.mjs" - }, - "engines": { - "node": ">=22.18.0" - }, - "funding": { - "url": "https://github.com/streetsidesoftware/cspell?sponsor=1" - } - }, - "node_modules/cspell-config-lib": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/cspell-config-lib/-/cspell-config-lib-10.0.1.tgz", - "integrity": "sha512-hMpo/0j6k7pbiqrLDOLJKD2IGP9XwhjKf2miiM6p84Xeo4nyuFZaxxDCQ68R851HSYFrrdltgpoipMbj1h2Tnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/cspell-types": "10.0.1", - "comment-json": "^5.0.0", - "smol-toml": "^1.6.1", - "yaml": "^2.9.0" - }, - "engines": { - "node": ">=22.18.0" - } - }, - "node_modules/cspell-dictionary": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-10.0.1.tgz", - "integrity": "sha512-3cZ659vgsZWkzGQJR/sNqGDVt/OnvTSieLKI76V++4t1bHJfochb9ZrrwsuMsb1VPGiyqClUP1/O6WrefF/FVg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/cspell-performance-monitor": "10.0.1", - "@cspell/cspell-pipe": "10.0.1", - "@cspell/cspell-types": "10.0.1", - "cspell-trie-lib": "10.0.1", - "fast-equals": "^6.0.0" - }, - "engines": { - "node": ">=22.18.0" - } - }, - "node_modules/cspell-gitignore": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-10.0.1.tgz", - "integrity": "sha512-wN23U61Mx6qPJN3CesOmBU9vnbJ0jQm/ylK0iaVui3CcnO7Zzl5qLu5mPHUzGQGm8yso6qjyxqo16Ho7LpZGOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/url": "10.0.1", - "cspell-glob": "10.0.1", - "cspell-io": "10.0.1" - }, - "bin": { - "cspell-gitignore": "bin.mjs" - }, - "engines": { - "node": ">=22.18.0" - } - }, - "node_modules/cspell-glob": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-10.0.1.tgz", - "integrity": "sha512-7bII9J3aSSpZDwhx7w+zfQXbMxHZQ3be0ilUp5bHrsjz6o07v/NqOHMGcwKdPn1sw2dxDz9sv057xE5pqXnSdw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/url": "10.0.1", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=22.18.0" - } - }, - "node_modules/cspell-grammar": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-10.0.1.tgz", - "integrity": "sha512-xC9AFYmaI9wsO//a7S5tdDGKGJVD5UEEsTg+Up2fi7lPfXIryisYmV6tePNL1SEg0idYss4ja8LUZ3Mib09BjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/cspell-pipe": "10.0.1", - "@cspell/cspell-types": "10.0.1" - }, - "bin": { - "cspell-grammar": "bin.mjs" - }, - "engines": { - "node": ">=22.18.0" - } - }, - "node_modules/cspell-io": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-10.0.1.tgz", - "integrity": "sha512-8C2ka07faxflnaqEBO3pektS21XViE/SEHT7F5ZD1ou7FyMR5u3xawTBJSczClfsxLt/WYeztBYrpmGAjmjksw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/cspell-service-bus": "10.0.1", - "@cspell/url": "10.0.1" - }, - "engines": { - "node": ">=22.18.0" - } - }, - "node_modules/cspell-lib": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-10.0.1.tgz", - "integrity": "sha512-RpsIPiLzc4/YMW8BMRKpyJ81x439qjYWcqgdKeXnMkbKM88J9PexzutfFf/4v97v96KzfNitEzMpbI0uj8OeUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/cspell-bundled-dicts": "10.0.1", - "@cspell/cspell-performance-monitor": "10.0.1", - "@cspell/cspell-pipe": "10.0.1", - "@cspell/cspell-resolver": "10.0.1", - "@cspell/cspell-types": "10.0.1", - "@cspell/dynamic-import": "10.0.1", - "@cspell/filetypes": "10.0.1", - "@cspell/rpc": "10.0.1", - "@cspell/strong-weak-map": "10.0.1", - "@cspell/url": "10.0.1", - "cspell-config-lib": "10.0.1", - "cspell-dictionary": "10.0.1", - "cspell-glob": "10.0.1", - "cspell-grammar": "10.0.1", - "cspell-io": "10.0.1", - "cspell-trie-lib": "10.0.1", - "env-paths": "^4.0.0", - "gensequence": "^8.0.8", - "import-fresh": "^4.0.0", - "resolve-from": "^5.0.0", - "vscode-languageserver-textdocument": "^1.0.12", - "vscode-uri": "^3.1.0", - "xdg-basedir": "^5.1.0" - }, - "engines": { - "node": ">=22.18.0" - } - }, - "node_modules/cspell-lib/node_modules/import-fresh": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-4.0.0.tgz", - "integrity": "sha512-Fpi660c7VPDM3fPKYovStd9IP1CPOikf6v/dGxJJMmHPcwYQIMJ4W7kO1avBYEpMqkCh+Dx3Ln6H7VYqgztLjw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=22.15" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cspell-trie-lib": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-10.0.1.tgz", - "integrity": "sha512-BFvhalSkRQFjKrZ//FKK7fRGrZFpifnxB5AwCkzsIsBZqicsfafcQ1xP21qpb0QqyV/IomjNgviG+tRJs+0rMw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=22.18.0" - }, - "peerDependencies": { - "@cspell/cspell-types": "10.0.1" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/dataloader": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz", - "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==", - "dev": true, - "license": "BSD-3-Clause" - }, - "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", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decode-named-character-reference": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", - "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/dedent": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", - "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/detect-indent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.2.tgz", - "integrity": "sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } + "license": "BSD-3-Clause" }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true, - "license": "MIT" + "license": "Apache-2.0" }, - "node_modules/electron-to-chromium": { - "version": "1.5.277", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.277.tgz", - "integrity": "sha512-wKXFZw4erWmmOz5N/grBoJ2XrNJGDFMu2+W5ACHza5rHtvsqrK4gb6rnLC7XxKB9WlJ+RmyQatuEXmtm86xbnw==", + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", "dev": true, - "license": "ISC" + "license": "BSD-2-Clause" }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "bin": { + "acorn": "bin/acorn" }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" + "engines": { + "node": ">=0.4.0" } }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/enhanced-resolve": { - "version": "5.23.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.23.0.tgz", - "integrity": "sha512-yJN/BOOLxcOW2aQgeif9mSnaUB8KtvmMMp56oA1kx1CRfBKbhZm2pJ+NBY+3eOboHxix8lfjWpHE0Ei5U8RbSA==", + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", "dev": true, "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.3.3" - }, "engines": { "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" } }, - "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/env-paths": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-4.0.0.tgz", - "integrity": "sha512-pxP8eL2SwwaTRi/KHYwLYXinDs7gL3jxFcBYmEdYfZmZXbaVDvdppd0XBU8qVz03rDfKZMXg1omHCbsJjZrMsw==", + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "license": "MIT", "dependencies": { - "is-safe-filename": "^0.1.0" + "debug": "4" }, "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 6.0.0" } }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, "license": "MIT", "dependencies": { - "is-arrayish": "^0.2.1" + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/es-abstract": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", - "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "dev": true, "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" - }, - "engines": { - "node": ">= 0.4" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } + "license": "MIT" }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=6" } }, - "node_modules/es-iterator-helpers": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz", - "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==", + "node_modules/ansi-escapes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.1", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.1.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.3.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.5", - "safe-array-concat": "^1.1.3" + "environment": "^1.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/es-module-lexer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", - "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, "engines": { - "node": ">= 0.4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + }, + "node_modules/are-docs-informative": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", "dev": true, "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, "engines": { - "node": ">= 0.4" + "node": ">=14" } }, - "node_modules/es-shim-unscopables": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "dev": true, "license": "MIT", "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -6312,628 +3097,541 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "node_modules/array-timsort": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", + "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint": { - "version": "9.39.4", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", - "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.2", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.5", - "@eslint/js": "9.39.4", - "@eslint/plugin-kit": "^0.4.1", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.14.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.5", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">= 0.4" }, "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-compat-utils": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", - "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, "license": "MIT", "dependencies": { - "semver": "^7.5.4" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { - "node": ">=12" + "node": ">= 0.4" }, - "peerDependencies": { - "eslint": ">=6.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-config-prettier": { - "version": "10.1.8", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", - "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, - "funding": { - "url": "https://opencollective.com/eslint-config-prettier" + "engines": { + "node": ">= 0.4" }, - "peerDependencies": { - "eslint": ">=7.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-config-webpack": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/eslint-config-webpack/-/eslint-config-webpack-4.9.6.tgz", - "integrity": "sha512-4g1VqqOVgPrO/2bh17qNRKsQK26Aw1WF9mVTnvF+rNTDIUUTx+IaukXqXlumzwApQ1GfJlOsdLvT6WER1SPePg==", + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, "license": "MIT", "dependencies": { - "@eslint/js": "^9.39.2", - "@eslint/markdown": "^8.0.1", - "@stylistic/eslint-plugin": "^5.10.0", - "detect-indent": "^7.0.2", - "eslint-config-prettier": "^10.1.8", - "eslint-plugin-import": "^2.32.0", - "eslint-plugin-jest": "^29.15.2", - "eslint-plugin-jsdoc": "^62.9.0", - "eslint-plugin-n": "^18.0.1", - "eslint-plugin-prettier": "^5.5.5", - "eslint-plugin-react": "^7.37.5", - "eslint-plugin-react-hooks": "^7.1.1", - "eslint-plugin-unicorn": "^64.0.0", - "globals": "^17.6.0", - "jsonc-eslint-parser": "^3.1.0", - "semver": "^7.8.0", - "sort-package-json": "^3.6.0", - "typescript-eslint": "^8.59.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { - "node": ">= 20.9.0" - }, - "peerDependencies": { - "eslint": ">= 9.28.0", - "typescript": ">=4.8.4 <7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">= 0.4" } }, - "node_modules/eslint-config-webpack/node_modules/globals": { - "version": "17.6.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz", - "integrity": "sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, "engines": { - "node": ">=18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", "dev": true, "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "engines": { + "node": ">= 0.4" } }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } + "license": "MIT" }, - "node_modules/eslint-module-utils": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", - "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, "license": "MIT", "dependencies": { - "debug": "^3.2.7" + "possible-typed-array-names": "^1.0.0" }, "engines": { - "node": ">=4" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/axios": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.17.0.tgz", + "integrity": "sha512-J8SwNxprqqpbfenehxWYXE7CW+wM1BB4w3+N+g+/Wx40xM4rsLrfPmHHxSWIxJLYDgSY/HqlFPIYb2/S3rxafw==", "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" } }, - "node_modules/eslint-plugin-es-x": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", - "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, - "funding": [ - "https://github.com/sponsors/ota-meshi", - "https://opencollective.com/eslint" - ], - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.1.2", - "@eslint-community/regexpp": "^4.11.0", - "eslint-compat-utils": "^0.5.1" + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.35", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.35.tgz", + "integrity": "sha512-honAfLBde0HAFLdNyBEfuuENkF6zR+ozxqxa/2zJKHBe1qzLqyTSeRKpdPEHAP03rlDGyQOPnCSxnVpVqQo9Mg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" }, "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": ">=8" + "node": ">=6.0.0" } }, - "node_modules/eslint-plugin-import": { - "version": "2.32.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", - "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "node_modules/better-path-resolve": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz", + "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==", "dev": true, "license": "MIT", "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.9", - "array.prototype.findlastindex": "^1.2.6", - "array.prototype.flat": "^1.3.3", - "array.prototype.flatmap": "^1.3.3", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.1", - "hasown": "^2.0.2", - "is-core-module": "^2.16.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.1", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.9", - "tsconfig-paths": "^3.15.0" + "is-windows": "^1.0.0" }, "engines": { "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/eslint-plugin-jest": { - "version": "29.15.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.15.2.tgz", - "integrity": "sha512-kEN4r9RZl1xcsb4arGq89LrcVdOUFII/JSCwtTPJyv16mDwmPrcuEQwpxqZHeINvcsd7oK5O/rhdGlxFRaZwvQ==", + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "@typescript-eslint/utils": "^8.0.0" + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" }, - "engines": { - "node": "^20.12.0 || ^22.0.0 || >=24.0.0" + "bin": { + "browserslist": "cli.js" }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^8.0.0", - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "jest": "*", - "typescript": ">=4.8.4 <7.0.0" + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/builtin-modules": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-5.2.0.tgz", + "integrity": "sha512-02yxLeyxF4dNl6SlY6/5HfRSrSdZ/sCPoxy2kZNP5dZZX8LSAD9aE2gtJIUgWrsQTiMPl3mxESyrobSwvRGisQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.20" }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - }, - "typescript": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-jsdoc": { - "version": "62.9.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-62.9.0.tgz", - "integrity": "sha512-PY7/X4jrVgoIDncUmITlUqK546Ltmx/Pd4Hdsu4CvSjryQZJI2mEV4vrdMufyTetMiZ5taNSqvK//BTgVUlNkA==", + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "@es-joy/jsdoccomment": "~0.86.0", - "@es-joy/resolve.exports": "1.2.0", - "are-docs-informative": "^0.0.2", - "comment-parser": "1.4.6", - "debug": "^4.4.3", - "escape-string-regexp": "^4.0.0", - "espree": "^11.2.0", - "esquery": "^1.7.0", - "html-entities": "^2.6.0", - "object-deep-merge": "^2.0.0", - "parse-imports-exports": "^0.2.4", - "semver": "^7.7.4", - "spdx-expression-parse": "^4.0.0", - "to-valid-identifier": "^1.0.0" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" }, "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "node": ">= 0.4" }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, - "funding": { - "url": "https://opencollective.com/eslint" + "engines": { + "node": ">= 0.4" } }, - "node_modules/eslint-plugin-jsdoc/node_modules/espree": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", - "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "acorn": "^8.16.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^5.0.1" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "node": ">= 0.4" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-n": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-18.0.1.tgz", - "integrity": "sha512-q3ARhk+eZRc7myR0KHx+R3/GJeOHF+Ir6PK95Pu2tEX8Sl/4BIpmmVLva2kPrjC2gCmn6WHlHm+3yeo6Rxhycw==", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.5.0", - "enhanced-resolve": "^5.17.1", - "eslint-plugin-es-x": "^7.8.0", - "get-tsconfig": "^4.8.1", - "globals": "^15.11.0", - "globrex": "^0.1.2", - "ignore": "^5.3.2", - "semver": "^7.6.3" - }, "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": ">=8.57.1", - "ts-declaration-location": "^1.0.6", - "typescript": ">=5.0.0" - }, - "peerDependenciesMeta": { - "ts-declaration-location": { - "optional": true + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001797", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001797.tgz", + "integrity": "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" }, - "typescript": { - "optional": true + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } - } + ], + "license": "CC-BY-4.0" }, - "node_modules/eslint-plugin-n/node_modules/globals": { - "version": "15.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", - "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=18" - }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/eslint-plugin-prettier": { - "version": "5.5.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz", - "integrity": "sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==", + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "dev": true, "license": "MIT", - "dependencies": { - "prettier-linter-helpers": "^1.0.1", - "synckit": "^0.11.12" - }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/eslint-plugin-react": { - "version": "7.37.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", - "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "node_modules/chalk-template": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.2.tgz", + "integrity": "sha512-2bxTP2yUH7AJj/VAXfcA+4IcWGdQ87HwBANLt5XxGTeomo8yG0y95N1um9i5StvhT/Bl0/2cARA5v1PpPXUxUA==", "dev": true, "license": "MIT", "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.3", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.2.1", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.9", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.1", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.12", - "string.prototype.repeat": "^1.0.0" + "chalk": "^5.2.0" }, "engines": { - "node": ">=4" + "node": ">=14.16" }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" } }, - "node_modules/eslint-plugin-react-hooks": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", - "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", + "node_modules/change-case": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/core": "^7.24.4", - "@babel/parser": "^7.24.4", - "hermes-parser": "^0.25.1", - "zod": "^3.25.0 || ^4.0.0", - "zod-validation-error": "^3.5.0 || ^4.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "node_modules/chardet": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=6.0" } }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/eslint-plugin-unicorn": { - "version": "64.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-64.0.0.tgz", - "integrity": "sha512-rNZwalHh8i0UfPlhNwg5BTUO1CMdKNmjqe+TgzOTZnpKoi8VBgsW7u9qCHIdpxEzZ1uwrJrPF0uRb7l//K38gA==", + "node_modules/clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "@eslint-community/eslint-utils": "^4.9.1", - "change-case": "^5.4.4", - "ci-info": "^4.4.0", - "clean-regexp": "^1.0.0", - "core-js-compat": "^3.49.0", - "find-up-simple": "^1.0.1", - "globals": "^17.4.0", - "indent-string": "^5.0.0", - "is-builtin-module": "^5.0.0", - "jsesc": "^3.1.0", - "pluralize": "^8.0.0", - "regexp-tree": "^0.1.27", - "regjsparser": "^0.13.0", - "semver": "^7.7.4", - "strip-indent": "^4.1.1" + "escape-string-regexp": "^1.0.5" }, "engines": { - "node": "^20.10.0 || >=21.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" - }, - "peerDependencies": { - "eslint": ">=9.38.0" + "node": ">=4" } }, - "node_modules/eslint-plugin-unicorn/node_modules/globals": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz", - "integrity": "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==", + "node_modules/clean-regexp/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8.0" } }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "restore-cursor": "^5.0.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "node_modules/cli-truncate": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.2.0.tgz", + "integrity": "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "dependencies": { + "slice-ansi": "^8.0.0", + "string-width": "^8.2.0" + }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=20" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/ansi-styles": { + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -6949,606 +3647,646 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=8" } }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=10" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "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==", + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" }, "engines": { - "node": ">=4" + "node": ">=7.0.0" } }, - "node_modules/esquery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", "dependencies": { - "estraverse": "^5.1.0" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">=0.10" + "node": ">= 0.8" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, + "license": "MIT", "engines": { - "node": ">=4.0" + "node": ">=20" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/comment-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-5.0.0.tgz", + "integrity": "sha512-uiqLcOiVDJtBP8WGkZHEP+FZIhTzP1dxvn59EfoYUi9gqupjrBWVQkO2atDrbnKPwLeotFYDsuNb26uBMqB+hw==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", + "dependencies": { + "array-timsort": "^1.0.3", + "esprima": "^4.0.1" + }, "engines": { - "node": ">=4.0" + "node": ">= 6" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/comment-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.6.tgz", + "integrity": "sha512-ObxuY6vnbWTN6Od72xfwN9DbzC7Y2vv8u1Soi9ahRKL37gb6y1qk6/dgjs+3JWuXJHWvsg3BXIwzd/rkmAwavg==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 12.0.0" } }, - "node_modules/eventemitter3": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", - "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true, "license": "MIT" }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-js-compat": { + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz", + "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.8.x" + "dependencies": { + "browserslist": "^4.28.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "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": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "node": ">= 8" } }, - "node_modules/exit-x": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", - "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", + "node_modules/cspell": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/cspell/-/cspell-10.0.1.tgz", + "integrity": "sha512-Gg6w/flT3fKfl3la62hfTnhtNnDQ+9mU7kUhVqw/axl/Ms4oENw0oJMkWFIoj4f6nL/SDPz7KcPXd2XbkKFNmQ==", "dev": true, "license": "MIT", + "dependencies": { + "@cspell/cspell-json-reporter": "10.0.1", + "@cspell/cspell-performance-monitor": "10.0.1", + "@cspell/cspell-pipe": "10.0.1", + "@cspell/cspell-types": "10.0.1", + "@cspell/cspell-worker": "10.0.1", + "@cspell/dynamic-import": "10.0.1", + "@cspell/url": "10.0.1", + "ansi-regex": "^6.2.2", + "chalk": "^5.6.2", + "chalk-template": "^1.1.2", + "commander": "^14.0.3", + "cspell-config-lib": "10.0.1", + "cspell-dictionary": "10.0.1", + "cspell-gitignore": "10.0.1", + "cspell-glob": "10.0.1", + "cspell-io": "10.0.1", + "cspell-lib": "10.0.1", + "fast-json-stable-stringify": "^2.1.0", + "flatted": "^3.4.2", + "semver": "^7.8.1", + "tinyglobby": "^0.2.16" + }, + "bin": { + "cspell": "bin.mjs", + "cspell-esm": "bin.mjs" + }, "engines": { - "node": ">= 0.8.0" + "node": ">=22.18.0" + }, + "funding": { + "url": "https://github.com/streetsidesoftware/cspell?sponsor=1" } }, - "node_modules/expect": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-30.3.0.tgz", - "integrity": "sha512-1zQrciTiQfRdo7qJM1uG4navm8DayFa2TgCSRlzUyNkhcJ6XUZF3hjnpkyr3VhAqPH7i/9GkG7Tv5abz6fqz0Q==", + "node_modules/cspell-config-lib": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/cspell-config-lib/-/cspell-config-lib-10.0.1.tgz", + "integrity": "sha512-hMpo/0j6k7pbiqrLDOLJKD2IGP9XwhjKf2miiM6p84Xeo4nyuFZaxxDCQ68R851HSYFrrdltgpoipMbj1h2Tnw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/expect-utils": "30.3.0", - "@jest/get-type": "30.1.0", - "jest-matcher-utils": "30.3.0", - "jest-message-util": "30.3.0", - "jest-mock": "30.3.0", - "jest-util": "30.3.0" + "@cspell/cspell-types": "10.0.1", + "comment-json": "^5.0.0", + "smol-toml": "^1.6.1", + "yaml": "^2.9.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=22.18.0" } }, - "node_modules/extendable-error": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz", - "integrity": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/fast-equals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-6.0.0.tgz", - "integrity": "sha512-PFhhIGgdM79r5Uztdj9Zb6Tt1zKafqVfdMGwVca1z5z6fbX7DmsySSuJd8HiP6I1j505DCS83cLxo5rmSNeVEA==", + "node_modules/cspell-dictionary": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-10.0.1.tgz", + "integrity": "sha512-3cZ659vgsZWkzGQJR/sNqGDVt/OnvTSieLKI76V++4t1bHJfochb9ZrrwsuMsb1VPGiyqClUP1/O6WrefF/FVg==", "dev": true, "license": "MIT", + "dependencies": { + "@cspell/cspell-performance-monitor": "10.0.1", + "@cspell/cspell-pipe": "10.0.1", + "@cspell/cspell-types": "10.0.1", + "cspell-trie-lib": "10.0.1", + "fast-equals": "^6.0.0" + }, "engines": { - "node": ">=6.0.0" + "node": ">=22.18.0" } }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "node_modules/cspell-gitignore": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-10.0.1.tgz", + "integrity": "sha512-wN23U61Mx6qPJN3CesOmBU9vnbJ0jQm/ylK0iaVui3CcnO7Zzl5qLu5mPHUzGQGm8yso6qjyxqo16Ho7LpZGOQ==", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" + "@cspell/url": "10.0.1", + "cspell-glob": "10.0.1", + "cspell-io": "10.0.1" + }, + "bin": { + "cspell-gitignore": "bin.mjs" }, "engines": { - "node": ">=8.6.0" + "node": ">=22.18.0" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/cspell-glob": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-10.0.1.tgz", + "integrity": "sha512-7bII9J3aSSpZDwhx7w+zfQXbMxHZQ3be0ilUp5bHrsjz6o07v/NqOHMGcwKdPn1sw2dxDz9sv057xE5pqXnSdw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "@cspell/url": "10.0.1", + "picomatch": "^4.0.4" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", - "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" + "node": ">=22.18.0" } }, - "node_modules/fault": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", - "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "node_modules/cspell-grammar": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-10.0.1.tgz", + "integrity": "sha512-xC9AFYmaI9wsO//a7S5tdDGKGJVD5UEEsTg+Up2fi7lPfXIryisYmV6tePNL1SEg0idYss4ja8LUZ3Mib09BjQ==", "dev": true, "license": "MIT", "dependencies": { - "format": "^0.2.0" + "@cspell/cspell-pipe": "10.0.1", + "@cspell/cspell-types": "10.0.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "bser": "2.1.1" + "bin": { + "cspell-grammar": "bin.mjs" + }, + "engines": { + "node": ">=22.18.0" } }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "node_modules/cspell-io": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-10.0.1.tgz", + "integrity": "sha512-8C2ka07faxflnaqEBO3pektS21XViE/SEHT7F5ZD1ou7FyMR5u3xawTBJSczClfsxLt/WYeztBYrpmGAjmjksw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" + "dependencies": { + "@cspell/cspell-service-bus": "10.0.1", + "@cspell/url": "10.0.1" }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } + "engines": { + "node": ">=22.18.0" } }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "node_modules/cspell-lib": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-10.0.1.tgz", + "integrity": "sha512-RpsIPiLzc4/YMW8BMRKpyJ81x439qjYWcqgdKeXnMkbKM88J9PexzutfFf/4v97v96KzfNitEzMpbI0uj8OeUg==", "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^4.0.0" + "@cspell/cspell-bundled-dicts": "10.0.1", + "@cspell/cspell-performance-monitor": "10.0.1", + "@cspell/cspell-pipe": "10.0.1", + "@cspell/cspell-resolver": "10.0.1", + "@cspell/cspell-types": "10.0.1", + "@cspell/dynamic-import": "10.0.1", + "@cspell/filetypes": "10.0.1", + "@cspell/rpc": "10.0.1", + "@cspell/strong-weak-map": "10.0.1", + "@cspell/url": "10.0.1", + "cspell-config-lib": "10.0.1", + "cspell-dictionary": "10.0.1", + "cspell-glob": "10.0.1", + "cspell-grammar": "10.0.1", + "cspell-io": "10.0.1", + "cspell-trie-lib": "10.0.1", + "env-paths": "^4.0.0", + "gensequence": "^8.0.8", + "import-fresh": "^4.0.0", + "resolve-from": "^5.0.0", + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-uri": "^3.1.0", + "xdg-basedir": "^5.1.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=22.18.0" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/cspell-trie-lib": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-10.0.1.tgz", + "integrity": "sha512-BFvhalSkRQFjKrZ//FKK7fRGrZFpifnxB5AwCkzsIsBZqicsfafcQ1xP21qpb0QqyV/IomjNgviG+tRJs+0rMw==", "dev": true, "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, "engines": { - "node": ">=8" + "node": ">=22.18.0" + }, + "peerDependencies": { + "@cspell/cspell-types": "10.0.1" } }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, "engines": { - "node": ">=18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/inspect-js" } }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, "license": "MIT", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { - "node": ">=16" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/flatted": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "node_modules/dataloader": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz", + "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==", "dev": true, - "license": "ISC" + "license": "BSD-3-Clause" }, - "node_modules/follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, "engines": { - "node": ">=4.0" + "node": ">=6.0" }, "peerDependenciesMeta": { - "debug": { + "supports-color": { "optional": true } } }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", "dev": true, "license": "MIT", "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" + "character-entities": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, - "license": "ISC", + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { - "node": ">=14" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, "engines": { - "node": ">=14" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, "engines": { - "node": ">= 6" + "node": ">=0.4.0" } }, - "node_modules/format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.4.x" + "node": ">=6" } }, - "node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", "dev": true, "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=8" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/detect-newline": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-4.0.1.tgz", + "integrity": "sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==", "dev": true, - "hasInstallScript": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", "dev": true, "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" + "path-type": "^4.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/generator-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, "engines": { "node": ">= 0.4" } }, - "node_modules/gensequence": { - "version": "8.0.8", - "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-8.0.8.tgz", - "integrity": "sha512-omMVniXEXpdx/vKxGnPRoO2394Otlze28TyxECbFVyoSpZ9H3EO7lemjcB12OpQJzRW4e5tt/dL1rOxry6aMHg==", + "node_modules/electron-to-chromium": { + "version": "1.5.370", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.370.tgz", + "integrity": "sha512-D5tSHJReAb/Kf3Hu9F/GO4lJuSWzEWHwvQ/kKSUP7pimNgvxkSKj+gUQhHpKKACwrin7rS3byU7IxreF56rl5g==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.23.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.23.0.tgz", + "integrity": "sha512-yJN/BOOLxcOW2aQgeif9mSnaUB8KtvmMMp56oA1kx1CRfBKbhZm2pJ+NBY+3eOboHxix8lfjWpHE0Ei5U8RbSA==", "dev": true, "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, "engines": { - "node": ">=20" + "node": ">=10.13.0" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "dev": true, "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, "engines": { - "node": ">=6.9.0" + "node": ">=8.6" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "node_modules/env-paths": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-4.0.0.tgz", + "integrity": "sha512-pxP8eL2SwwaTRi/KHYwLYXinDs7gL3jxFcBYmEdYfZmZXbaVDvdppd0XBU8qVz03rDfKZMXg1omHCbsJjZrMsw==", "dev": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "is-safe-filename": "^0.1.0" + }, "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-east-asian-width": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", - "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, "license": "MIT", "engines": { @@ -7558,23 +4296,67 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "node_modules/es-abstract": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" }, "engines": { "node": ">= 0.4" @@ -7583,170 +4365,292 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, "license": "MIT", "engines": { - "node": ">=8.0.0" + "node": ">= 0.4" } }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.2.tgz", + "integrity": "sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==", "dev": true, "license": "MIT", "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" } }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=10" + "dependencies": { + "es-errors": "^1.3.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 0.4" } }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.4" } }, - "node_modules/get-tsconfig": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", - "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, "license": "MIT", "dependencies": { - "resolve-pkg-maps": "^1.0.0" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/git-hooks-list": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/git-hooks-list/-/git-hooks-list-4.2.1.tgz", - "integrity": "sha512-WNvqJjOxxs/8ZP9+DWdwWJ7cDsd60NHf39XnD82pDVrKO5q7xfPqpkK6hwEAmBa/ZSEE4IOoR75EzbbIuwGlMw==", + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/fisker/git-hooks-list?sponsor=1" + "engines": { + "node": ">=6" } }, - "node_modules/github-slugger": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", - "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "node_modules/eslint": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": "*" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/eslint-compat-utils": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.3" + "semver": "^7.5.4" }, "engines": { - "node": ">=10.13.0" + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" } }, - "node_modules/glob-to-regex.js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", - "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "url": "https://opencollective.com/eslint-config-prettier" }, "peerDependencies": { - "tslib": "2" + "eslint": ">=7.0.0" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/global-directory": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-5.0.0.tgz", - "integrity": "sha512-1pgFdhK3J2LeM+dVf2Pd424yHx2ou338lC0ErNP2hPx4j8eW1Sp0XqSjNxtk6Tc4Kr5wlWtSvz8cn2yb7/SG/w==", + "node_modules/eslint-config-webpack": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/eslint-config-webpack/-/eslint-config-webpack-4.9.6.tgz", + "integrity": "sha512-4g1VqqOVgPrO/2bh17qNRKsQK26Aw1WF9mVTnvF+rNTDIUUTx+IaukXqXlumzwApQ1GfJlOsdLvT6WER1SPePg==", "dev": true, "license": "MIT", "dependencies": { - "ini": "6.0.0" + "@eslint/js": "^9.39.2", + "@eslint/markdown": "^8.0.1", + "@stylistic/eslint-plugin": "^5.10.0", + "detect-indent": "^7.0.2", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jest": "^29.15.2", + "eslint-plugin-jsdoc": "^62.9.0", + "eslint-plugin-n": "^18.0.1", + "eslint-plugin-prettier": "^5.5.5", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-unicorn": "^64.0.0", + "globals": "^17.6.0", + "jsonc-eslint-parser": "^3.1.0", + "semver": "^7.8.0", + "sort-package-json": "^3.6.0", + "typescript-eslint": "^8.59.3" }, "engines": { - "node": ">=20" + "node": ">= 20.9.0" + }, + "peerDependencies": { + "eslint": ">= 9.28.0", + "typescript": ">=4.8.4 <7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-webpack/node_modules/detect-indent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.2.tgz", + "integrity": "sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "node_modules/eslint-config-webpack/node_modules/globals": { + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz", + "integrity": "sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==", "dev": true, "license": "MIT", "engines": { @@ -7756,795 +4660,911 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "node_modules/eslint-import-resolver-node": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", "dev": true, "license": "MIT", "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "debug": "^3.2.7", + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.13.0.tgz", + "integrity": "sha512-bLohSkT6469rRs8czj0tLTD8vaeIS/whvPRJVjDr7IuoTT1k5DYDERlNycjDj/HkOlvQdYurmfZ/g3fG5bgeLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" }, "engines": { - "node": ">=10" + "node": ">=4" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "node_modules/eslint-plugin-es-x": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", + "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", "dev": true, + "funding": [ + "https://github.com/sponsors/ota-meshi", + "https://opencollective.com/eslint" + ], "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.11.0", + "eslint-compat-utils": "^0.5.1" + }, "engines": { - "node": ">= 0.4" + "node": "^14.18.0 || >=16.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "eslint": ">=8" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=4" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "node_modules/eslint-plugin-jest": { + "version": "29.15.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.15.2.tgz", + "integrity": "sha512-kEN4r9RZl1xcsb4arGq89LrcVdOUFII/JSCwtTPJyv16mDwmPrcuEQwpxqZHeINvcsd7oK5O/rhdGlxFRaZwvQ==", "dev": true, "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0" + "@typescript-eslint/utils": "^8.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^20.12.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^8.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "jest": "*", + "typescript": ">=4.8.4 <7.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + }, + "typescript": { + "optional": true + } } }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "node_modules/eslint-plugin-jsdoc": { + "version": "62.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-62.9.0.tgz", + "integrity": "sha512-PY7/X4jrVgoIDncUmITlUqK546Ltmx/Pd4Hdsu4CvSjryQZJI2mEV4vrdMufyTetMiZ5taNSqvK//BTgVUlNkA==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "dunder-proto": "^1.0.0" + "@es-joy/jsdoccomment": "~0.86.0", + "@es-joy/resolve.exports": "1.2.0", + "are-docs-informative": "^0.0.2", + "comment-parser": "1.4.6", + "debug": "^4.4.3", + "escape-string-regexp": "^4.0.0", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "html-entities": "^2.6.0", + "object-deep-merge": "^2.0.0", + "parse-imports-exports": "^0.2.4", + "semver": "^7.7.4", + "spdx-expression-parse": "^4.0.0", + "to-valid-identifier": "^1.0.0" }, "engines": { - "node": ">= 0.4" + "node": "^20.19.0 || ^22.13.0 || >=24" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" } }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">= 0.4" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "node_modules/eslint-plugin-jsdoc/node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "has-symbols": "^1.0.3" + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" }, "engines": { - "node": ">= 0.4" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "node_modules/eslint-plugin-n": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-18.1.0.tgz", + "integrity": "sha512-hkUm9EtnFV2h2fE16jNVUfCVUqvPzI7fGLsFdun5lFt/pbmf2kCgDx6ymi9rx+NCUSggBmurJCZOfG20JBs/kg==", "dev": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.2" + "@eslint-community/eslint-utils": "^4.5.0", + "enhanced-resolve": "^5.17.1", + "eslint-plugin-es-x": "^7.8.0", + "get-tsconfig": "^4.8.1", + "globals": "^15.11.0", + "globrex": "^0.1.2", + "ignore": "^5.3.2", + "semver": "^7.6.3" }, "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hermes-estree": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", - "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", - "dev": true, - "license": "MIT" - }, - "node_modules/hermes-parser": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", - "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "hermes-estree": "0.25.1" - } - }, - "node_modules/html-entities": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", - "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": ">=8.57.1", + "ts-declaration-location": "^1.0.6", + "typescript": ">=5.0.0" + }, + "peerDependenciesMeta": { + "ts-declaration-location": { + "optional": true }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" + "typescript": { + "optional": true } - ], - "license": "MIT" - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/human-id": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/human-id/-/human-id-4.1.3.tgz", - "integrity": "sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==", - "dev": true, - "license": "MIT", - "bin": { - "human-id": "dist/cli.js" } }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "node_modules/eslint-plugin-n/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "engines": { - "node": ">=10.17.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/husky": { - "version": "9.1.7", - "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", - "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "node_modules/eslint-plugin-prettier": { + "version": "5.5.6", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.6.tgz", + "integrity": "sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ==", "dev": true, "license": "MIT", - "bin": { - "husky": "bin.js" + "dependencies": { + "prettier-linter-helpers": "^1.0.1", + "synckit": "^0.11.13" }, "engines": { - "node": ">=18" + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/typicode" + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } } }, - "node_modules/hyperdyperid": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", - "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", "dev": true, "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, "engines": { - "node": ">=10.18" + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, - "node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "node_modules/eslint-plugin-react-hooks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", "dev": true, "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=18" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" } }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "node_modules/eslint-plugin-unicorn": { + "version": "64.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-64.0.0.tgz", + "integrity": "sha512-rNZwalHh8i0UfPlhNwg5BTUO1CMdKNmjqe+TgzOTZnpKoi8VBgsW7u9qCHIdpxEzZ1uwrJrPF0uRb7l//K38gA==", "dev": true, "license": "MIT", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "@babel/helper-validator-identifier": "^7.28.5", + "@eslint-community/eslint-utils": "^4.9.1", + "change-case": "^5.4.4", + "ci-info": "^4.4.0", + "clean-regexp": "^1.0.0", + "core-js-compat": "^3.49.0", + "find-up-simple": "^1.0.1", + "globals": "^17.4.0", + "indent-string": "^5.0.0", + "is-builtin-module": "^5.0.0", + "jsesc": "^3.1.0", + "pluralize": "^8.0.0", + "regexp-tree": "^0.1.27", + "regjsparser": "^0.13.0", + "semver": "^7.7.4", + "strip-indent": "^4.1.1" }, "engines": { - "node": ">=6" + "node": "^20.10.0 || >=21.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" + }, + "peerDependencies": { + "eslint": ">=9.38.0" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "node_modules/eslint-plugin-unicorn/node_modules/globals": { + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz", + "integrity": "sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-meta-resolve": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", - "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://opencollective.com/eslint" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">=0.8.19" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/ini": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", - "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", - "dev": true, - "license": "ISC", + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" + "p-locate": "^5.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", "dependencies": { - "has-bigints": "^1.0.2" + "p-limit": "^3.0.2" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "node_modules/eslint/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", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/is-builtin-module": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-5.0.0.tgz", - "integrity": "sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==", + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { - "builtin-modules": "^5.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=18.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "node_modules/eslint/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "hasown": "^2.0.2" + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/eslint" } }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "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": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" + "estraverse": "^5.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=4.0" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "engines": { - "node": ">=0.10.0" + "node": ">=4.0" } }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, + "license": "BSD-2-Clause", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/is-fullwidth-code-point": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", - "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.3.1" - }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8.x" } }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "node_modules/extendable-error": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz", + "integrity": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-equals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-6.0.0.tgz", + "integrity": "sha512-PFhhIGgdM79r5Uztdj9Zb6Tt1zKafqVfdMGwVca1z5z6fbX7DmsySSuJd8HiP6I1j505DCS83cLxo5rmSNeVEA==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=6.0.0" } }, - "node_modules/is-generator-function": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.4", - "generator-function": "^2.0.0", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8.6.0" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "is-extglob": "^2.1.1" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "format": "^0.2.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" + "node": ">=12.0.0" }, - "engines": { - "node": ">= 0.4" + "peerDependencies": { + "picomatch": "^3 || ^4" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "flat-cache": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/is-safe-filename": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-safe-filename/-/is-safe-filename-0.1.1.tgz", - "integrity": "sha512-4SrR7AdnY11LHfDKTZY1u6Ga3RuxZdl3YKWWShO5iyuG5h8QS4GD2tOb04peBJ5I7pXbR+CGBNEhTcwK+FzN3g==", + "node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, "engines": { - "node": ">=20" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "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", "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=16" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" + "is-callable": "^1.2.7" }, "engines": { "node": ">= 0.4" @@ -8553,74 +5573,77 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-subdir": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz", - "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==", + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "dev": true, "license": "MIT", "dependencies": { - "better-path-resolve": "1.0.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=4" + "node": ">= 6" } }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.4.x" } }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.16" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6 <7 || >=8" } }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" }, "engines": { "node": ">= 0.4" @@ -8629,1385 +5652,1122 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "node_modules/gensequence": { + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-8.0.8.tgz", + "integrity": "sha512-omMVniXEXpdx/vKxGnPRoO2394Otlze28TyxECbFVyoSpZ9H3EO7lemjcB12OpQJzRW4e5tt/dL1rOxry6aMHg==", "dev": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">=20" + } }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, + "license": "ISC", "engines": { - "node": ">=10" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "node_modules/get-east-asian-width": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/iterator.prototype": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", - "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, "license": "MIT", "dependencies": { - "define-data-property": "^1.1.4", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "get-proto": "^1.0.0", - "has-symbols": "^1.1.0", - "set-function-name": "^2.0.2" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "node_modules/get-tsconfig": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", + "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", "dependencies": { - "@isaacs/cliui": "^8.0.2" + "resolve-pkg-maps": "^1.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/jest": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-30.3.0.tgz", - "integrity": "sha512-AkXIIFcaazymvey2i/+F94XRnM6TsVLZDhBMLsd1Sf/W0wzsvvpjeyUrCZD6HGG4SDYPgDJDBKeiJTBb10WzMg==", + "node_modules/git-hooks-list": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/git-hooks-list/-/git-hooks-list-4.2.1.tgz", + "integrity": "sha512-WNvqJjOxxs/8ZP9+DWdwWJ7cDsd60NHf39XnD82pDVrKO5q7xfPqpkK6hwEAmBa/ZSEE4IOoR75EzbbIuwGlMw==", "dev": true, "license": "MIT", + "funding": { + "url": "https://github.com/fisker/git-hooks-list?sponsor=1" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "dev": true, + "license": "ISC" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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": { - "@jest/core": "30.3.0", - "@jest/types": "30.3.0", - "import-local": "^3.2.0", - "jest-cli": "30.3.0" - }, - "bin": { - "jest": "bin/jest.js" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "node": "*" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/jest-changed-files": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.3.0.tgz", - "integrity": "sha512-B/7Cny6cV5At6M25EWDgf9S617lHivamL8vl6KEpJqkStauzcG4e+WPfDgMMF+H4FVH4A2PLRyvgDJan4441QA==", + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "execa": "^5.1.1", - "jest-util": "30.3.0", - "p-limit": "^3.1.0" + "is-glob": "^4.0.3" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=10.13.0" } }, - "node_modules/jest-circus": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.3.0.tgz", - "integrity": "sha512-PyXq5szeSfR/4f1lYqCmmQjh0vqDkURUYi9N6whnHjlRz4IUQfMcXkGLeEoiJtxtyPqgUaUUfyQlApXWBSN1RA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "30.3.0", - "@jest/expect": "30.3.0", - "@jest/test-result": "30.3.0", - "@jest/types": "30.3.0", - "@types/node": "*", - "chalk": "^4.1.2", - "co": "^4.6.0", - "dedent": "^1.6.0", - "is-generator-fn": "^2.1.0", - "jest-each": "30.3.0", - "jest-matcher-utils": "30.3.0", - "jest-message-util": "30.3.0", - "jest-runtime": "30.3.0", - "jest-snapshot": "30.3.0", - "jest-util": "30.3.0", - "p-limit": "^3.1.0", - "pretty-format": "30.3.0", - "pure-rand": "^7.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.6" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-circus/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/glob-to-regex.js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", + "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, + "license": "Apache-2.0", "engines": { - "node": ">=8" + "node": ">=10.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/jest-circus/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/global-directory": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-5.0.0.tgz", + "integrity": "sha512-1pgFdhK3J2LeM+dVf2Pd424yHx2ou338lC0ErNP2hPx4j8eW1Sp0XqSjNxtk6Tc4Kr5wlWtSvz8cn2yb7/SG/w==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "ini": "6.0.0" }, "engines": { - "node": ">=10" + "node": ">=20" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-cli": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.3.0.tgz", - "integrity": "sha512-l6Tqx+j1fDXJEW5bqYykDQQ7mQg+9mhWXtnj+tQZrTWYHyHoi6Be8HPumDSA+UiX2/2buEgjA58iJzdj146uCw==", + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, "license": "MIT", - "dependencies": { - "@jest/core": "30.3.0", - "@jest/test-result": "30.3.0", - "@jest/types": "30.3.0", - "chalk": "^4.1.2", - "exit-x": "^0.2.2", - "import-local": "^3.2.0", - "jest-config": "30.3.0", - "jest-util": "30.3.0", - "jest-validate": "30.3.0", - "yargs": "^17.7.2" - }, - "bin": { - "jest": "bin/jest.js" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "node": ">=18" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-cli/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true, + "license": "MIT" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-cli/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-cli/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, "engines": { "node": ">=8" } }, - "node_modules/jest-cli/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" + "es-define-property": "^1.0.0" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-cli/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, "license": "MIT", "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "dunder-proto": "^1.0.0" }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-cli/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-config": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.3.0.tgz", - "integrity": "sha512-WPMAkMAtNDY9P/oKObtsRG/6KTrhtgPJoBTmk20uDn4Uy6/3EJnnaZJre/FMT1KVRx8cve1r7/FlMIOfRVWL4w==", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.27.4", - "@jest/get-type": "30.1.0", - "@jest/pattern": "30.0.1", - "@jest/test-sequencer": "30.3.0", - "@jest/types": "30.3.0", - "babel-jest": "30.3.0", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "deepmerge": "^4.3.1", - "glob": "^10.5.0", - "graceful-fs": "^4.2.11", - "jest-circus": "30.3.0", - "jest-docblock": "30.2.0", - "jest-environment-node": "30.3.0", - "jest-regex-util": "30.0.1", - "jest-resolve": "30.3.0", - "jest-runner": "30.3.0", - "jest-util": "30.3.0", - "jest-validate": "30.3.0", - "parse-json": "^5.2.0", - "pretty-format": "30.3.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" + "has-symbols": "^1.0.3" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "esbuild-register": ">=3.4.0", - "ts-node": ">=9.0.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "esbuild-register": { - "optional": true - }, - "ts-node": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-config/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "function-bind": "^1.1.2" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">= 0.4" } }, - "node_modules/jest-config/node_modules/brace-expansion": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", - "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } + "license": "MIT" }, - "node_modules/jest-config/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "hermes-estree": "0.25.1" } }, - "node_modules/jest-config/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "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", + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" }, - "node_modules/jest-config/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.2" + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 6" } }, - "node_modules/jest-diff": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.3.0.tgz", - "integrity": "sha512-n3q4PDQjS4LrKxfWB3Z5KNk1XjXtZTBwQp71OP0Jo03Z6V60x++K5L8k6ZrW8MY8pOFylZvHM0zsjS1RqlHJZQ==", + "node_modules/human-id": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/human-id/-/human-id-4.2.0.tgz", + "integrity": "sha512-K3GbkIWqyvvlpfhBPlbEvD97TtqBpAYA4kt+cn2lD2x2HuohzZCibcA2nOlnJT6exqvJLggoB5nv2dNf192nEA==", "dev": true, "license": "MIT", - "dependencies": { - "@jest/diff-sequences": "30.3.0", - "@jest/get-type": "30.1.0", - "chalk": "^4.1.2", - "pretty-format": "30.3.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "bin": { + "human-id": "dist/cli.js" } }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", "dev": true, "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" + "bin": { + "husky": "bin.js" }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/typicode" } }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=10.18" } }, - "node_modules/jest-docblock": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.2.0.tgz", - "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==", + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", "dev": true, "license": "MIT", "dependencies": { - "detect-newline": "^3.1.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/jest-each": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.3.0.tgz", - "integrity": "sha512-V8eMndg/aZ+3LnCJgSm13IxS5XSBM22QSZc9BtPK8Dek6pm+hfUNfwBdvsB3d342bo1q7wnSkC38zjX259qZNA==", + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", - "dependencies": { - "@jest/get-type": "30.1.0", - "@jest/types": "30.3.0", - "chalk": "^4.1.2", - "jest-util": "30.3.0", - "pretty-format": "30.3.0" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 4" } }, - "node_modules/jest-each/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/import-fresh": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-4.0.0.tgz", + "integrity": "sha512-Fpi660c7VPDM3fPKYovStd9IP1CPOikf6v/dGxJJMmHPcwYQIMJ4W7kO1avBYEpMqkCh+Dx3Ln6H7VYqgztLjw==", "dev": true, "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" + "node": ">=22.15" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-each/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/jest-environment-node": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.3.0.tgz", - "integrity": "sha512-4i6HItw/JSiJVsC5q0hnKIe/hbYfZLVG9YJ/0pU9Hz2n/9qZe3Rhn5s5CUZA5ORZlcdT/vmAXRMyONXJwPrmYQ==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", - "dependencies": { - "@jest/environment": "30.3.0", - "@jest/fake-timers": "30.3.0", - "@jest/types": "30.3.0", - "@types/node": "*", - "jest-mock": "30.3.0", - "jest-util": "30.3.0", - "jest-validate": "30.3.0" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=0.8.19" } }, - "node_modules/jest-haste-map": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.3.0.tgz", - "integrity": "sha512-mMi2oqG4KRU0R9QEtscl87JzMXfUhbKaFqOxmjb2CKcbHcUGFrJCBWHmnTiUqi6JcnzoBlO4rWfpdl2k/RfLCA==", + "node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, "license": "MIT", - "dependencies": { - "@jest/types": "30.3.0", - "@types/node": "*", - "anymatch": "^3.1.3", - "fb-watchman": "^2.0.2", - "graceful-fs": "^4.2.11", - "jest-regex-util": "30.0.1", - "jest-util": "30.3.0", - "jest-worker": "30.3.0", - "picomatch": "^4.0.3", - "walker": "^1.0.8" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=12" }, - "optionalDependencies": { - "fsevents": "^2.3.3" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-leak-detector": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.3.0.tgz", - "integrity": "sha512-cuKmUUGIjfXZAiGJ7TbEMx0bcqNdPPI6P1V+7aF+m/FUJqFDxkFR4JqkTu8ZOiU5AaX/x0hZ20KaaIPXQzbMGQ==", + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@jest/get-type": "30.1.0", - "pretty-format": "30.3.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/jest-matcher-utils": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.3.0.tgz", - "integrity": "sha512-HEtc9uFQgaUHkC7nLSlQL3Tph4Pjxt/yiPvkIrrDCt9jhoLIgxaubo1G+CFOnmHYMxHwwdaSN7mkIFs6ZK8OhA==", + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.1.0", - "chalk": "^4.1.2", - "jest-diff": "30.3.0", - "pretty-format": "30.3.0" - }, + "license": "ISC" + }, + "node_modules/ini": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", + "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", + "dev": true, + "license": "ISC", "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">= 0.4" } }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-message-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.3.0.tgz", - "integrity": "sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw==", + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@jest/types": "30.3.0", - "@types/stack-utils": "^2.0.3", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "picomatch": "^4.0.3", - "pretty-format": "30.3.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.6" + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "has-bigints": "^1.0.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-mock": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.3.0.tgz", - "integrity": "sha512-OTzICK8CpE+t4ndhKrwlIdbM6Pn8j00lvmSmq5ejiO+KxukbLjgOflKWMn3KE34EZdQm5RqTuKj+5RIEniYhog==", + "node_modules/is-builtin-module": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-5.0.0.tgz", + "integrity": "sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.3.0", - "@types/node": "*", - "jest-util": "30.3.0" + "builtin-modules": "^5.0.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" + "node": ">=18.20" }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-regex-util": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", - "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "license": "MIT", "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-resolve": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.3.0.tgz", - "integrity": "sha512-NRtTAHQlpd15F9rUR36jqwelbrDV/dY4vzNte3S2kxCKUJRYNd5/6nTSbYiak1VX5g8IoFF23Uj5TURkUW8O5g==", + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.3.0", - "jest-pnp-resolver": "^1.2.3", - "jest-util": "30.3.0", - "jest-validate": "30.3.0", - "slash": "^3.0.0", - "unrs-resolver": "^1.7.11" + "hasown": "^2.0.3" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-resolve-dependencies": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.3.0.tgz", - "integrity": "sha512-9ev8s3YN6Hsyz9LV75XUwkCVFlwPbaFn6Wp75qnI0wzAINYWY8Fb3+6y59Rwd3QaS3kKXffHXsZMziMavfz/nw==", + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, "license": "MIT", "dependencies": { - "jest-regex-util": "30.0.1", - "jest-snapshot": "30.3.0" + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-resolve/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-resolve/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=0.10.0" } }, - "node_modules/jest-runner": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.3.0.tgz", - "integrity": "sha512-gDv6C9LGKWDPLia9TSzZwf4h3kMQCqyTpq+95PODnTRDO0g9os48XIYYkS6D236vjpBir2fF63YmJFtqkS5Duw==", + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.3.0", - "@jest/environment": "30.3.0", - "@jest/test-result": "30.3.0", - "@jest/transform": "30.3.0", - "@jest/types": "30.3.0", - "@types/node": "*", - "chalk": "^4.1.2", - "emittery": "^0.13.1", - "exit-x": "^0.2.2", - "graceful-fs": "^4.2.11", - "jest-docblock": "30.2.0", - "jest-environment-node": "30.3.0", - "jest-haste-map": "30.3.0", - "jest-leak-detector": "30.3.0", - "jest-message-util": "30.3.0", - "jest-resolve": "30.3.0", - "jest-runtime": "30.3.0", - "jest-util": "30.3.0", - "jest-watcher": "30.3.0", - "jest-worker": "30.3.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" + "call-bound": "^1.0.3" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-runner/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "get-east-asian-width": "^1.3.1" }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-runner/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-runner/node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-runtime": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.3.0.tgz", - "integrity": "sha512-CgC+hIBJbuh78HEffkhNKcbXAytQViplcl8xupqeIWyKQF50kCQA8J7GeJCkjisC6hpnC9Muf8jV5RdtdFbGng==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.3.0", - "@jest/fake-timers": "30.3.0", - "@jest/globals": "30.3.0", - "@jest/source-map": "30.0.1", - "@jest/test-result": "30.3.0", - "@jest/transform": "30.3.0", - "@jest/types": "30.3.0", - "@types/node": "*", - "chalk": "^4.1.2", - "cjs-module-lexer": "^2.1.0", - "collect-v8-coverage": "^1.0.2", - "glob": "^10.5.0", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.3.0", - "jest-message-util": "30.3.0", - "jest-mock": "30.3.0", - "jest-regex-util": "30.0.1", - "jest-resolve": "30.3.0", - "jest-snapshot": "30.3.0", - "jest-util": "30.3.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" + "is-extglob": "^2.1.1" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=0.10.0" } }, - "node_modules/jest-runtime/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-runtime/node_modules/brace-expansion": { + "node_modules/is-negative-zero": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", - "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-runtime/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=0.12.0" } }, - "node_modules/jest-runtime/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "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", + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-runtime/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, + "license": "MIT", "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-snapshot": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.3.0.tgz", - "integrity": "sha512-f14c7atpb4O2DeNhwcvS810Y63wEn8O1HqK/luJ4F6M4NjvxmAKQwBUWjbExUtMxWJQ0wVgmCKymeJK6NZMnfQ==", + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.27.4", - "@babel/generator": "^7.27.5", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.27.1", - "@babel/types": "^7.27.3", - "@jest/expect-utils": "30.3.0", - "@jest/get-type": "30.1.0", - "@jest/snapshot-utils": "30.3.0", - "@jest/transform": "30.3.0", - "@jest/types": "30.3.0", - "babel-preset-current-node-syntax": "^1.2.0", - "chalk": "^4.1.2", - "expect": "30.3.0", - "graceful-fs": "^4.2.11", - "jest-diff": "30.3.0", - "jest-matcher-utils": "30.3.0", - "jest-message-util": "30.3.0", - "jest-util": "30.3.0", - "pretty-format": "30.3.0", - "semver": "^7.7.2", - "synckit": "^0.11.8" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-snapshot/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/is-safe-filename": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-safe-filename/-/is-safe-filename-0.1.1.tgz", + "integrity": "sha512-4SrR7AdnY11LHfDKTZY1u6Ga3RuxZdl3YKWWShO5iyuG5h8QS4GD2tOb04peBJ5I7pXbR+CGBNEhTcwK+FzN3g==", "dev": true, "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" + "node": ">=20" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-snapshot/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-util": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", - "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.3.0", - "@types/node": "*", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "graceful-fs": "^4.2.11", - "picomatch": "^4.0.3" + "call-bound": "^1.0.3" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/is-subdir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz", + "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "better-path-resolve": "1.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=4" } }, - "node_modules/jest-validate": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.3.0.tgz", - "integrity": "sha512-I/xzC8h5G+SHCb2P2gWkJYrNiTbeL47KvKeW5EzplkyxzBRBw1ssSHlI/jXec0ukH2q7x2zAWQm7015iusg62Q==", + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, "license": "MIT", "dependencies": { - "@jest/get-type": "30.1.0", - "@jest/types": "30.3.0", - "camelcase": "^6.3.0", - "chalk": "^4.1.2", - "leven": "^3.1.0", - "pretty-format": "30.3.0" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "which-typed-array": "^1.1.16" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "call-bound": "^1.0.3" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-watcher": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.3.0.tgz", - "integrity": "sha512-PJ1d9ThtTR8aMiBWUdcownq9mDdLXsQzJayTk4kmaBRHKvwNQn+ANveuhEBUyNI2hR1TVhvQ8D5kHubbzBHR/w==", + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "30.3.0", - "@jest/types": "30.3.0", - "@types/node": "*", - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "emittery": "^0.13.1", - "jest-util": "30.3.0", - "string-length": "^4.0.2" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-watcher/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=0.10.0" } }, - "node_modules/jest-watcher/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">= 0.4" } }, "node_modules/jest-worker": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.3.0.tgz", - "integrity": "sha512-DrCKkaQwHexjRUFTmPzs7sHQe0TSj9nvDALKGdwmK5mW9v7j90BudWirKAJHt3QQ9Dhrg1F7DogPzhChppkJpQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", - "@ungap/structured-clone": "^1.3.0", - "jest-util": "30.3.0", "merge-stream": "^2.0.0", - "supports-color": "^8.1.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-worker/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": { - "has-flag": "^4.0.0" + "supports-color": "^8.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">= 10.13.0" } }, "node_modules/js-tokens": { @@ -10018,10 +6778,20 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -10060,13 +6830,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT" - }, "node_modules/json-schema-to-typescript": { "version": "15.0.4", "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-15.0.4.tgz", @@ -10176,9 +6939,9 @@ } }, "node_modules/katex": { - "version": "0.16.45", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.45.tgz", - "integrity": "sha512-pQpZbdBu7wCTmQUh7ufPmLr0pFoObnGUoL/yhtwJDgmmQpbkg/0HSVti25Fu4rmd1oCR6NGWe9vqTWuWv3GcNA==", + "version": "0.16.47", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.47.tgz", + "integrity": "sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==", "dev": true, "funding": [ "https://opencollective.com/katex", @@ -10212,16 +6975,6 @@ "json-buffer": "3.0.1" } }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -10236,13 +6989,6 @@ "node": ">= 0.8.0" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, "node_modules/lint-staged": { "version": "17.0.7", "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-17.0.7.tgz", @@ -10300,16 +7046,16 @@ } }, "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" + "p-locate": "^6.0.0" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -10356,35 +7102,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/ansi-escapes": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", - "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "environment": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/log-update/node_modules/emoji-regex": { "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", @@ -10495,32 +7212,6 @@ "yallist": "^3.0.2" } }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" - } - }, "node_modules/markdown-table": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", @@ -11532,16 +8223,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/mimic-function": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", @@ -11578,16 +8259,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", @@ -11605,22 +8276,6 @@ "dev": true, "license": "MIT" }, - "node_modules/napi-postinstall": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", - "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", - "dev": true, - "license": "MIT", - "bin": { - "napi-postinstall": "lib/cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/napi-postinstall" - } - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -11635,6 +8290,35 @@ "dev": true, "license": "MIT" }, + "node_modules/node-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-exports-info/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -11668,41 +8352,14 @@ "node-gyp-build-test": "build-test.js" } }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "license": "MIT" - }, "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "version": "2.0.47", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz", + "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" + "node": ">=18" } }, "node_modules/object-assign": { @@ -11716,9 +8373,9 @@ } }, "node_modules/object-deep-merge": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-2.0.0.tgz", - "integrity": "sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-2.0.1.tgz", + "integrity": "sha512-aKttDKcU3pyZqKcCkDhsMn70WmZFG2JGDQLP9EcLyTSIFQRCPWLAmBZRLJnrVUrhPG1jETEEbfdgbNtJf1LyMg==", "dev": true, "license": "MIT" }, @@ -11846,16 +8503,16 @@ } }, "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" + "mimic-function": "^5.0.0" }, "engines": { - "node": ">=6" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -11918,32 +8575,32 @@ } }, "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.0" + "yocto-queue": "^1.0.0" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^3.0.2" + "p-limit": "^4.0.0" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -11969,13 +8626,6 @@ "node": ">=6" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, "node_modules/package-manager-detector": { "version": "0.2.11", "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.11.tgz", @@ -12009,25 +8659,6 @@ "parse-statements": "1.0.11" } }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/parse-statements": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz", @@ -12036,13 +8667,13 @@ "license": "MIT" }, "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==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/path-is-absolute": { @@ -12065,36 +8696,12 @@ "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": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "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": "ISC" + "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", @@ -12136,85 +8743,6 @@ "node": ">=6" } }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "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/pkg-dir/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/pkg-dir/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/pkg-dir/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/pkg-dir/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/pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -12246,9 +8774,9 @@ } }, "node_modules/prettier": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", - "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", + "version": "3.8.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.4.tgz", + "integrity": "sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q==", "dev": true, "license": "MIT", "bin": { @@ -12274,21 +8802,6 @@ "node": ">=6.0.0" } }, - "node_modules/pretty-format": { - "version": "30.3.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", - "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -12301,13 +8814,6 @@ "react-is": "^16.13.1" } }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true, - "license": "MIT" - }, "node_modules/proxy-from-env": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", @@ -12328,23 +8834,6 @@ "node": ">=6" } }, - "node_modules/pure-rand": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", - "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, "node_modules/quansync": { "version": "0.2.11", "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", @@ -12384,9 +8873,9 @@ "license": "MIT" }, "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true, "license": "MIT" }, @@ -12430,16 +8919,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/read-yaml-file/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -12541,13 +9020,16 @@ } }, "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.1", + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -12561,19 +9043,6 @@ "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", @@ -12611,35 +9080,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -12683,15 +9123,15 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, @@ -12802,9 +9242,9 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.3.tgz", + "integrity": "sha512-wnilbGyMxzbY7dNOl7jpKbLSjcfeweJWU5j4+u5qW+6/wuGD9KzIGOyZnQVSBM9E7DtWaaH3CyHkppYrKYoxwg==", "dev": true, "license": "ISC", "bin": { @@ -12887,15 +9327,15 @@ } }, "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" }, @@ -12907,14 +9347,14 @@ } }, "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "object-inspect": "^1.13.4" }, "engines": { "node": ">= 0.4" @@ -12963,11 +9403,17 @@ } }, "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, - "license": "ISC" + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/slash": { "version": "3.0.0", @@ -12996,19 +9442,6 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/smol-toml": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.1.tgz", @@ -13030,9 +9463,9 @@ "license": "MIT" }, "node_modules/sort-package-json": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-3.6.0.tgz", - "integrity": "sha512-fyJsPLhWvY7u2KsKPZn1PixbXp+1m7V8NWqU8CvgFRbMEX41Ffw1kD8n0CfJiGoaSfoAvbrqRRl/DcHO8omQOQ==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-3.7.1.tgz", + "integrity": "sha512-ssk1HG7whF8N/T1IsNAQrtHG5Cbdi0rAgRJZXYBr9hF5xaHnBNzUx/W6LcthEW7FhOwvZssbESZuO+GxssqAyA==", "dev": true, "license": "MIT", "dependencies": { @@ -13051,14 +9484,14 @@ "node": ">=20" } }, - "node_modules/sort-package-json/node_modules/detect-newline": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-4.0.1.tgz", - "integrity": "sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==", + "node_modules/sort-package-json/node_modules/detect-indent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.2.tgz", + "integrity": "sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==", "dev": true, "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -13096,19 +9529,6 @@ "signal-exit": "^4.0.1" } }, - "node_modules/spawndamnit/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/spdx-exceptions": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", @@ -13151,29 +9571,6 @@ "node": ">=16" } }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/stop-iteration-iterator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", @@ -13198,20 +9595,6 @@ "node": ">=0.6.19" } }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/string-width": { "version": "8.2.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.1.tgz", @@ -13229,32 +9612,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/string-width/node_modules/strip-ansi": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", @@ -13311,19 +9668,20 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", + "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" + "es-abstract": "^1.24.2", + "es-object-atoms": "^1.1.2", + "has-property-descriptors": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -13333,16 +9691,16 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", + "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "es-object-atoms": "^1.1.2" }, "engines": { "node": ">= 0.4" @@ -13382,30 +9740,6 @@ "node": ">=8" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/strip-ansi/node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -13417,23 +9751,13 @@ } }, "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=4" } }, "node_modules/strip-indent": { @@ -13463,16 +9787,19 @@ } }, "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "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": { "has-flag": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -13489,13 +9816,13 @@ } }, "node_modules/synckit": { - "version": "0.11.12", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", - "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.13.tgz", + "integrity": "sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==", "dev": true, "license": "MIT", "dependencies": { - "@pkgr/core": "^0.2.9" + "@pkgr/core": "^0.3.6" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -13531,9 +9858,9 @@ } }, "node_modules/terser": { - "version": "5.46.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.46.0.tgz", - "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", + "version": "5.48.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.48.0.tgz", + "integrity": "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -13610,37 +9937,6 @@ } } }, - "node_modules/terser-webpack-plugin/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/terser-webpack-plugin/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": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -13648,21 +9944,6 @@ "dev": true, "license": "MIT" }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/thingies": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.6.0.tgz", @@ -13717,13 +9998,6 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -13757,7 +10031,6 @@ "node_modules/tooling": { "version": "1.26.3", "resolved": "git+ssh://git@github.com/webpack/tooling.git#a28b891e51fdf374f3eb6f574a7cac1327b5ead8", - "integrity": "sha512-JTi8iqaemnXByj6eNglfU+5rrrz2hX0N4pKmk/AIErwv53YW4CZZixtfklVCiMJrghudhk09ejhhJHNYe/hC9w==", "dev": true, "license": "MIT", "dependencies": { @@ -13775,9 +10048,9 @@ } }, "node_modules/tooling/node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "dev": true, "license": "MIT", "dependencies": { @@ -13861,16 +10134,6 @@ "json5": "lib/cli.js" } }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -13891,29 +10154,6 @@ "node": ">= 0.8.0" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", @@ -13972,18 +10212,18 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", + "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" + "call-bind": "^1.0.9", + "for-each": "^0.3.5", + "gopd": "^1.2.0", + "is-typed-array": "^1.1.15", + "possible-typed-array-names": "^1.1.0", + "reflect.getprototypeof": "^1.0.10" }, "engines": { "node": ">= 0.4" @@ -14007,16 +10247,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.3.tgz", - "integrity": "sha512-KgusgyDgG4LI8Ih/sWaCtZ06tckLAS5CvT5A4D1Q7bYVoAAyzwiZvE4BmwDHkhRVkvhRBepKeASoFzQetha7Fg==", + "version": "8.61.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.61.0.tgz", + "integrity": "sha512-8y31Rd0eGTrDKqhy6vT0HtzhN+YLjQizwX3aA3hPXP/ynSfnrBXcQY5IzsP9/DM7+klX4IUncZZjkchP0z+rUw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.59.3", - "@typescript-eslint/parser": "8.59.3", - "@typescript-eslint/typescript-estree": "8.59.3", - "@typescript-eslint/utils": "8.59.3" + "@typescript-eslint/eslint-plugin": "8.61.0", + "@typescript-eslint/parser": "8.61.0", + "@typescript-eslint/typescript-estree": "8.61.0", + "@typescript-eslint/utils": "8.61.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -14050,9 +10290,9 @@ } }, "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "dev": true, "license": "MIT" }, @@ -14140,41 +10380,6 @@ "node": ">= 4.0.0" } }, - "node_modules/unrs-resolver": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", - "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "napi-postinstall": "^0.3.0" - }, - "funding": { - "url": "https://opencollective.com/unrs-resolver" - }, - "optionalDependencies": { - "@unrs/resolver-binding-android-arm-eabi": "1.11.1", - "@unrs/resolver-binding-android-arm64": "1.11.1", - "@unrs/resolver-binding-darwin-arm64": "1.11.1", - "@unrs/resolver-binding-darwin-x64": "1.11.1", - "@unrs/resolver-binding-freebsd-x64": "1.11.1", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", - "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", - "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", - "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-x64-musl": "1.11.1", - "@unrs/resolver-binding-wasm32-wasi": "1.11.1", - "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", - "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", - "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" - } - }, "node_modules/update-browserslist-db": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", @@ -14216,21 +10421,6 @@ "punycode": "^2.1.0" } }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "dev": true, - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, "node_modules/vscode-languageserver-textdocument": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", @@ -14245,16 +10435,6 @@ "dev": true, "license": "MIT" }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" - } - }, "node_modules/watchpack": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", @@ -14462,14 +10642,14 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.20", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", - "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", + "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", + "call-bind": "^1.0.9", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", @@ -14511,79 +10691,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/wrap-ansi/node_modules/strip-ansi": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", @@ -14607,33 +10714,6 @@ "dev": true, "license": "ISC" }, - "node_modules/write-file-atomic": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", - "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/write-file-atomic/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/xdg-basedir": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", @@ -14735,13 +10815,13 @@ } }, "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" diff --git a/package.json b/package.json index 7760dc52..83ef5dae 100644 --- a/package.json +++ b/package.json @@ -39,10 +39,10 @@ "fix:special": "node node_modules/tooling/inherit-types --write && node node_modules/tooling/generate-types --write", "type-report": "rimraf coverage && npm run cover:types && npm run cover:report && open-cli coverage/lcov-report/index.html", "pretest": "npm run lint", - "test": "npm run test:coverage", - "test:only": "jest", - "test:watch": "npm run test:only -- --watch", - "test:coverage": "npm run test:only -- --collectCoverageFrom=\"lib/**/*.js\" --coverage", + "test": "npm run test:only", + "test:only": "node scripts/test.js", + "test:watch": "node scripts/test.js --watch", + "test:coverage": "node scripts/test.js --experimental-test-coverage --test-coverage-include=\"lib/**\" --test-reporter=spec --test-reporter-destination=stdout --test-reporter=lcov --test-reporter-destination=coverage/lcov.info", "test:browser": "node --experimental-vm-modules test/smoke/browser-run.cjs", "version": "changeset version", "release": "changeset publish", @@ -66,13 +66,11 @@ "@changesets/get-github-info": "^0.8.0", "@codspeed/core": "^5.2.0", "@types/graceful-fs": "^4.1.6", - "@types/jest": "^30.0.0", "@types/node": "^24.10.4", "cspell": "^10.0.0", "eslint": "^9.39.2", "eslint-config-webpack": "^4.9.5", "husky": "^9.1.7", - "jest": "^30.3.0", "lint-staged": "^17.0.4", "memfs": "^4.56.11", "prettier": "^3.7.4", diff --git a/scripts/test.js b/scripts/test.js new file mode 100644 index 00000000..a911e05f --- /dev/null +++ b/scripts/test.js @@ -0,0 +1,38 @@ +"use strict"; + +// Runs the test suite with the Node.js built-in test runner. +// +// The files are enumerated explicitly instead of relying on `node --test` +// auto-discovery: the default discovery pattern treats every `.js` file under +// a `test/` directory as a test (including everything in `test/fixtures`), and +// native glob support in `node --test` is only available on newer Node.js +// versions. Passing an explicit list keeps behavior identical across the whole +// supported Node.js range and on every OS. + +const { spawn } = require("child_process"); +const { mkdirSync, readdirSync } = require("fs"); +const path = require("path"); + +const testDir = path.join(__dirname, "..", "test"); +const files = readdirSync(testDir) + .filter((file) => file.endsWith(".test.js")) + .sort() + .map((file) => path.join("test", file)); + +const nodeArgs = process.argv.slice(2); + +if (nodeArgs.includes("--experimental-test-coverage")) { + mkdirSync(path.join(__dirname, "..", "coverage"), { recursive: true }); +} + +const child = spawn(process.execPath, ["--test", ...nodeArgs, ...files], { + stdio: "inherit", +}); + +child.on("exit", (code, signal) => { + if (signal) { + process.kill(process.pid, signal); + } else { + process.exitCode = code === null ? 1 : code; + } +}); diff --git a/test/CachedInputFileSystem.test.js b/test/CachedInputFileSystem.test.js index cc520fff..954b790f 100644 --- a/test/CachedInputFileSystem.test.js +++ b/test/CachedInputFileSystem.test.js @@ -1,8 +1,11 @@ "use strict"; +const assert = require("assert"); + const path = require("path"); const url = require("url"); const { CachedInputFileSystem } = require("../"); +const { afterEach, beforeEach, describe, it } = require("./_runner"); describe("cachedInputFileSystem OperationMergerBackend ('stat' and 'statSync')", () => { let fs; @@ -40,39 +43,39 @@ describe("cachedInputFileSystem OperationMergerBackend ('stat' and 'statSync')", fs.purge(); }); - it("should join accesses", (done) => { + it("should join accesses", (t, done) => { fs.stat("a", (err, result) => { - expect(result).toBeDefined(); + assert.notStrictEqual(result, undefined); result.a = true; }); fs.stat("a", (err, result) => { - expect(result).toBeDefined(); - expect(result.a).toBeDefined(); + assert.notStrictEqual(result, undefined); + assert.notStrictEqual(result.a, undefined); done(); }); }); - it("should not join accesses with options", (done) => { + it("should not join accesses with options", (t, done) => { fs.stat("a", (err, result) => { - expect(result).toBeDefined(); + assert.notStrictEqual(result, undefined); result.a = true; - expect(result.path).toBe("a"); - expect(result.options).toBeUndefined(); + assert.strictEqual(result.path, "a"); + assert.strictEqual(result.options, undefined); }); fs.stat("a", { options: true }, (err, result) => { - expect(result).toBeDefined(); - expect(result.a).toBeUndefined(); - expect(result.path).toBe("a"); - expect(result.options).toMatchObject({ options: true }); + assert.notStrictEqual(result, undefined); + assert.strictEqual(result.a, undefined); + assert.strictEqual(result.path, "a"); + assert.strictEqual(result.options.options, true); done(); }); }); - it("should not cache accesses", (done) => { + it("should not cache accesses", (t, done) => { fs.stat("a", (err, result) => { result.a = true; fs.stat("a", (err, result) => { - expect(result.a).toBeUndefined(); + assert.strictEqual(result.a, undefined); done(); }); }); @@ -83,7 +86,7 @@ describe("cachedInputFileSystem OperationMergerBackend ('stat' and 'statSync')", result.a = true; const result2 = fs.statSync("a"); - expect(result2.a).toBeUndefined(); + assert.strictEqual(result2.a, undefined); }); }); @@ -123,42 +126,42 @@ describe("cachedInputFileSystem OperationMergerBackend ('lstat' and 'lstatSync') fs.purge(); }); - it("should join accesses", (done) => { + it("should join accesses", (t, done) => { fs.lstat("a", (err, result) => { - expect(result).toBeDefined(); + assert.notStrictEqual(result, undefined); result.a = true; }); fs.lstat("a", (err, result) => { - expect(result).toBeDefined(); - expect(result.a).toBeDefined(); + assert.notStrictEqual(result, undefined); + assert.notStrictEqual(result.a, undefined); done(); }); }); - it("should not join accesses with options", (done) => { + it("should not join accesses with options", (t, done) => { fs.lstat("a", (err, result) => { - expect(result).toBeDefined(); + assert.notStrictEqual(result, undefined); result.a = true; - expect(result).toBeDefined(); - expect(result.path).toBe("a"); - expect(result.options).toBeUndefined(); + assert.notStrictEqual(result, undefined); + assert.strictEqual(result.path, "a"); + assert.strictEqual(result.options, undefined); }); fs.lstat("a", { options: true }, (err, result) => { - expect(result).toBeDefined(); - expect(result.a).toBeUndefined(); - expect(result.path).toBe("a"); - expect(result.options).toMatchObject({ options: true }); + assert.notStrictEqual(result, undefined); + assert.strictEqual(result.a, undefined); + assert.strictEqual(result.path, "a"); + assert.strictEqual(result.options.options, true); done(); }); }); - it("should not cache accesses", (done) => { + it("should not cache accesses", (t, done) => { fs.lstat("a", (err, result) => { result.a = true; fs.lstat("a", (err, result) => { - expect(result.a).toBeUndefined(); + assert.strictEqual(result.a, undefined); done(); }); }); @@ -169,7 +172,7 @@ describe("cachedInputFileSystem OperationMergerBackend ('lstat' and 'lstatSync') result.a = true; const result2 = fs.lstatSync("a"); - expect(result2.a).toBeUndefined(); + assert.strictEqual(result2.a, undefined); }); }); @@ -209,42 +212,42 @@ describe("cachedInputFileSystem OperationMergerBackend ('realpath' and 'realpath fs.purge(); }); - it("should join accesses", (done) => { + it("should join accesses", (t, done) => { fs.realpath("a", (err, result) => { - expect(result).toBeDefined(); + assert.notStrictEqual(result, undefined); result.a = true; }); fs.realpath("a", (err, result) => { - expect(result).toBeDefined(); - expect(result.a).toBeDefined(); + assert.notStrictEqual(result, undefined); + assert.notStrictEqual(result.a, undefined); done(); }); }); - it("should not join accesses with options", (done) => { + it("should not join accesses with options", (t, done) => { fs.realpath("a", (err, result) => { - expect(result).toBeDefined(); + assert.notStrictEqual(result, undefined); result.a = true; - expect(result).toBeDefined(); - expect(result.path).toBe("a"); - expect(result.options).toBeUndefined(); + assert.notStrictEqual(result, undefined); + assert.strictEqual(result.path, "a"); + assert.strictEqual(result.options, undefined); }); fs.realpath("a", { options: true }, (err, result) => { - expect(result).toBeDefined(); - expect(result.a).toBeUndefined(); - expect(result.path).toBe("a"); - expect(result.options).toMatchObject({ options: true }); + assert.notStrictEqual(result, undefined); + assert.strictEqual(result.a, undefined); + assert.strictEqual(result.path, "a"); + assert.strictEqual(result.options.options, true); done(); }); }); - it("should not cache accesses", (done) => { + it("should not cache accesses", (t, done) => { fs.realpath("a", (err, result) => { result.a = true; fs.realpath("a", (err, result) => { - expect(result.a).toBeUndefined(); + assert.strictEqual(result.a, undefined); done(); }); }); @@ -255,7 +258,7 @@ describe("cachedInputFileSystem OperationMergerBackend ('realpath' and 'realpath result.a = true; const result2 = fs.realpathSync("a"); - expect(result2.a).toBeUndefined(); + assert.strictEqual(result2.a, undefined); }); }); @@ -298,61 +301,61 @@ describe("cachedInputFileSystem CacheBackend", () => { fs.purge(); }); - it("should join accesses", (done) => { + it("should join accesses", (t, done) => { fs.stat("a", (err, result) => { result.a = true; }); fs.stat("a", (err, result) => { - expect(result.a).toBeDefined(); + assert.notStrictEqual(result.a, undefined); done(); }); }); - it("should not call callback twice when combining sync and async calls", (done) => { + it("should not call callback twice when combining sync and async calls", (t, done) => { let called = false; fs.stat("a", (err, result) => { if (called) return done(new Error("callback was called twice")); called = true; - expect(result).toBeDefined(); + assert.notStrictEqual(result, undefined); result.a = true; done(); }); const syncResult = fs.statSync("a"); - expect(syncResult).toBeDefined(); - expect(syncResult.a).toBeDefined(); + assert.notStrictEqual(syncResult, undefined); + assert.notStrictEqual(syncResult.a, undefined); }); - it("should not join accesses with options", (done) => { + it("should not join accesses with options", (t, done) => { fs.stat("a", (err, result) => { result.a = true; - expect(result.path).toBe("a"); - expect(result.options).toBeUndefined(); + assert.strictEqual(result.path, "a"); + assert.strictEqual(result.options, undefined); }); fs.stat("a", { options: true }, (err, result) => { - expect(result.a).toBeUndefined(); - expect(result.path).toBe("a"); - expect(result.options).toMatchObject({ options: true }); + assert.strictEqual(result.a, undefined); + assert.strictEqual(result.path, "a"); + assert.strictEqual(result.options.options, true); done(); }); }); - it("should cache accesses", (done) => { + it("should cache accesses", (t, done) => { fs.stat("a", (err, result) => { result.a = true; let sync = true; fs.stat("a", (err, result) => { - expect(result.a).toBeDefined(); - expect(sync).toBe(true); + assert.notStrictEqual(result.a, undefined); + assert.strictEqual(sync, true); setTimeout(() => { fs.stat("a", (err, result) => { - expect(result.a).toBeUndefined(); + assert.strictEqual(result.a, undefined); result.b = true; let sync2 = true; fs.stat("a", (err, result) => { - expect(result.b).toBeDefined(); - expect(result.a).toBeUndefined(); - expect(sync2).toBe(true); + assert.notStrictEqual(result.b, undefined); + assert.strictEqual(result.a, undefined); + assert.strictEqual(sync2, true); done(); }); setTimeout(() => { @@ -371,26 +374,26 @@ describe("cachedInputFileSystem CacheBackend", () => { const result = fs.statSync("a"); result.a = true; const result2 = fs.statSync("a"); - expect(result2.a).toBeDefined(); + assert.notStrictEqual(result2.a, undefined); const result3 = fs.statSync("a", { options: true }); - expect(result3.a).toBeUndefined(); - expect(result3.options).toMatchObject({ options: true }); + assert.strictEqual(result3.a, undefined); + assert.strictEqual(result3.options.options, true); }); - it("should recover after passive periods", (done) => { + it("should recover after passive periods", (t, done) => { fs.stat("a", (err, result) => { result.a = true; setTimeout(() => { fs.stat("a", (err, result) => { - expect(result.a).toBeDefined(); + assert.notStrictEqual(result.a, undefined); setTimeout(() => { fs.stat("a", (err, result) => { - expect(result.a).toBeUndefined(); + assert.strictEqual(result.a, undefined); result.b = true; setTimeout(() => { fs.stat("a", (err, result) => { - expect(result.b).toBeDefined(); - expect(result.a).toBeUndefined(); + assert.notStrictEqual(result.b, undefined); + assert.strictEqual(result.a, undefined); done(); }); }, 500); @@ -401,17 +404,17 @@ describe("cachedInputFileSystem CacheBackend", () => { }); }); - it("should restart after timeout", (done) => { + it("should restart after timeout", (t, done) => { fs.stat("a", (err, result) => { result.a = true; setTimeout(() => { fs.stat("a", (err, result) => { - expect(result.a).toBeUndefined(); + assert.strictEqual(result.a, undefined); result.b = true; setTimeout(() => { fs.stat("a", (err, result) => { - expect(result.b).toBeDefined(); - expect(result.a).toBeUndefined(); + assert.notStrictEqual(result.b, undefined); + assert.strictEqual(result.a, undefined); done(); }); }, 50); @@ -420,36 +423,36 @@ describe("cachedInputFileSystem CacheBackend", () => { }); }); - it("should cache undefined value", (done) => { + it("should cache undefined value", (t, done) => { fs.stat(undefined, (_err, result) => { - expect(result).toBeUndefined(); + assert.strictEqual(result, undefined); fs.purge("a"); fs.purge(); done(); }); }); - it("should purge readdir correctly", (done) => { + it("should purge readdir correctly", (t, done) => { fs.readdir("/test/path", (err, r) => { - expect(r[0]).toBe("0"); + assert.strictEqual(r[0], "0"); fs.purge(["/test/path/sub/path"]); fs.readdir("/test/path", (err, r) => { - expect(r[0]).toBe("0"); + assert.strictEqual(r[0], "0"); fs.purge(["/test/path/sub"]); fs.readdir("/test/path", (err, r) => { - expect(r[0]).toBe("1"); + assert.strictEqual(r[0], "1"); fs.purge(["/test/path"]); fs.readdir("/test/path", (err, r) => { - expect(r[0]).toBe("2"); + assert.strictEqual(r[0], "2"); fs.purge([url.pathToFileURL("/test/path")]); fs.readdir("/test/path", (err, r) => { - expect(r[0]).toBe("2"); + assert.strictEqual(r[0], "2"); fs.purge(Buffer.from("/test/path")); fs.readdir("/test/path", (err, r) => { - expect(r[0]).toBe("3"); + assert.strictEqual(r[0], "3"); fs.purge([Buffer.from("/test/path")]); fs.readdir("/test/path", (err, r) => { - expect(r[0]).toBe("4"); + assert.strictEqual(r[0], "4"); done(); }); }); @@ -460,53 +463,53 @@ describe("cachedInputFileSystem CacheBackend", () => { }); }); - it("should not clear the entire cache when purging falsy keys 0 or ''", (done) => { + it("should not clear the entire cache when purging falsy keys 0 or ''", (t, done) => { // number 0 (a valid fd) and "" are valid cache keys per the signature; // passing them must not be confused with the no-arg "clear all" form. fs.stat("/test/path", (err, r1) => { r1.cached = true; fs.purge(0); fs.stat("/test/path", (err, r2) => { - expect(r2.cached).toBe(true); + assert.strictEqual(r2.cached, true); fs.purge(""); fs.stat("/test/path", (err, r3) => { // Empty string is a prefix of every key, so prefix-purge still clears // everything — but only because of the prefix semantics, not because // "" was misclassified as "no argument". - expect(r3.cached).toBeUndefined(); + assert.strictEqual(r3.cached, undefined); done(); }); }); }); }); - it("should not crash when options is null", (done) => { + it("should not crash when options is null", (t, done) => { fs.stat("/test/path", (err, r1) => { r1.cached = true; - expect(() => fs.purge("/test/path", null)).not.toThrow(); + assert.doesNotThrow(() => fs.purge("/test/path", null)); fs.stat("/test/path", (err, r2) => { // null is treated as "no options" — falls back to prefix purge - expect(r2.cached).toBeUndefined(); + assert.strictEqual(r2.cached, undefined); done(); }); }); }); - it("should purge exact entries only when exact: true", (done) => { + it("should purge exact entries only when exact: true", (t, done) => { fs.stat("/test/path", (err, r1) => { - expect(r1.path).toBe("/test/path"); + assert.strictEqual(r1.path, "/test/path"); r1.cached = true; fs.stat("/test/path/sub", (err, r2) => { - expect(r2.path).toBe("/test/path/sub"); + assert.strictEqual(r2.path, "/test/path/sub"); r2.cached = true; // Prefix purge with exact: true should NOT remove the child entry fs.purge("/test/path", { exact: true }); fs.stat("/test/path", (err, r3) => { // /test/path was the exact match, should be re-fetched (cached flag gone) - expect(r3.cached).toBeUndefined(); + assert.strictEqual(r3.cached, undefined); fs.stat("/test/path/sub", (err, r4) => { // /test/path/sub should still be cached - expect(r4.cached).toBe(true); + assert.strictEqual(r4.cached, true); done(); }); }); @@ -514,7 +517,7 @@ describe("cachedInputFileSystem CacheBackend", () => { }); }); - it("should purge an array exactly when exact: true", (done) => { + it("should purge an array exactly when exact: true", (t, done) => { fs.stat("/test/path", (err, r1) => { r1.cached = true; fs.stat("/test/path/sub", (err, r2) => { @@ -523,11 +526,11 @@ describe("cachedInputFileSystem CacheBackend", () => { r3.cached = true; fs.purge(["/test/path", "/other"], { exact: true }); fs.stat("/test/path", (err, r4) => { - expect(r4.cached).toBeUndefined(); + assert.strictEqual(r4.cached, undefined); fs.stat("/test/path/sub", (err, r5) => { - expect(r5.cached).toBe(true); + assert.strictEqual(r5.cached, true); fs.stat("/other", (err, r6) => { - expect(r6.cached).toBeUndefined(); + assert.strictEqual(r6.cached, undefined); done(); }); }); @@ -537,16 +540,16 @@ describe("cachedInputFileSystem CacheBackend", () => { }); }); - it("should still prefix-purge when exact is not set or false", (done) => { + it("should still prefix-purge when exact is not set or false", (t, done) => { fs.stat("/test/path", (err, r1) => { r1.cached = true; fs.stat("/test/path/sub", (err, r2) => { r2.cached = true; fs.purge("/test/path"); fs.stat("/test/path", (err, r3) => { - expect(r3.cached).toBeUndefined(); + assert.strictEqual(r3.cached, undefined); fs.stat("/test/path/sub", (err, r4) => { - expect(r4.cached).toBeUndefined(); + assert.strictEqual(r4.cached, undefined); done(); }); }); @@ -554,11 +557,11 @@ describe("cachedInputFileSystem CacheBackend", () => { }); }); - it("should purge readdir of the exact directory when exact: true", (done) => { + it("should purge readdir of the exact directory when exact: true", (t, done) => { fs.readdir("/test/path", (err, r1) => { - expect(r1[0]).toBe("0"); + assert.strictEqual(r1[0], "0"); fs.readdir("/test/path/sub", (err, r2) => { - expect(r2[0]).toBe("1"); + assert.strictEqual(r2[0], "1"); // Without exact, purging the dir path strips to dirname and prefix-purges // readdir for that parent — meaning readdir("/test/path") would NOT be evicted // by purge("/test/path/sub") in legacy mode (parent is "/test/path/", child of @@ -566,10 +569,10 @@ describe("cachedInputFileSystem CacheBackend", () => { // the caller is naming the directory itself, so it should evict directly. fs.purge("/test/path", { exact: true }); fs.readdir("/test/path", (err, r3) => { - expect(r3[0]).toBe("2"); + assert.strictEqual(r3[0], "2"); // sibling readdir cache should still be intact fs.readdir("/test/path/sub", (err, r4) => { - expect(r4[0]).toBe("1"); + assert.strictEqual(r4[0], "1"); done(); }); }); @@ -577,21 +580,21 @@ describe("cachedInputFileSystem CacheBackend", () => { }); }); - it("should accept Buffer with exact: true", (done) => { + it("should accept Buffer with exact: true", (t, done) => { fs.stat("/test/path", (err, r1) => { r1.cached = true; fs.stat("/test/path/sub", (err, r2) => { r2.cached = true; fs.purge(Buffer.from("/test/path"), { exact: true }); fs.stat("/test/path", (err, r3) => { - expect(r3.cached).toBeUndefined(); + assert.strictEqual(r3.cached, undefined); fs.stat("/test/path/sub", (err, r4) => { - expect(r4.cached).toBe(true); + assert.strictEqual(r4.cached, true); fs.purge([Buffer.from("/test/path/sub")], { exact: true, }); fs.stat("/test/path/sub", (err, r5) => { - expect(r5.cached).toBeUndefined(); + assert.strictEqual(r5.cached, undefined); done(); }); }); @@ -600,11 +603,11 @@ describe("cachedInputFileSystem CacheBackend", () => { }); }); - it("should not stack overflow when resolving in an async loop", (done) => { + it("should not stack overflow when resolving in an async loop", (t, done) => { let i = 10000; const next = () => { fs.stat(__dirname, (_err, result) => { - expect(result).toBeDefined(); + assert.notStrictEqual(result, undefined); if (i-- > 0) { next(); } else { @@ -652,17 +655,17 @@ describe("cachedInputFileSystem CacheBackend with Infinity duration", () => { }); it("should not crash the constructor with Infinity", () => { - expect(fs).toBeDefined(); + assert.notStrictEqual(fs, undefined); }); - it("should cache accesses forever", (done) => { + it("should cache accesses forever", (t, done) => { fs.stat("a", (err, result) => { result.a = true; fs.stat("a", (err, result) => { - expect(result.a).toBeDefined(); + assert.notStrictEqual(result.a, undefined); setTimeout(() => { fs.stat("a", (err, result) => { - expect(result.a).toBeDefined(); + assert.notStrictEqual(result.a, undefined); done(); }); }, 100); @@ -674,7 +677,7 @@ describe("cachedInputFileSystem CacheBackend with Infinity duration", () => { const result = fs.statSync("a"); result.a = true; const result2 = fs.statSync("a"); - expect(result2.a).toBeDefined(); + assert.notStrictEqual(result2.a, undefined); }); }); @@ -687,52 +690,52 @@ describe("cachedInputFileSystem CacheBackend and Node.JS filesystem", () => { const file = path.resolve(__dirname, "./fixtures/abc.txt"); - it("should work with string async", (done) => { + it("should work with string async", (t, done) => { fs.readFile(file, (err, r) => { if (err) { done(err); return; } - expect(r.toString()).toBe("abc"); + assert.strictEqual(r.toString(), "abc"); done(); }); }); it("should work with string sync", () => { const r = fs.readFileSync(file); - expect(r.toString()).toBe("abc"); + assert.strictEqual(r.toString(), "abc"); }); - it("should work with Buffer async", (done) => { + it("should work with Buffer async", (t, done) => { fs.readFile(Buffer.from(file), (err, r) => { if (err) { done(err); return; } - expect(r.toString()).toBe("abc"); + assert.strictEqual(r.toString(), "abc"); done(); }); }); it("should work with Buffer sync", () => { const r = fs.readFileSync(Buffer.from(file)); - expect(r.toString()).toBe("abc"); + assert.strictEqual(r.toString(), "abc"); }); - it("should work with URL async", (done) => { + it("should work with URL async", (t, done) => { fs.readFile(url.pathToFileURL(file), (err, r) => { if (err) { done(err); return; } - expect(r.toString()).toBe("abc"); + assert.strictEqual(r.toString(), "abc"); done(); }); }); it("should work with URL sync", () => { const r = fs.readFileSync(url.pathToFileURL(file)); - expect(r.toString()).toBe("abc"); + assert.strictEqual(r.toString(), "abc"); }); }); @@ -745,51 +748,51 @@ describe("cachedInputFileSystem OperationMergerBackend and Node.JS filesystem", const file = path.resolve(__dirname, "./fixtures/abc.txt"); - it("should work with string async", (done) => { + it("should work with string async", (t, done) => { fs.readFile(file, (err, r) => { if (err) { done(err); return; } - expect(r.toString()).toBe("abc"); + assert.strictEqual(r.toString(), "abc"); done(); }); }); it("should work with string sync", () => { const r = fs.readFileSync(file); - expect(r.toString()).toBe("abc"); + assert.strictEqual(r.toString(), "abc"); }); - it("should work with Buffer async", (done) => { + it("should work with Buffer async", (t, done) => { fs.readFile(Buffer.from(file), (err, r) => { if (err) { done(err); return; } - expect(r.toString()).toBe("abc"); + assert.strictEqual(r.toString(), "abc"); done(); }); }); it("should work with Buffer sync", () => { const r = fs.readFileSync(Buffer.from(file)); - expect(r.toString()).toBe("abc"); + assert.strictEqual(r.toString(), "abc"); }); - it("should work with URL async", (done) => { + it("should work with URL async", (t, done) => { fs.readFile(url.pathToFileURL(file), (err, r) => { if (err) { done(err); return; } - expect(r.toString()).toBe("abc"); + assert.strictEqual(r.toString(), "abc"); done(); }); }); it("should work with URL sync", () => { const r = fs.readFileSync(url.pathToFileURL(file)); - expect(r.toString()).toBe("abc"); + assert.strictEqual(r.toString(), "abc"); }); }); diff --git a/test/DescriptionFileUtils.test.js b/test/DescriptionFileUtils.test.js index dd71634d..d376713c 100644 --- a/test/DescriptionFileUtils.test.js +++ b/test/DescriptionFileUtils.test.js @@ -1,58 +1,65 @@ "use strict"; +const assert = require("assert"); +const DescriptionFileUtils = require("../lib/DescriptionFileUtils"); +const { describe, it } = require("./_runner"); + /* eslint-disable jsdoc/reject-any-type */ // Pure-function tests for helpers exported by DescriptionFileUtils, matching // the style of test/getPaths.test.js and test/identifier.test.js for lib/ // modules whose helpers are difficult to exercise end-to-end. -const DescriptionFileUtils = require("../lib/DescriptionFileUtils"); describe("DescriptionFileUtils.cdUp", () => { it("returns null for '/'", () => { - expect(DescriptionFileUtils.cdUp("/")).toBeNull(); + assert.strictEqual(DescriptionFileUtils.cdUp("/"), null); }); it("returns null for inputs without separators", () => { // cspell:ignore noslash - expect(DescriptionFileUtils.cdUp("noslash")).toBeNull(); + assert.strictEqual(DescriptionFileUtils.cdUp("noslash"), null); }); it("returns '/' when stripping the last directory", () => { - expect(DescriptionFileUtils.cdUp("/foo")).toBe("/"); + assert.strictEqual(DescriptionFileUtils.cdUp("/foo"), "/"); }); it("descends one level for posix paths", () => { - expect(DescriptionFileUtils.cdUp("/a/b/c")).toBe("/a/b"); + assert.strictEqual(DescriptionFileUtils.cdUp("/a/b/c"), "/a/b"); }); it("descends one level for windows paths", () => { - expect(DescriptionFileUtils.cdUp("C:\\a\\b\\c")).toBe("C:\\a\\b"); + assert.strictEqual(DescriptionFileUtils.cdUp("C:\\a\\b\\c"), "C:\\a\\b"); }); }); describe("DescriptionFileUtils.getField", () => { it("returns undefined for empty content", () => { - expect( + assert.strictEqual( DescriptionFileUtils.getField(/** @type {any} */ (null), "x"), - ).toBeUndefined(); + undefined, + ); }); it("walks an array field path", () => { const data = { a: { b: { c: 42 } } }; - expect( + assert.strictEqual( DescriptionFileUtils.getField(/** @type {any} */ (data), ["a", "b", "c"]), - ).toBe(42); + 42, + ); }); it("returns null when the path is broken mid-traversal", () => { - expect( + assert.strictEqual( DescriptionFileUtils.getField(/** @type {any} */ ({ a: 1 }), ["a", "b"]), - ).toBeNull(); + null, + ); }); it("returns the field value for a string field", () => { - expect( + assert.strictEqual( DescriptionFileUtils.getField(/** @type {any} */ ({ name: "x" }), "name"), - ).toBe("x"); + "x", + ); }); }); diff --git a/test/_runner.js b/test/_runner.js new file mode 100644 index 00000000..0cf8febc --- /dev/null +++ b/test/_runner.js @@ -0,0 +1,92 @@ +// @ts-nocheck +// (This bridge is intentionally untyped: it branches on the runtime +// (jest vs node:test) and patches `assert` at module load. The assertion +// polyfills mirror Node's real `assert.match`/`assert.doesNotMatch` shape, +// and the jest branch only runs when the `jest` global is in scope.) + +"use strict"; + +// TODO: drop this file once `engines.node` is bumped to >= 18. The test +// files can then `require("node:test")` directly, the jest bridge below +// is no longer reachable, and the `assert.match`/`doesNotMatch` polyfills +// (needed only on Node.js < 13.6) become dead code. + +// Bridge between `node:test` and jest-compatible runners so a single test +// source runs on: +// - Node.js 18+ via the built-in `node --test` runner. +// - Legacy Node.js (10-16) via jest, which doesn't ship `node:test`. +// - Bun via its built-in jest-compatible runner. +// The runtime is auto-detected by the presence of jest's `jest` global. + +const assert = require("assert"); + +// `assert.match` and `assert.doesNotMatch` were added in Node.js 13.6. Legacy +// jest CI also runs on Node.js 10/12, so polyfill them when missing. The +// signature mirrors the built-in. +if (typeof assert.match !== "function") { + assert.match = function match(value, regExp, message) { + if (!regExp.test(value)) { + throw new assert.AssertionError({ + message: + message || + `The input did not match the regular expression ${regExp}. Input:\n\n${value}\n`, + actual: value, + expected: regExp, + operator: "match", + }); + } + }; +} +if (typeof assert.doesNotMatch !== "function") { + assert.doesNotMatch = function doesNotMatch(value, regExp, message) { + if (regExp.test(value)) { + throw new assert.AssertionError({ + message: + message || + `The input matched the regular expression ${regExp}. Input:\n\n${value}\n`, + actual: value, + expected: regExp, + operator: "doesNotMatch", + }); + } + }; +} + +// Adapt a jest-shaped helper bag (jest's globals or `bun:test`) to the +// node:test surface the test files use. jest-style callbacks take `(done)`; +// node:test passes `(t, done)`, so wrap to inject a throwaway `t` when the +// jest-compatible runner invokes the test function. `describe` is passed +// through unchanged so `describe.skip` keeps working on every runtime +// (the only host-level skip the suite uses). +const wrap = (fn) => + typeof fn === "function" && fn.length >= 2 + ? function bridged(done) { + return fn.call(this, {}, done); + } + : fn; +const named = (register) => (name, fn) => register(name, wrap(fn)); +const bridge = (source) => ({ + describe: source.describe, + it: named(source.it), + test: named(source.test), + before: source.beforeAll, + after: source.afterAll, + beforeEach: source.beforeEach, + afterEach: source.afterEach, +}); + +// Pick the source of the test helpers based on the runtime: +// - Bun: always use `bun:test`. Bun ships its own (partial) `node:test` +// implementation that throws on top-level `describe()` calls in some +// setups; `bun:test` is the supported entry point. +// - jest (no `Bun` global, `jest` global is in scope): use jest's helpers, +// which jest attaches to `global`. This is the legacy-Node and Deno path. +// - Otherwise: the Node.js built-in `node:test`. +if (typeof Bun !== "undefined") { + // eslint-disable-next-line import/no-unresolved + module.exports = bridge(require("bun:test")); +} else if (typeof jest === "undefined") { + module.exports = require("node:test"); +} else { + module.exports = bridge(global); +} diff --git a/test/alias.test.js b/test/alias.test.js index 00ea0239..6ba5c674 100644 --- a/test/alias.test.js +++ b/test/alias.test.js @@ -1,10 +1,13 @@ "use strict"; +const assert = require("assert"); const fs = require("fs"); + const path = require("path"); const { Volume } = require("memfs"); const { ResolverFactory } = require("../"); const CachedInputFileSystem = require("../lib/CachedInputFileSystem"); +const { beforeEach, describe, it } = require("./_runner"); const nodeFileSystem = new CachedInputFileSystem(fs, 4000); @@ -58,94 +61,138 @@ describe("alias", () => { }); it("should resolve a not aliased module", () => { - expect(resolver.resolveSync({}, "/", "a")).toBe("/a/index"); - expect(resolver.resolveSync({}, "/", "a/index")).toBe("/a/index"); - expect(resolver.resolveSync({}, "/", "a/dir")).toBe("/a/dir/index"); - expect(resolver.resolveSync({}, "/", "a/dir/index")).toBe("/a/dir/index"); + assert.strictEqual(resolver.resolveSync({}, "/", "a"), "/a/index"); + assert.strictEqual(resolver.resolveSync({}, "/", "a/index"), "/a/index"); + assert.strictEqual(resolver.resolveSync({}, "/", "a/dir"), "/a/dir/index"); + assert.strictEqual( + resolver.resolveSync({}, "/", "a/dir/index"), + "/a/dir/index", + ); }); it("should resolve an aliased module", () => { - expect(resolver.resolveSync({}, "/", "aliasA")).toBe("/a/index"); - expect(resolver.resolveSync({}, "/", "aliasA/index")).toBe("/a/index"); - expect(resolver.resolveSync({}, "/", "aliasA/dir")).toBe("/a/dir/index"); - expect(resolver.resolveSync({}, "/", "aliasA/dir/index")).toBe( + assert.strictEqual(resolver.resolveSync({}, "/", "aliasA"), "/a/index"); + assert.strictEqual( + resolver.resolveSync({}, "/", "aliasA/index"), + "/a/index", + ); + assert.strictEqual( + resolver.resolveSync({}, "/", "aliasA/dir"), + "/a/dir/index", + ); + assert.strictEqual( + resolver.resolveSync({}, "/", "aliasA/dir/index"), "/a/dir/index", ); }); it('should resolve "#" alias', () => { - expect(resolver.resolveSync({}, "/", "#")).toBe("/c/dir/index"); - expect(resolver.resolveSync({}, "/", "#/index")).toBe("/c/dir/index"); + assert.strictEqual(resolver.resolveSync({}, "/", "#"), "/c/dir/index"); + assert.strictEqual( + resolver.resolveSync({}, "/", "#/index"), + "/c/dir/index", + ); }); it('should resolve "@" alias', () => { - expect(resolver.resolveSync({}, "/", "@")).toBe("/c/dir/index"); - expect(resolver.resolveSync({}, "/", "@/index")).toBe("/c/dir/index"); + assert.strictEqual(resolver.resolveSync({}, "/", "@"), "/c/dir/index"); + assert.strictEqual( + resolver.resolveSync({}, "/", "@/index"), + "/c/dir/index", + ); }); it("should resolve wildcard alias", () => { - expect(resolver.resolveSync({}, "/", "@a")).toBe("/a/index"); - expect(resolver.resolveSync({}, "/", "@a/dir")).toBe("/a/dir/index"); - expect(resolver.resolveSync({}, "/", "@e/dir/file")).toBe("/e/dir/file"); - expect(resolver.resolveSync({}, "/", "@e/anotherDir")).toBe( + assert.strictEqual(resolver.resolveSync({}, "/", "@a"), "/a/index"); + assert.strictEqual(resolver.resolveSync({}, "/", "@a/dir"), "/a/dir/index"); + assert.strictEqual( + resolver.resolveSync({}, "/", "@e/dir/file"), + "/e/dir/file", + ); + assert.strictEqual( + resolver.resolveSync({}, "/", "@e/anotherDir"), "/e/anotherDir/index", ); - expect(resolver.resolveSync({}, "/", "@e/dir/file")).toBe("/e/dir/file"); + assert.strictEqual( + resolver.resolveSync({}, "/", "@e/dir/file"), + "/e/dir/file", + ); }); it("should resolve an ignore module", () => { - expect(resolver.resolveSync({}, "/", "ignored")).toBe(false); + assert.strictEqual(resolver.resolveSync({}, "/", "ignored"), false); }); it("should resolve a recursive aliased module", () => { - expect(resolver.resolveSync({}, "/", "recursive")).toBe( + assert.strictEqual( + resolver.resolveSync({}, "/", "recursive"), "/recursive/dir/index", ); - expect(resolver.resolveSync({}, "/", "recursive/index")).toBe( + assert.strictEqual( + resolver.resolveSync({}, "/", "recursive/index"), "/recursive/dir/index", ); - expect(resolver.resolveSync({}, "/", "recursive/dir")).toBe( + assert.strictEqual( + resolver.resolveSync({}, "/", "recursive/dir"), "/recursive/dir/index", ); - expect(resolver.resolveSync({}, "/", "recursive/dir/index")).toBe( + assert.strictEqual( + resolver.resolveSync({}, "/", "recursive/dir/index"), "/recursive/dir/index", ); }); it("should resolve a file aliased module", () => { - expect(resolver.resolveSync({}, "/", "b")).toBe("/a/index"); - expect(resolver.resolveSync({}, "/", "c")).toBe("/a/index"); + assert.strictEqual(resolver.resolveSync({}, "/", "b"), "/a/index"); + assert.strictEqual(resolver.resolveSync({}, "/", "c"), "/a/index"); }); it("should resolve a file aliased module with a query", () => { - expect(resolver.resolveSync({}, "/", "b?query")).toBe("/a/index?query"); - expect(resolver.resolveSync({}, "/", "c?query")).toBe("/a/index?query"); + assert.strictEqual( + resolver.resolveSync({}, "/", "b?query"), + "/a/index?query", + ); + assert.strictEqual( + resolver.resolveSync({}, "/", "c?query"), + "/a/index?query", + ); }); it("should resolve a path in a file aliased module", () => { - expect(resolver.resolveSync({}, "/", "b/index")).toBe("/b/index"); - expect(resolver.resolveSync({}, "/", "b/dir")).toBe("/b/dir/index"); - expect(resolver.resolveSync({}, "/", "b/dir/index")).toBe("/b/dir/index"); - expect(resolver.resolveSync({}, "/", "c/index")).toBe("/c/index"); - expect(resolver.resolveSync({}, "/", "c/dir")).toBe("/c/dir/index"); - expect(resolver.resolveSync({}, "/", "c/dir/index")).toBe("/c/dir/index"); + assert.strictEqual(resolver.resolveSync({}, "/", "b/index"), "/b/index"); + assert.strictEqual(resolver.resolveSync({}, "/", "b/dir"), "/b/dir/index"); + assert.strictEqual( + resolver.resolveSync({}, "/", "b/dir/index"), + "/b/dir/index", + ); + assert.strictEqual(resolver.resolveSync({}, "/", "c/index"), "/c/index"); + assert.strictEqual(resolver.resolveSync({}, "/", "c/dir"), "/c/dir/index"); + assert.strictEqual( + resolver.resolveSync({}, "/", "c/dir/index"), + "/c/dir/index", + ); }); it("should resolve a file aliased file", () => { - expect(resolver.resolveSync({}, "/", "d")).toBe("/c/index"); - expect(resolver.resolveSync({}, "/", "d/dir/index")).toBe("/c/dir/index"); + assert.strictEqual(resolver.resolveSync({}, "/", "d"), "/c/index"); + assert.strictEqual( + resolver.resolveSync({}, "/", "d/dir/index"), + "/c/dir/index", + ); }); it("should resolve a file in multiple aliased dirs", () => { - expect(resolver.resolveSync({}, "/", "multiAlias/dir/file")).toBe( + assert.strictEqual( + resolver.resolveSync({}, "/", "multiAlias/dir/file"), "/e/dir/file", ); - expect(resolver.resolveSync({}, "/", "multiAlias/anotherDir")).toBe( + assert.strictEqual( + resolver.resolveSync({}, "/", "multiAlias/anotherDir"), "/e/anotherDir/index", ); }); - it("should log the correct info", (done) => { + it("should log the correct info", (t, done) => { const log = []; resolver.resolve( {}, @@ -155,8 +202,8 @@ describe("alias", () => { (err, result) => { if (err) return done(err); - expect(result).toBe("/a/dir/index"); - expect(log).toEqual([ + assert.strictEqual(result, "/a/dir/index"); + assert.deepStrictEqual(log, [ "resolve 'aliasA/dir' in '/'", " Parsed request is a module", " No description file found in / or above", @@ -191,7 +238,7 @@ describe("alias", () => { ); }); - it("should work with absolute paths", (done) => { + it("should work with absolute paths", (t, done) => { const resolver = ResolverFactory.createResolver({ alias: { [path.resolve(__dirname, "fixtures", "foo")]: false, @@ -202,7 +249,7 @@ describe("alias", () => { resolver.resolve({}, __dirname, "foo/index", {}, (err, result) => { if (err) done(err); - expect(result).toBe(false); + assert.strictEqual(result, false); done(); }); }); @@ -216,14 +263,23 @@ describe("alias", () => { // char-code screen ever diverges from the startsWith comparison // these resolves silently fall through to the original target. it("should not skip absolute path aliasing", () => { - expect(resolver.resolveSync({}, "/", "/d/dir")).toBe("/c/dir/index"); - expect(resolver.resolveSync({}, "/", "/d/dir/index")).toBe("/c/dir/index"); - expect(resolver.resolveSync({}, "/", "d/dir/index")).toBe("/c/dir/index"); - expect(resolver.resolveSync({}, "/", "d")).toBe("/c/index"); + assert.strictEqual(resolver.resolveSync({}, "/", "/d/dir"), "/c/dir/index"); + assert.strictEqual( + resolver.resolveSync({}, "/", "/d/dir/index"), + "/c/dir/index", + ); + assert.strictEqual( + resolver.resolveSync({}, "/", "d/dir/index"), + "/c/dir/index", + ); + assert.strictEqual(resolver.resolveSync({}, "/", "d"), "/c/index"); }); it("should resolve a wildcard alias with multiple targets correctly", () => { - expect(resolver.resolveSync({}, "/", "shared/b")).toBe("/src/components/b"); + assert.strictEqual( + resolver.resolveSync({}, "/", "shared/b"), + "/src/components/b", + ); }); // Absolute-path aliasing — OS-native (posix on Linux CI, backslash @@ -252,7 +308,7 @@ describe("alias", () => { fileSystem: nodeFileSystem, }); - it("aliases a raw absolute subpath request (raw-resolve hook)", (done) => { + it("aliases a raw absolute subpath request (raw-resolve hook)", (t, done) => { // path.join uses the OS-native separator, so on windows this // is `...\\imaginary-foo\\index` and exercises the backslash // fallback; on linux it is `.../imaginary-foo/index`. @@ -263,21 +319,21 @@ describe("alias", () => { {}, (err, result) => { if (err) return done(err); - expect(result).toBe(expectedIndex); + assert.strictEqual(result, expectedIndex); done(); }, ); }); - it("aliases a request that equals the alias name (exact equality)", (done) => { + it("aliases a request that equals the alias name (exact equality)", (t, done) => { absResolver.resolve({}, fixturesDir, aliasName, {}, (err, result) => { if (err) return done(err); - expect(result).toBe(expectedIndex); + assert.strictEqual(result, expectedIndex); done(); }); }); - it("aliases after JoinRequestPlugin normalizes the path (file hook)", (done) => { + it("aliases after JoinRequestPlugin normalizes the path (file hook)", (t, done) => { // A relative request hits `JoinRequestPlugin` first, which // turns it into `request.path` with `request.request` set to // `undefined`. That hits the `absolutePath`-only branch of @@ -289,20 +345,20 @@ describe("alias", () => { {}, (err, result) => { if (err) return done(err); - expect(result).toBe(expectedIndex); + assert.strictEqual(result, expectedIndex); done(); }, ); }); - it("does not fire for a different absolute prefix sharing the same head", (done) => { + it("does not fire for a different absolute prefix sharing the same head", (t, done) => { // `imaginary-food` shares `imaginary-foo` as a prefix but // not `imaginary-foo`. The alias must not fire, and // since `imaginary-food` does not exist, the resolve fails. const requestPath = path.join(fixturesDir, "imaginary-food", "index"); absResolver.resolve({}, fixturesDir, requestPath, {}, (err, result) => { - expect(err).toBeInstanceOf(Error); - expect(result).toBeFalsy(); + assert.ok(err instanceof Error); + assert.ok(!result); done(); }); }); @@ -352,13 +408,15 @@ describe("alias", () => { "/default-theme/Hello.js": "", }); - expect(resolver.resolveSync({}, "/", "theme/Hello")).toBe( + assert.strictEqual( + resolver.resolveSync({}, "/", "theme/Hello"), "/fancy-theme/Hello.js", ); fileSystem.unlinkSync("/fancy-theme/Hello.js"); - expect(resolver.resolveSync({}, "/", "theme/Hello")).toBe( + assert.strictEqual( + resolver.resolveSync({}, "/", "theme/Hello"), "/default-theme/Hello.js", ); }); @@ -368,19 +426,21 @@ describe("alias", () => { "/default-theme/Hello.js": "", }); - expect(resolver.resolveSync({}, "/", "theme/Hello")).toBe( + assert.strictEqual( + resolver.resolveSync({}, "/", "theme/Hello"), "/default-theme/Hello.js", ); fileSystem.mkdirSync("/fancy-theme"); fileSystem.writeFileSync("/fancy-theme/Hello.js", ""); - expect(resolver.resolveSync({}, "/", "theme/Hello")).toBe( + assert.strictEqual( + resolver.resolveSync({}, "/", "theme/Hello"), "/fancy-theme/Hello.js", ); }); - it("reports a missing-higher-priority path as a missing dependency so watchers can invalidate", (done) => { + it("reports a missing-higher-priority path as a missing dependency so watchers can invalidate", (t, done) => { const { resolver } = createThemeResolver({ "/default-theme/Hello.js": "", }); @@ -395,12 +455,18 @@ describe("alias", () => { { fileDependencies, missingDependencies }, (err, result) => { if (err) return done(err); - expect(result).toBe("/default-theme/Hello.js"); + assert.strictEqual(result, "/default-theme/Hello.js"); // The winning file is tracked so that deletions invalidate. - expect(fileDependencies.has("/default-theme/Hello.js")).toBe(true); + assert.strictEqual( + fileDependencies.has("/default-theme/Hello.js"), + true, + ); // The non-existent higher-priority file is tracked so that // its creation triggers a re-resolve (see issue #250). - expect(missingDependencies.has("/fancy-theme/Hello.js")).toBe(true); + assert.strictEqual( + missingDependencies.has("/fancy-theme/Hello.js"), + true, + ); done(); }, ); diff --git a/test/browserField.test.js b/test/browserField.test.js index 74411a00..a13cc053 100644 --- a/test/browserField.test.js +++ b/test/browserField.test.js @@ -1,8 +1,11 @@ "use strict"; +const assert = require("assert"); const fs = require("fs"); + const path = require("path"); const { ResolverFactory } = require("../"); +const { beforeEach, describe, it } = require("./_runner"); const browserModule = path.join(__dirname, "fixtures", "browser-module"); @@ -10,7 +13,7 @@ const browserModule = path.join(__dirname, "fixtures", "browser-module"); * @param {string[]} args args * @returns {string} path */ -function p(...args) { +function pp(...args) { return path.join(browserModule, ...args); } @@ -30,66 +33,83 @@ describe("browserField", () => { }); }); - it("should ignore", (done) => { - resolver.resolve({}, p(), "./lib/ignore", {}, (err, result) => { + it("should ignore", (t, done) => { + resolver.resolve({}, pp(), "./lib/ignore", {}, (err, result) => { if (err) throw err; - expect(result).toBe(false); + assert.strictEqual(result, false); done(); }); }); it("should ignore #2", () => { - expect(resolver.resolveSync({}, p(), "./lib/ignore")).toBe(false); - expect(resolver.resolveSync({}, p(), "./lib/ignore.js")).toBe(false); - expect(resolver.resolveSync({}, p("lib"), "./ignore")).toBe(false); - expect(resolver.resolveSync({}, p("lib"), "./ignore.js")).toBe(false); + assert.strictEqual(resolver.resolveSync({}, pp(), "./lib/ignore"), false); + assert.strictEqual( + resolver.resolveSync({}, pp(), "./lib/ignore.js"), + false, + ); + assert.strictEqual(resolver.resolveSync({}, pp("lib"), "./ignore"), false); + assert.strictEqual( + resolver.resolveSync({}, pp("lib"), "./ignore.js"), + false, + ); }); it("should replace a file", () => { - expect(resolver.resolveSync({}, p(), "./lib/replaced")).toEqual( - p("lib", "browser.js"), + assert.deepStrictEqual( + resolver.resolveSync({}, pp(), "./lib/replaced"), + pp("lib", "browser.js"), ); - expect(resolver.resolveSync({}, p(), "./lib/replaced.js")).toEqual( - p("lib", "browser.js"), + assert.deepStrictEqual( + resolver.resolveSync({}, pp(), "./lib/replaced.js"), + pp("lib", "browser.js"), ); - expect(resolver.resolveSync({}, p("lib"), "./replaced")).toEqual( - p("lib", "browser.js"), + assert.deepStrictEqual( + resolver.resolveSync({}, pp("lib"), "./replaced"), + pp("lib", "browser.js"), ); - expect(resolver.resolveSync({}, p("lib"), "./replaced.js")).toEqual( - p("lib", "browser.js"), + assert.deepStrictEqual( + resolver.resolveSync({}, pp("lib"), "./replaced.js"), + pp("lib", "browser.js"), ); }); it("should replace a module with a file", () => { - expect(resolver.resolveSync({}, p(), "module-a")).toEqual( - p("browser", "module-a.js"), + assert.deepStrictEqual( + resolver.resolveSync({}, pp(), "module-a"), + pp("browser", "module-a.js"), ); - expect(resolver.resolveSync({}, p("lib"), "module-a")).toEqual( - p("browser", "module-a.js"), + assert.deepStrictEqual( + resolver.resolveSync({}, pp("lib"), "module-a"), + pp("browser", "module-a.js"), ); }); it("should replace a module with a module", () => { - expect(resolver.resolveSync({}, p(), "module-b")).toEqual( - p("node_modules", "module-c.js"), + assert.deepStrictEqual( + resolver.resolveSync({}, pp(), "module-b"), + pp("node_modules", "module-c.js"), ); - expect(resolver.resolveSync({}, p("lib"), "module-b")).toEqual( - p("node_modules", "module-c.js"), + assert.deepStrictEqual( + resolver.resolveSync({}, pp("lib"), "module-b"), + pp("node_modules", "module-c.js"), ); }); it("should resolve in nested property", () => { - expect(resolver.resolveSync({}, p(), "./lib/main1.js")).toEqual( - p("lib", "main.js"), + assert.deepStrictEqual( + resolver.resolveSync({}, pp(), "./lib/main1.js"), + pp("lib", "main.js"), ); - expect(resolver.resolveSync({}, p(), "./lib/main2.js")).toEqual( - p("lib", "browser.js"), + assert.deepStrictEqual( + resolver.resolveSync({}, pp(), "./lib/main2.js"), + pp("lib", "browser.js"), ); }); it("should check only alias field properties", () => { - expect(resolver.resolveSync({}, p(), "./toString")).toEqual( - p("lib", "toString.js"), + assert.deepStrictEqual( + resolver.resolveSync({}, pp(), "./toString"), + pp("lib", "toString.js"), ); }); @@ -99,7 +119,7 @@ describe("browserField", () => { "alias-field-extras", ); - it("falls through when the browser alias value equals the inner request", (done) => { + it("falls through when the browser alias value equals the inner request", (t, done) => { const resolver = ResolverFactory.createResolver({ extensions: [".js"], aliasFields: ["browser"], @@ -112,13 +132,16 @@ describe("browserField", () => { {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.join(aliasFieldExtras, "self-alias.js")); + assert.deepStrictEqual( + result, + path.join(aliasFieldExtras, "self-alias.js"), + ); done(); }, ); }); - it("falls through when a module alias value equals the inner request", (done) => { + it("falls through when a module alias value equals the inner request", (t, done) => { const resolver = ResolverFactory.createResolver({ extensions: [".js"], aliasFields: ["browser"], @@ -126,26 +149,27 @@ describe("browserField", () => { }); resolver.resolve({}, aliasFieldExtras, "pkg", {}, (err, result) => { if (err) return done(err); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(aliasFieldExtras, "node_modules/pkg/index.js"), ); done(); }); }); - it("propagates a resolution error when the browser alias target cannot be found", (done) => { + it("propagates a resolution error when the browser alias target cannot be found", (t, done) => { const resolver = ResolverFactory.createResolver({ extensions: [".js"], aliasFields: ["browser"], fileSystem: fs, }); resolver.resolve({}, aliasFieldExtras, "./points-nowhere", {}, (err) => { - expect(err).toBeInstanceOf(Error); + assert.ok(err instanceof Error); done(); }); }); - it("leaves resolution untouched when the configured field does not exist", (done) => { + it("leaves resolution untouched when the configured field does not exist", (t, done) => { const resolver = ResolverFactory.createResolver({ extensions: [".js"], aliasFields: ["nonexistentField"], @@ -158,13 +182,13 @@ describe("browserField", () => { {}, (err) => { // Either resolves or errors — we just want to exercise the path. - expect(err === null || err instanceof Error).toBe(true); + assert.strictEqual(err === null || err instanceof Error, true); done(); }, ); }); - it("short-circuits when a browser field marks a path as false (directory ignore)", (done) => { + it("short-circuits when a browser field marks a path as false (directory ignore)", (t, done) => { const resolver = ResolverFactory.createResolver({ extensions: [".js"], aliasFields: ["browser"], @@ -177,7 +201,7 @@ describe("browserField", () => { {}, (err, result) => { if (err) return done(err); - expect(result).toBe(false); + assert.strictEqual(result, false); done(); }, ); diff --git a/test/dependencies.test.js b/test/dependencies.test.js index 086079b5..95e59a6d 100644 --- a/test/dependencies.test.js +++ b/test/dependencies.test.js @@ -1,7 +1,10 @@ "use strict"; +const assert = require("assert"); + const { Volume } = require("memfs"); const resolve = require("../"); +const { beforeEach, describe, it } = require("./_runner"); describe("dependencies", () => { let resolver; @@ -84,7 +87,7 @@ describe("dependencies", () => { for (const testCase of testCases) { // eslint-disable-next-line no-loop-func - it(`should report correct dependencies for ${testCase.name}`, (done) => { + it(`should report correct dependencies for ${testCase.name}`, (t, done) => { const fileDependencies = new Set(); const missingDependencies = new Set(); resolver( @@ -97,11 +100,13 @@ describe("dependencies", () => { (err, result) => { if (err) return done(err); - expect(result).toEqual(testCase.result); - expect([...fileDependencies].sort()).toEqual( + assert.deepStrictEqual(result, testCase.result); + assert.deepStrictEqual( + [...fileDependencies].sort(), testCase.fileDependencies.sort(), ); - expect([...missingDependencies].sort()).toEqual( + assert.deepStrictEqual( + [...missingDependencies].sort(), testCase.missingDependencies.sort(), ); done(); diff --git a/test/description-file.test.js b/test/description-file.test.js index 63c2d16c..e2870f00 100644 --- a/test/description-file.test.js +++ b/test/description-file.test.js @@ -1,10 +1,13 @@ "use strict"; +const assert = require("assert"); +const fs = require("fs"); + /* eslint-disable jsdoc/reject-any-type */ -const fs = require("fs"); const path = require("path"); const { CachedInputFileSystem, ResolverFactory } = require("../"); +const { describe, it } = require("./_runner"); const fixtures = path.join(__dirname, "fixtures"); const nodeFileSystem = new CachedInputFileSystem(fs, 4000); @@ -32,7 +35,7 @@ function fsWithoutReadJson() { } describe("description file (readFile fallback)", () => { - it("surfaces 'No content in file' when the description file is empty", (done) => { + it("surfaces 'No content in file' when the description file is empty", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem: fsWithoutReadJson(), extensions: [".js"], @@ -43,19 +46,17 @@ describe("description file (readFile fallback)", () => { ".", {}, (err) => { - expect(err).toBeInstanceOf(Error); - expect(/** @type {Error} */ (err).message).toMatch( - // JSON.parse("") differs by engine: V8 (node/deno) says - // "Unexpected end of JSON input", JavaScriptCore (bun) says - // "JSON Parse error: Unexpected EOF". - /No content in file|Unexpected end of JSON|JSON Parse error|Can't resolve/, + assert.ok(err instanceof Error); + assert.match( + /** @type {Error} */ (err).message, + /No content in file|Unexpected end of JSON|Unexpected EOF|Can't resolve/, ); done(); }, ); }); - it("surfaces a parse error when the description file contains invalid JSON", (done) => { + it("surfaces a parse error when the description file contains invalid JSON", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem: fsWithoutReadJson(), extensions: [".js"], @@ -66,20 +67,23 @@ describe("description file (readFile fallback)", () => { ".", {}, (err) => { - expect(err).toBeInstanceOf(Error); + assert.ok(err instanceof Error); done(); }, ); }); - it("resolves through the readFile path when readJson is not available", (done) => { + it("resolves through the readFile path when readJson is not available", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem: fsWithoutReadJson(), extensions: [".js"], }); resolver.resolve({}, fixtures, "m1/a", {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.join(fixtures, "node_modules/m1/a.js")); + assert.deepStrictEqual( + result, + path.join(fixtures, "node_modules/m1/a.js"), + ); done(); }); }); @@ -88,7 +92,7 @@ describe("description file (readFile fallback)", () => { describe("self-reference resolution", () => { const selfPkg = path.join(fixtures, "self-reference-pkg"); - it("resolves a package's own name via the exports field", (done) => { + it("resolves a package's own name via the exports field", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem: nodeFileSystem, conditionNames: ["node"], @@ -96,12 +100,12 @@ describe("self-reference resolution", () => { }); resolver.resolve({}, selfPkg, "self-pkg", {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.join(selfPkg, "index.js")); + assert.deepStrictEqual(result, path.join(selfPkg, "index.js")); done(); }); }); - it("resolves a sub-path via self-reference + exports", (done) => { + it("resolves a sub-path via self-reference + exports", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem: nodeFileSystem, conditionNames: ["node"], @@ -109,12 +113,12 @@ describe("self-reference resolution", () => { }); resolver.resolve({}, selfPkg, "self-pkg/sub", {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.join(selfPkg, "sub.js")); + assert.deepStrictEqual(result, path.join(selfPkg, "sub.js")); done(); }); }); - it("falls through when the request is not the package name", (done) => { + it("falls through when the request is not the package name", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem: nodeFileSystem, extensions: [".js"], @@ -123,14 +127,14 @@ describe("self-reference resolution", () => { }); resolver.resolve({}, selfPkg, "./index", {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.join(selfPkg, "index.js")); + assert.deepStrictEqual(result, path.join(selfPkg, "index.js")); done(); }); }); }); describe("self-reference negative case", () => { - it("does not self-reference when the package name doesn't match the request prefix", (done) => { + it("does not self-reference when the package name doesn't match the request prefix", (t, done) => { const selfPkg = path.join(fixtures, "self-reference-pkg"); const resolver = ResolverFactory.createResolver({ extensions: [".js"], @@ -139,7 +143,7 @@ describe("self-reference negative case", () => { fileSystem: nodeFileSystem, }); resolver.resolve({}, selfPkg, "other-pkg", {}, (err) => { - expect(err).toBeInstanceOf(Error); + assert.ok(err instanceof Error); done(); }); }); diff --git a/test/dos-device-paths.test.js b/test/dos-device-paths.test.js index 771f0b2d..848a3f7e 100644 --- a/test/dos-device-paths.test.js +++ b/test/dos-device-paths.test.js @@ -1,13 +1,13 @@ "use strict"; -// eslint's jest plugin static-analyzes `describe` calls and doesn't recognize -// `describeWin` below as one — disable `require-top-level-describe` for the -// whole file rather than scatter per-test ignore comments. -/* eslint-disable jest/require-top-level-describe, jsdoc/reject-any-type */ - +const assert = require("assert"); const fs = require("fs"); + +/* eslint-disable jsdoc/reject-any-type */ + const path = require("path"); const { ResolverFactory } = require("../"); +const { describe, test } = require("./_runner"); // DOS device paths (`\\?\…`, `\\.\…`) are Windows-only constructs. The real // resolver tests below hit the actual filesystem through those prefixes, so @@ -35,26 +35,30 @@ describeWin("DOS device path resolution (Windows)", () => { }); test("resolves a relative request against a \\\\?\\ context", async () => { - await expect(resolver.resolvePromise({}, dosFixtures, "./a")).resolves.toBe( + assert.strictEqual( + await resolver.resolvePromise({}, dosFixtures, "./a"), path.join(dosFixtures, "a.js"), ); }); test("resolves a relative request to a subdirectory's index.js", async () => { - await expect( - resolver.resolvePromise({}, dosFixtures, "./foo"), - ).resolves.toBe(path.join(dosFixtures, "foo", "index.js")); + assert.strictEqual( + await resolver.resolvePromise({}, dosFixtures, "./foo"), + path.join(dosFixtures, "foo", "index.js"), + ); }); test("resolves '.' to index.js in a \\\\?\\ context", async () => { - await expect( - resolver.resolvePromise({}, path.join(dosFixtures, "foo"), "."), - ).resolves.toBe(path.join(dosFixtures, "foo", "index.js")); + assert.strictEqual( + await resolver.resolvePromise({}, path.join(dosFixtures, "foo"), "."), + path.join(dosFixtures, "foo", "index.js"), + ); }); test("resolves an absolute \\\\?\\ request regardless of context", async () => { const request = path.join(dosFixtures, "a"); - await expect(resolver.resolvePromise({}, fixtures, request)).resolves.toBe( + assert.strictEqual( + await resolver.resolvePromise({}, fixtures, request), path.join(dosFixtures, "a.js"), ); }); @@ -62,7 +66,8 @@ describeWin("DOS device path resolution (Windows)", () => { test("resolves through the \\\\.\\ device namespace", async () => { // The `\\.\` walk used to infinite-loop in `cdUp` once it reached // the bare `\` root — this test proves it terminates. - await expect(resolver.resolvePromise({}, dotFixtures, "./a")).resolves.toBe( + assert.strictEqual( + await resolver.resolvePromise({}, dotFixtures, "./a"), path.join(dotFixtures, "a.js"), ); }); @@ -71,25 +76,28 @@ describeWin("DOS device path resolution (Windows)", () => { // The literal `?` inside `\\?\` must not be mistaken for a query // separator — the real query is the one trailing the path. const request = `${path.join(dosFixtures, "a")}?foo=bar`; - await expect(resolver.resolvePromise({}, fixtures, request)).resolves.toBe( + assert.strictEqual( + await resolver.resolvePromise({}, fixtures, request), `${path.join(dosFixtures, "a.js")}?foo=bar`, ); }); test("preserves a fragment on a \\\\?\\ request", async () => { const request = `${path.join(dosFixtures, "a")}#frag`; - await expect(resolver.resolvePromise({}, fixtures, request)).resolves.toBe( + assert.strictEqual( + await resolver.resolvePromise({}, fixtures, request), `${path.join(dosFixtures, "a.js")}#frag`, ); }); test("rejects a missing file under a DOS device context", async () => { - await expect( + await assert.rejects( resolver.resolvePromise({}, dosFixtures, "./does-not-exist"), - ).rejects.toThrow(/Can't resolve/); + /Can't resolve/, + ); }); - test("locates the nearest package.json when resolving through \\\\?\\", (done) => { + test("locates the nearest package.json when resolving through \\\\?\\", (t, done) => { // Uses the callback form because the `request` (third callback arg) // carries `descriptionFilePath`, which the promise form drops. resolver.resolve( @@ -99,10 +107,11 @@ describeWin("DOS device path resolution (Windows)", () => { {}, (err, result, request) => { if (err) return done(err); - expect(result).toBe(path.join(dosFixtures, "foo", "index.js")); + assert.strictEqual(result, path.join(dosFixtures, "foo", "index.js")); // The description-file walk must terminate — if `cdUp` didn't // treat bare `\` as a root, this callback would never fire. - expect(/** @type {any} */ (request).descriptionFilePath).toBe( + assert.strictEqual( + /** @type {any} */ (request).descriptionFilePath, path.join(dosFixtures, "foo", "package.json"), ); done(); diff --git a/test/entrypoints.test.js b/test/entrypoints.test.js index 7ccd682c..3d1d9fde 100644 --- a/test/entrypoints.test.js +++ b/test/entrypoints.test.js @@ -1,28 +1,33 @@ "use strict"; +const assert = require("assert"); const { processExportsField, processImportsField, } = require("../lib/util/entrypoints"); +const { describe, it } = require("./_runner"); describe("util/entrypoints processExportsField", () => { it("throws when the request ends with '/' (file required)", () => { const processor = processExportsField({ ".": "./index.js" }); - expect(() => processor("./", new Set(["node"]))).toThrow( + assert.throws( + () => processor("./", new Set(["node"])), /Only requesting file allowed/, ); }); it("throws when the request does not start with '.'", () => { const processor = processExportsField({ ".": "./index.js" }); - expect(() => processor("foo", new Set(["node"]))).toThrow( + assert.throws( + () => processor("foo", new Set(["node"])), /should be relative path and start with "\."/, ); }); it("throws when the request length>1 but second char is not '/'", () => { const processor = processExportsField({ ".": "./index.js" }); - expect(() => processor("..foo", new Set(["node"]))).toThrow( + assert.throws( + () => processor("..foo", new Set(["node"])), /should be relative path and start with "\.\/"/, ); }); @@ -30,13 +35,13 @@ describe("util/entrypoints processExportsField", () => { it("returns an empty array for an unmatched export key", () => { const processor = processExportsField({ ".": "./main.js" }); const [paths] = processor("./not-listed", new Set(["node"])); - expect(paths).toEqual([]); + assert.deepStrictEqual(paths, []); }); it("matches a direct mapping", () => { const processor = processExportsField({ "./a": "./main.js" }); const [paths] = processor("./a", new Set(["node"])); - expect(paths).toEqual(["./main.js"]); + assert.deepStrictEqual(paths, ["./main.js"]); }); it("orders sibling pattern keys consistently", () => { @@ -46,32 +51,35 @@ describe("util/entrypoints processExportsField", () => { "./shortest": "./s.js", }); const [paths1] = processor("./shortest", new Set(["node"])); - expect(paths1).toEqual(["./s.js"]); + assert.deepStrictEqual(paths1, ["./s.js"]); const [paths2] = processor("./a/foo", new Set(["node"])); - expect(paths2).toEqual(["./a/foo"]); + assert.deepStrictEqual(paths2, ["./a/foo"]); const [paths3] = processor("./longer/foo", new Set(["node"])); - expect(paths3).toEqual(["./l/foo"]); + assert.deepStrictEqual(paths3, ["./l/foo"]); }); }); describe("util/entrypoints processImportsField", () => { it("throws when the request does not start with '#'", () => { const processor = processImportsField({ "#a": "./main.js" }); - expect(() => processor("foo", new Set(["node"]))).toThrow( + assert.throws( + () => processor("foo", new Set(["node"])), /should start with "#"/, ); }); it("throws when request is just '#' (too short)", () => { const processor = processImportsField({ "#a": "./main.js" }); - expect(() => processor("#", new Set(["node"]))).toThrow( + assert.throws( + () => processor("#", new Set(["node"])), /at least 2 characters/, ); }); it("throws when import request ends with '/'", () => { const processor = processImportsField({ "#a": "./main.js" }); - expect(() => processor("#a/", new Set(["node"]))).toThrow( + assert.throws( + () => processor("#a/", new Set(["node"])), /Only requesting file allowed/, ); }); @@ -79,12 +87,12 @@ describe("util/entrypoints processImportsField", () => { it("returns an empty array for an unmatched import key", () => { const processor = processImportsField({ "#a": "./main.js" }); const [paths] = processor("#x", new Set(["node"])); - expect(paths).toEqual([]); + assert.deepStrictEqual(paths, []); }); it("matches a direct import key", () => { const processor = processImportsField({ "#a": "./main.js" }); const [paths] = processor("#a", new Set(["node"])); - expect(paths).toEqual(["./main.js"]); + assert.deepStrictEqual(paths, ["./main.js"]); }); }); diff --git a/test/exportsField.test.js b/test/exportsField.test.js index 315ad5d4..f01f8255 100644 --- a/test/exportsField.test.js +++ b/test/exportsField.test.js @@ -1,10 +1,13 @@ "use strict"; +const assert = require("assert"); const fs = require("fs"); + const path = require("path"); const CachedInputFileSystem = require("../lib/CachedInputFileSystem"); const ResolverFactory = require("../lib/ResolverFactory"); const { processExportsField } = require("../lib/util/entrypoints"); +const { describe, it } = require("./_runner"); /** @typedef {import("../lib/util/entrypoints").ExportsField} ExportsField */ @@ -2158,20 +2161,23 @@ describe("process exports field", () => { for (const testCase of testCases) { it(testCase.name, () => { if (testCase.expect instanceof Error) { - expect(() => { - // eslint-disable-next-line no-unused-expressions - processExportsField(testCase.suite[0])( - testCase.suite[1], - new Set(testCase.suite[2]), - )[0]; - }).toThrow(testCase.expect.message); + const { message } = testCase.expect; + assert.throws( + () => + processExportsField(testCase.suite[0])( + testCase.suite[1], + new Set(testCase.suite[2]), + ), + (err) => err instanceof Error && err.message.includes(message), + ); } else { - expect( + assert.deepStrictEqual( processExportsField(testCase.suite[0])( testCase.suite[1], new Set(testCase.suite[2]), )[0], - ).toEqual(testCase.expect); + testCase.expect, + ); } }); } @@ -2193,18 +2199,19 @@ describe("exportsFieldPlugin", () => { conditionNames: ["webpack"], }); - it("resolve root using exports field, not a main field", (done) => { + it("resolve root using exports field, not a main field", (t, done) => { resolver.resolve({}, fixture, "exports-field", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "node_modules/exports-field/x.js"), ); done(); }); }); - it("resolve using exports field, not a browser field #1", (done) => { + it("resolve using exports field, not a browser field #1", (t, done) => { const resolver = ResolverFactory.createResolver({ aliasFields: ["browser"], conditionNames: ["custom"], @@ -2220,7 +2227,8 @@ describe("exportsFieldPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "node_modules/exports-field/lib/lib2/main.js"), ); done(); @@ -2228,7 +2236,7 @@ describe("exportsFieldPlugin", () => { ); }); - it("resolve using exports field and a browser alias field #2", (done) => { + it("resolve using exports field and a browser alias field #2", (t, done) => { const resolver = ResolverFactory.createResolver({ aliasFields: ["browser"], conditionNames: ["node"], @@ -2244,7 +2252,8 @@ describe("exportsFieldPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture2, "node_modules/exports-field/lib/browser.js"), ); done(); @@ -2252,7 +2261,7 @@ describe("exportsFieldPlugin", () => { ); }); - it("throw error if extension not provided", (done) => { + it("throw error if extension not provided", (t, done) => { resolver.resolve( {}, fixture2, @@ -2260,17 +2269,17 @@ describe("exportsFieldPlugin", () => { {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); + assert.ok(err instanceof Error); // exports field maps ./dist/main -> ./lib/main, but ./lib/main (no ext) doesn't exist. // Resolution stops at the exports field level with a "Package path" error // (no fallback to parent node_modules per issue #399 fix). - expect(err.message).toMatch(/Package path/); + assert.match(err.message, /Package path/); done(); }, ); }); - it("throw error if extension not provided #2", (done) => { + it("throw error if extension not provided #2", (t, done) => { resolver.resolve( {}, fixture2, @@ -2278,14 +2287,14 @@ describe("exportsFieldPlugin", () => { {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch(/Package path/); + assert.ok(err instanceof Error); + assert.match(err.message, /Package path/); done(); }, ); }); - it("should resolve extension without fullySpecified", (done) => { + it("should resolve extension without fullySpecified", (t, done) => { commonjsResolver.resolve( {}, fixture2, @@ -2294,7 +2303,8 @@ describe("exportsFieldPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture2, "node_modules/exports-field/lib/main.js"), ); done(); @@ -2302,7 +2312,7 @@ describe("exportsFieldPlugin", () => { ); }); - it("resolver should respect condition names", (done) => { + it("resolver should respect condition names", (t, done) => { resolver.resolve( {}, fixture, @@ -2311,7 +2321,8 @@ describe("exportsFieldPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "node_modules/exports-field/lib/main.js"), ); done(); @@ -2319,7 +2330,7 @@ describe("exportsFieldPlugin", () => { ); }); - it("resolver should respect fallback", (done) => { + it("resolver should respect fallback", (t, done) => { resolver.resolve( {}, fixture2, @@ -2328,7 +2339,8 @@ describe("exportsFieldPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture2, "node_modules/exports-field/lib/browser.js"), ); done(); @@ -2336,7 +2348,7 @@ describe("exportsFieldPlugin", () => { ); }); - it("resolver should respect query parameters #1", (done) => { + it("resolver should respect query parameters #1", (t, done) => { resolver.resolve( {}, fixture2, @@ -2345,7 +2357,8 @@ describe("exportsFieldPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve( fixture2, "node_modules/exports-field/lib/browser.js?foo", @@ -2356,16 +2369,16 @@ describe("exportsFieldPlugin", () => { ); }); - it("resolver should respect query parameters #2. Direct matching", (done) => { + it("resolver should respect query parameters #2. Direct matching", (t, done) => { resolver.resolve({}, fixture2, "exports-field?foo", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch(/"\.\/\?foo" is not exported/); + assert.ok(err instanceof Error); + assert.match(err.message, /"\.\/\?foo" is not exported/); done(); }); }); - it("resolver should respect fragment parameters #1", (done) => { + it("resolver should respect fragment parameters #1", (t, done) => { resolver.resolve( {}, fixture2, @@ -2374,7 +2387,8 @@ describe("exportsFieldPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve( fixture2, "node_modules/exports-field/lib/browser.js#foo", @@ -2385,16 +2399,16 @@ describe("exportsFieldPlugin", () => { ); }); - it("resolver should respect fragment parameters #2. Direct matching", (done) => { + it("resolver should respect fragment parameters #2. Direct matching", (t, done) => { resolver.resolve({}, fixture2, "exports-field#foo", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch(/"\.\/#foo" is not exported/); + assert.ok(err instanceof Error); + assert.match(err.message, /"\.\/#foo" is not exported/); done(); }); }); - it("resolver should respect query and fragment parameters together", (done) => { + it("resolver should respect query and fragment parameters together", (t, done) => { resolver.resolve( {}, fixture2, @@ -2403,7 +2417,8 @@ describe("exportsFieldPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve( fixture2, "node_modules/exports-field/lib/browser.js?foo=bar#frag", @@ -2414,7 +2429,7 @@ describe("exportsFieldPlugin", () => { ); }); - it("relative path should work, if relative path as request is used", (done) => { + it("relative path should work, if relative path as request is used", (t, done) => { resolver.resolve( {}, fixture, @@ -2423,7 +2438,8 @@ describe("exportsFieldPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "node_modules/exports-field/lib/main.js"), ); done(); @@ -2431,7 +2447,7 @@ describe("exportsFieldPlugin", () => { ); }); - it("relative path should not work with exports field", (done) => { + it("relative path should not work with exports field", (t, done) => { resolver.resolve( {}, fixture, @@ -2439,14 +2455,14 @@ describe("exportsFieldPlugin", () => { {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch(/Can't resolve/); + assert.ok(err instanceof Error); + assert.match(err.message, /Can't resolve/); done(); }, ); }); - it("backtracking should not work for request", (done) => { + it("backtracking should not work for request", (t, done) => { resolver.resolve( {}, fixture, @@ -2454,8 +2470,9 @@ describe("exportsFieldPlugin", () => { {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch( + assert.ok(err instanceof Error); + assert.match( + err.message, /Invalid "exports" target "\.\/lib\/lib2\/\.\.\/\.\.\/\.\.\/a\.js" defined for "\.\/dist\/"/, ); done(); @@ -2463,7 +2480,7 @@ describe("exportsFieldPlugin", () => { ); }); - it("backtracking should not work for exports field target", (done) => { + it("backtracking should not work for exports field target", (t, done) => { resolver.resolve( {}, fixture, @@ -2471,8 +2488,9 @@ describe("exportsFieldPlugin", () => { {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch( + assert.ok(err instanceof Error); + assert.match( + err.message, /Invalid "exports" target "\.\/\.\.\/\.\.\/a\.js" defined for "\.\/dist\/a\.js"/, ); done(); @@ -2480,16 +2498,16 @@ describe("exportsFieldPlugin", () => { ); }); - it("self-resolving root", (done) => { + it("self-resolving root", (t, done) => { resolver.resolve({}, fixture, "@exports-field/core", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(fixture, "./a.js")); + assert.deepStrictEqual(result, path.resolve(fixture, "./a.js")); done(); }); }); - it("not exported error", (done) => { + it("not exported error", (t, done) => { resolver.resolve( {}, fixture, @@ -2497,8 +2515,9 @@ describe("exportsFieldPlugin", () => { {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch( + assert.ok(err instanceof Error); + assert.match( + err.message, /not exported under the condition "webpack" from package/, ); done(); @@ -2506,7 +2525,7 @@ describe("exportsFieldPlugin", () => { ); }); - it("field name path #1", (done) => { + it("field name path #1", (t, done) => { const resolver = ResolverFactory.createResolver({ aliasFields: ["browser"], exportsFields: [["exportsField", "exports"]], @@ -2517,14 +2536,15 @@ describe("exportsFieldPlugin", () => { resolver.resolve({}, fixture3, "exports-field", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture3, "node_modules/exports-field/main.js"), ); done(); }); }); - it("field name path #2", (done) => { + it("field name path #2", (t, done) => { const resolver = ResolverFactory.createResolver({ aliasFields: ["browser"], exportsFields: [["exportsField", "exports"], "exports"], @@ -2535,14 +2555,15 @@ describe("exportsFieldPlugin", () => { resolver.resolve({}, fixture3, "exports-field", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture3, "node_modules/exports-field/main.js"), ); done(); }); }); - it("field name path #3", (done) => { + it("field name path #3", (t, done) => { const resolver = ResolverFactory.createResolver({ aliasFields: ["browser"], exportsFields: ["exports", ["exportsField", "exports"]], @@ -2553,14 +2574,15 @@ describe("exportsFieldPlugin", () => { resolver.resolve({}, fixture3, "exports-field", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture3, "node_modules/exports-field/main.js"), ); done(); }); }); - it("field name path #4", (done) => { + it("field name path #4", (t, done) => { const resolver = ResolverFactory.createResolver({ aliasFields: ["browser"], exportsFields: [["exports"]], @@ -2571,14 +2593,15 @@ describe("exportsFieldPlugin", () => { resolver.resolve({}, fixture2, "exports-field", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture2, "node_modules/exports-field/index.js"), ); done(); }); }); - it("field name path #5", (done) => { + it("field name path #5", (t, done) => { const resolver = ResolverFactory.createResolver({ aliasFields: ["browser"], exportsFields: ["ex", ["exportsField", "exports"]], @@ -2589,52 +2612,54 @@ describe("exportsFieldPlugin", () => { resolver.resolve({}, fixture3, "exports-field", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture3, "node_modules/exports-field/index"), ); done(); }); }); - it("request ending with slash #1", (done) => { + it("request ending with slash #1", (t, done) => { resolver.resolve({}, fixture, "exports-field/", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch(/Resolving to directories is not possible/); + assert.ok(err instanceof Error); + assert.match(err.message, /Resolving to directories is not possible/); done(); }); }); - it("request ending with slash #2", (done) => { + it("request ending with slash #2", (t, done) => { resolver.resolve({}, fixture, "exports-field/dist/", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch(/Resolving to directories is not possible/); + assert.ok(err instanceof Error); + assert.match(err.message, /Resolving to directories is not possible/); done(); }); }); - it("request ending with slash #3", (done) => { + it("request ending with slash #3", (t, done) => { resolver.resolve({}, fixture, "exports-field/lib/", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch(/Resolving to directories is not possible/); + assert.ok(err instanceof Error); + assert.match(err.message, /Resolving to directories is not possible/); done(); }); }); - it("should throw error if target is invalid", (done) => { + it("should throw error if target is invalid", (t, done) => { resolver.resolve({}, fixture4, "exports-field", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch( + assert.ok(err instanceof Error); + assert.match( + err.message, /Invalid "exports" target "\.\/a\/\.\.\/b\/\.\.\/\.\.\/pack1\/index\.js" defined for "\."/, ); done(); }); }); - it("throw error if exports field is invalid", (done) => { + it("throw error if exports field is invalid", (t, done) => { resolver.resolve( {}, fixture, @@ -2642,15 +2667,15 @@ describe("exportsFieldPlugin", () => { {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch(/should be relative path/); - expect(err.message).toMatch(/umd/); + assert.ok(err instanceof Error); + assert.match(err.message, /should be relative path/); + assert.match(err.message, /umd/); done(); }, ); }); - it("should log the correct info", (done) => { + it("should log the correct info", (t, done) => { const log = []; resolver.resolve( {}, @@ -2660,30 +2685,32 @@ describe("exportsFieldPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "node_modules/exports-field/lib/browser.js"), ); - expect( + assert.deepStrictEqual( log.map((line) => line.replace(fixture, "...").replace(/\\/g, "/")), - ).toEqual([ - "resolve 'exports-field/dist/browser.js' in '...'", - " Parsed request is a module", - " using description file: .../package.json (relative path: .)", - " resolve as module", - " looking for modules in .../node_modules", - " existing directory .../node_modules/exports-field", - " using description file: .../node_modules/exports-field/package.json (relative path: .)", - " using exports field: ./lib/browser.js", - " using description file: .../node_modules/exports-field/package.json (relative path: ./lib/browser.js)", - " existing file: .../node_modules/exports-field/lib/browser.js", - " reporting result .../node_modules/exports-field/lib/browser.js", - ]); + [ + "resolve 'exports-field/dist/browser.js' in '...'", + " Parsed request is a module", + " using description file: .../package.json (relative path: .)", + " resolve as module", + " looking for modules in .../node_modules", + " existing directory .../node_modules/exports-field", + " using description file: .../node_modules/exports-field/package.json (relative path: .)", + " using exports field: ./lib/browser.js", + " using description file: .../node_modules/exports-field/package.json (relative path: ./lib/browser.js)", + " existing file: .../node_modules/exports-field/lib/browser.js", + " reporting result .../node_modules/exports-field/lib/browser.js", + ], + ); done(); }, ); }); - it("should resolve with wildcard pattern #1", (done) => { + it("should resolve with wildcard pattern #1", (t, done) => { const fixture = path.resolve( __dirname, "./fixtures/imports-exports-wildcard/", @@ -2692,14 +2719,15 @@ describe("exportsFieldPlugin", () => { resolver.resolve({}, fixture, "m/features/f.js", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "./node_modules/m/src/features/f.js"), ); done(); }); }); - it("should resolve with wildcard pattern #2", (done) => { + it("should resolve with wildcard pattern #2", (t, done) => { const fixture = path.resolve( __dirname, "./fixtures/imports-exports-wildcard/", @@ -2708,14 +2736,15 @@ describe("exportsFieldPlugin", () => { resolver.resolve({}, fixture, "m/features/y/y.js", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "./node_modules/m/src/features/y/y.js"), ); done(); }); }); - it("should resolve with wildcard pattern #3", (done) => { + it("should resolve with wildcard pattern #3", (t, done) => { const fixture = path.resolve( __dirname, "./fixtures/imports-exports-wildcard/", @@ -2724,14 +2753,15 @@ describe("exportsFieldPlugin", () => { resolver.resolve({}, fixture, "m/features/y/y.js", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "./node_modules/m/src/features/y/y.js"), ); done(); }); }); - it("should resolve with wildcard pattern #4", (done) => { + it("should resolve with wildcard pattern #4", (t, done) => { const fixture = path.resolve( __dirname, "./fixtures/imports-exports-wildcard/", @@ -2745,7 +2775,8 @@ describe("exportsFieldPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "./node_modules/m/src/features/y/y.js"), ); done(); @@ -2753,7 +2784,7 @@ describe("exportsFieldPlugin", () => { ); }); - it("should resolve with wildcard pattern #5", (done) => { + it("should resolve with wildcard pattern #5", (t, done) => { const fixture = path.resolve( __dirname, "./fixtures/imports-exports-wildcard/", @@ -2762,14 +2793,15 @@ describe("exportsFieldPlugin", () => { resolver.resolve({}, fixture, "m/middle/nested/f.js", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "./node_modules/m/src/middle/nested/f.js"), ); done(); }); }); - it("should resolve with wildcard pattern #6", (done) => { + it("should resolve with wildcard pattern #6", (t, done) => { const fixture = path.resolve( __dirname, "./fixtures/imports-exports-wildcard/", @@ -2783,7 +2815,8 @@ describe("exportsFieldPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "./node_modules/m/src/middle-1/nested/f.js"), ); done(); @@ -2791,7 +2824,7 @@ describe("exportsFieldPlugin", () => { ); }); - it("should resolve with wildcard pattern #7", (done) => { + it("should resolve with wildcard pattern #7", (t, done) => { const fixture = path.resolve( __dirname, "./fixtures/imports-exports-wildcard/", @@ -2805,7 +2838,8 @@ describe("exportsFieldPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "./node_modules/m/src/middle-2/nested/f.js"), ); done(); @@ -2813,7 +2847,7 @@ describe("exportsFieldPlugin", () => { ); }); - it("should resolve with wildcard pattern #8", (done) => { + it("should resolve with wildcard pattern #8", (t, done) => { const fixture = path.resolve( __dirname, "./fixtures/imports-exports-wildcard/", @@ -2822,7 +2856,8 @@ describe("exportsFieldPlugin", () => { resolver.resolve({}, fixture, "m/middle-3/nested/f", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve( fixture, "./node_modules/m/src/middle-3/nested/f/nested/f.js", @@ -2832,7 +2867,7 @@ describe("exportsFieldPlugin", () => { }); }); - it("should resolve with wildcard pattern #9", (done) => { + it("should resolve with wildcard pattern #9", (t, done) => { const fixture = path.resolve( __dirname, "./fixtures/imports-exports-wildcard/", @@ -2841,14 +2876,15 @@ describe("exportsFieldPlugin", () => { resolver.resolve({}, fixture, "m/middle-4/f/nested", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "./node_modules/m/src/middle-4/f/f.js"), ); done(); }); }); - it("should resolve with wildcard pattern #10", (done) => { + it("should resolve with wildcard pattern #10", (t, done) => { const fixture = path.resolve( __dirname, "./fixtures/imports-exports-wildcard/", @@ -2857,14 +2893,15 @@ describe("exportsFieldPlugin", () => { resolver.resolve({}, fixture, "m/middle-5/f$/$", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "./node_modules/m/src/middle-5/f$/$.js"), ); done(); }); }); - it("should throw error if target is 'null'", (done) => { + it("should throw error if target is 'null'", (t, done) => { const fixture = path.resolve( __dirname, "./fixtures/imports-exports-wildcard/", @@ -2877,8 +2914,9 @@ describe("exportsFieldPlugin", () => { {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch( + assert.ok(err instanceof Error); + assert.match( + err.message, /"\.\/features\/internal\/file\.js" is not exported/, ); done(); @@ -2886,7 +2924,7 @@ describe("exportsFieldPlugin", () => { ); }); - it("should resolve with the `extensionAlias` option", (done) => { + it("should resolve with the `extensionAlias` option", (t, done) => { const resolver = ResolverFactory.createResolver({ extensions: [".js"], extensionAlias: { @@ -2904,14 +2942,15 @@ describe("exportsFieldPlugin", () => { resolver.resolve({}, fixture, "@org/pkg/string.js", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "./node_modules/@org/pkg/dist/string.js"), ); done(); }); }); - it("should resolve with the `extensionAlias` option #2", (done) => { + it("should resolve with the `extensionAlias` option #2", (t, done) => { const resolver = ResolverFactory.createResolver({ extensions: [".js"], extensionAlias: { @@ -2929,14 +2968,15 @@ describe("exportsFieldPlugin", () => { resolver.resolve({}, fixture, "pkg/string.js", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "./node_modules/pkg/dist/string.js"), ); done(); }); }); - it("should resolve with the `extensionAlias` option #3", (done) => { + it("should resolve with the `extensionAlias` option #3", (t, done) => { const resolver = ResolverFactory.createResolver({ extensions: [".js"], extensionAlias: { @@ -2954,14 +2994,15 @@ describe("exportsFieldPlugin", () => { resolver.resolve({}, fixture, "pkg/string.js", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "./node_modules/pkg/dist/string.js"), ); done(); }); }); - it("should throw error with the `extensionAlias` option", (done) => { + it("should throw error with the `extensionAlias` option", (t, done) => { const resolver = ResolverFactory.createResolver({ extensions: [".js"], extensionAlias: { @@ -2978,13 +3019,13 @@ describe("exportsFieldPlugin", () => { resolver.resolve({}, fixture, "pkg/string.js", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch(/"\.\/string\.ts" is not exported/); + assert.ok(err instanceof Error); + assert.match(err.message, /"\.\/string\.ts" is not exported/); done(); }); }); - it("should throw error with the `extensionAlias` option #2", (done) => { + it("should throw error with the `extensionAlias` option #2", (t, done) => { const resolver = ResolverFactory.createResolver({ extensions: [".js"], extensionAlias: { @@ -3001,13 +3042,13 @@ describe("exportsFieldPlugin", () => { resolver.resolve({}, fixture, "pkg/string.js", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch(/"\.\/string\.ts" is not exported/); + assert.ok(err instanceof Error); + assert.match(err.message, /"\.\/string\.ts" is not exported/); done(); }); }); - it("invalid package target #1", (done) => { + it("invalid package target #1", (t, done) => { resolver.resolve( {}, fixture5, @@ -3016,13 +3057,16 @@ describe("exportsFieldPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toBe(`${path.resolve(fixture5, "./a.js")}?foo=../`); + assert.strictEqual( + result, + `${path.resolve(fixture5, "./a.js")}?foo=../`, + ); done(); }, ); }); - it("invalid package target #2", (done) => { + it("invalid package target #2", (t, done) => { resolver.resolve( {}, fixture5, @@ -3031,13 +3075,16 @@ describe("exportsFieldPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toBe(`${path.resolve(fixture5, "./a.js")}?foo=../#../`); + assert.strictEqual( + result, + `${path.resolve(fixture5, "./a.js")}?foo=../#../`, + ); done(); }, ); }); - it("invalid package target #3", (done) => { + it("invalid package target #3", (t, done) => { resolver.resolve( {}, fixture5, @@ -3045,8 +3092,9 @@ describe("exportsFieldPlugin", () => { {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch( + assert.ok(err instanceof Error); + assert.match( + err.message, /Invalid "exports" target "-bad-specifier-" defined for "\.\/bar"/, ); done(); @@ -3054,7 +3102,7 @@ describe("exportsFieldPlugin", () => { ); }); - it("invalid package target #4", (done) => { + it("invalid package target #4", (t, done) => { resolver.resolve( {}, fixture5, @@ -3062,8 +3110,9 @@ describe("exportsFieldPlugin", () => { {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch( + assert.ok(err instanceof Error); + assert.match( + err.message, /Invalid "exports" target "foo" defined for "\.\/baz-multi"/, ); done(); @@ -3071,7 +3120,7 @@ describe("exportsFieldPlugin", () => { ); }); - it("invalid package target #5", (done) => { + it("invalid package target #5", (t, done) => { resolver.resolve( {}, fixture5, @@ -3080,13 +3129,13 @@ describe("exportsFieldPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(fixture5, "./a.js")); + assert.deepStrictEqual(result, path.resolve(fixture5, "./a.js")); done(); }, ); }); - it("invalid package target #6", (done) => { + it("invalid package target #6", (t, done) => { resolver.resolve( {}, fixture5, @@ -3095,13 +3144,13 @@ describe("exportsFieldPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(fixture5, "./a.js")); + assert.deepStrictEqual(result, path.resolve(fixture5, "./a.js")); done(); }, ); }); - it("invalid package target #7", (done) => { + it("invalid package target #7", (t, done) => { resolver.resolve( {}, fixture5, @@ -3110,13 +3159,13 @@ describe("exportsFieldPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(fixture5, "./a.js")); + assert.deepStrictEqual(result, path.resolve(fixture5, "./a.js")); done(); }, ); }); - it("invalid package target #8", (done) => { + it("invalid package target #8", (t, done) => { resolver.resolve( {}, fixture5, @@ -3124,8 +3173,9 @@ describe("exportsFieldPlugin", () => { {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch( + assert.ok(err instanceof Error); + assert.match( + err.message, /Invalid "exports" target "\/b\/index\.mjs" defined for "\.\/utils\//, ); done(); @@ -3133,7 +3183,7 @@ describe("exportsFieldPlugin", () => { ); }); - it("invalid package target #9", (done) => { + it("invalid package target #9", (t, done) => { resolver.resolve( {}, fixture5, @@ -3141,8 +3191,9 @@ describe("exportsFieldPlugin", () => { {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch( + assert.ok(err instanceof Error); + assert.match( + err.message, /Invalid "exports" target "\/a\/index.mjs" defined for "\.\/utils1\/"/, ); done(); @@ -3150,7 +3201,7 @@ describe("exportsFieldPlugin", () => { ); }); - it("invalid package target #10", (done) => { + it("invalid package target #10", (t, done) => { resolver.resolve( {}, fixture5, @@ -3158,8 +3209,9 @@ describe("exportsFieldPlugin", () => { {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch( + assert.ok(err instanceof Error); + assert.match( + err.message, /Invalid "exports" target "\.\.\/this\/index" defined for "\.\/utils2\/"/, ); done(); @@ -3167,7 +3219,7 @@ describe("exportsFieldPlugin", () => { ); }); - it("invalid package target #11", (done) => { + it("invalid package target #11", (t, done) => { resolver.resolve( {}, fixture5, @@ -3175,8 +3227,9 @@ describe("exportsFieldPlugin", () => { {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch( + assert.ok(err instanceof Error); + assert.match( + err.message, /Invalid "exports" target "\.\.\/this\/index" defined for "\.\/utils3\/\*"/, ); done(); @@ -3184,7 +3237,7 @@ describe("exportsFieldPlugin", () => { ); }); - it("invalid package target #12", (done) => { + it("invalid package target #12", (t, done) => { resolver.resolve( {}, fixture5, @@ -3192,8 +3245,9 @@ describe("exportsFieldPlugin", () => { {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch( + assert.ok(err instanceof Error); + assert.match( + err.message, /Invalid "exports" target "\.\.\/src\/index" defined for "\.\/utils4\/\*"/, ); done(); @@ -3201,7 +3255,7 @@ describe("exportsFieldPlugin", () => { ); }); - it("invalid package target #13", (done) => { + it("invalid package target #13", (t, done) => { resolver.resolve( {}, fixture5, @@ -3209,8 +3263,9 @@ describe("exportsFieldPlugin", () => { {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch( + assert.ok(err instanceof Error); + assert.match( + err.message, /Invalid "exports" target "\.\.\/src\/index" defined for "\.\/utils5\/"/, ); done(); @@ -3218,7 +3273,7 @@ describe("exportsFieldPlugin", () => { ); }); - it("invalid package target #14", (done) => { + it("invalid package target #14", (t, done) => { resolver.resolve( {}, fixture5, @@ -3226,8 +3281,9 @@ describe("exportsFieldPlugin", () => { {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch( + assert.ok(err instanceof Error); + assert.match( + err.message, /Invalid "exports" target "\." defined for "\.\/\*"/, ); done(); @@ -3235,7 +3291,7 @@ describe("exportsFieldPlugin", () => { ); }); - it("invalid package target #15", (done) => { + it("invalid package target #15", (t, done) => { resolver.resolve( {}, fixture5, @@ -3243,12 +3299,13 @@ describe("exportsFieldPlugin", () => { {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); + assert.ok(err instanceof Error); // exports maps ./non-existent.js -> ["-bad-specifier-", "./non-existent.js", "./a.js"] // The first valid target (./non-existent.js) doesn't exist, so the paths array is // abandoned (issue #400) and resolution fails with a "Package path" error // (no fallback to parent node_modules per issue #399 fix). - expect(err.message).toMatch( + assert.match( + err.message, /Package path \.\/non-existent\.js.*no valid target file was found/, ); done(); @@ -3256,7 +3313,7 @@ describe("exportsFieldPlugin", () => { ); }); - it("invalid package target #16", (done) => { + it("invalid package target #16", (t, done) => { resolver.resolve( {}, fixture5, @@ -3264,8 +3321,9 @@ describe("exportsFieldPlugin", () => { {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch( + assert.ok(err instanceof Error); + assert.match( + err.message, /Invalid "exports" target "\.\.\/\.\.\/test\/foo" defined for "\.\/dep\/multi1"/, ); done(); @@ -3273,7 +3331,7 @@ describe("exportsFieldPlugin", () => { ); }); - it("invalid package target #17", (done) => { + it("invalid package target #17", (t, done) => { resolver.resolve( {}, fixture5, @@ -3281,8 +3339,9 @@ describe("exportsFieldPlugin", () => { {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch( + assert.ok(err instanceof Error); + assert.match( + err.message, /Invalid "exports" target "\.\.\/\.\.\/test" defined for "\.\/dep\/multi2"/, ); done(); @@ -3290,7 +3349,7 @@ describe("exportsFieldPlugin", () => { ); }); - it("invalid package target #18", (done) => { + it("invalid package target #18", (t, done) => { resolver.resolve( {}, fixture5, @@ -3298,8 +3357,9 @@ describe("exportsFieldPlugin", () => { {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch( + assert.ok(err instanceof Error); + assert.match( + err.message, /Invalid "exports" target "\.\/c\/\.\.\/b\/\.\.\/\.\.\/pack1\/index\.js" defined for "\.\/dep\/multi4"/, ); done(); @@ -3307,7 +3367,7 @@ describe("exportsFieldPlugin", () => { ); }); - it("invalid package target #19", (done) => { + it("invalid package target #19", (t, done) => { resolver.resolve( {}, fixture5, @@ -3315,8 +3375,9 @@ describe("exportsFieldPlugin", () => { {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch( + assert.ok(err instanceof Error); + assert.match( + err.message, /Invalid "exports" target "\.\/a\/\.\.\/b\/\.\.\/\.\.\/pack1\/index\.js" defined for "\.\/dep\/multi5"/, ); done(); @@ -3324,7 +3385,7 @@ describe("exportsFieldPlugin", () => { ); }); - it("should resolve the valid thing in array of export #1", (done) => { + it("should resolve the valid thing in array of export #1", (t, done) => { resolver.resolve( {}, fixture5, @@ -3333,13 +3394,13 @@ describe("exportsFieldPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(fixture5, "./a.js")); + assert.deepStrictEqual(result, path.resolve(fixture5, "./a.js")); done(); }, ); }); - it("should resolve the valid thing in array of export #2", (done) => { + it("should resolve the valid thing in array of export #2", (t, done) => { resolver.resolve( {}, fixture5, @@ -3348,13 +3409,13 @@ describe("exportsFieldPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(fixture5, "./a.js")); + assert.deepStrictEqual(result, path.resolve(fixture5, "./a.js")); done(); }, ); }); - it("should resolve the valid thing in array of export #3", (done) => { + it("should resolve the valid thing in array of export #3", (t, done) => { resolver.resolve( {}, fixture5, @@ -3363,13 +3424,13 @@ describe("exportsFieldPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(fixture5, "./a.js")); + assert.deepStrictEqual(result, path.resolve(fixture5, "./a.js")); done(); }, ); }); - it("should resolve the valid thing in array of export #4", (done) => { + it("should resolve the valid thing in array of export #4", (t, done) => { resolver.resolve( {}, fixture5, @@ -3378,7 +3439,7 @@ describe("exportsFieldPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(fixture5, "./a.js")); + assert.deepStrictEqual(result, path.resolve(fixture5, "./a.js")); done(); }, ); @@ -3388,7 +3449,7 @@ describe("exportsFieldPlugin", () => { // When workspace/node_modules/pkg has an exports field mapping ./src/index.js -> ./dist/index.js // but ./dist/index.js does NOT exist, resolution should fail with an error // and must NOT fall back to the root node_modules/pkg version. - it("should not fall back to parent node_modules when exports field maps to a missing file (issue #399)", (done) => { + it("should not fall back to parent node_modules when exports field maps to a missing file (issue #399)", (t, done) => { const nestedResolver = ResolverFactory.createResolver({ extensions: [".js"], fileSystem: new CachedInputFileSystem(fs, 4000), @@ -3409,13 +3470,13 @@ describe("exportsFieldPlugin", () => { ), ); } - expect(err).toBeInstanceOf(Error); + assert.ok(err instanceof Error); done(); }, ); }); - it("emits 'is not exported' error when no conditions match", (done) => { + it("emits 'is not exported' error when no conditions match", (t, done) => { const resolver = ResolverFactory.createResolver({ extensions: [".js"], conditionNames: ["unknown-cond"], @@ -3428,7 +3489,7 @@ describe("exportsFieldPlugin", () => { "exports-field/index", {}, (err) => { - expect(err).toBeInstanceOf(Error); + assert.ok(err instanceof Error); done(); }, ); diff --git a/test/extension-alias.test.js b/test/extension-alias.test.js index 2e42de13..5a06a7bb 100644 --- a/test/extension-alias.test.js +++ b/test/extension-alias.test.js @@ -1,10 +1,13 @@ "use strict"; +const assert = require("assert"); const fs = require("fs"); + const path = require("path"); const CachedInputFileSystem = require("../lib/CachedInputFileSystem"); const ResolverFactory = require("../lib/ResolverFactory"); +const { describe, it } = require("./_runner"); /** @typedef {import("../lib/util/entrypoints").ImportsField} ImportsField */ @@ -22,46 +25,49 @@ describe("extension-alias", () => { }, }); - it("should alias fully specified file", (done) => { + it("should alias fully specified file", (t, done) => { resolver.resolve({}, fixture, "./index.js", {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.resolve(fixture, "index.ts")); + assert.deepStrictEqual(result, path.resolve(fixture, "index.ts")); done(); }); }); - it("should alias fully specified file when there are two alternatives", (done) => { + it("should alias fully specified file when there are two alternatives", (t, done) => { resolver.resolve({}, fixture, "./dir/index.js", {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.resolve(fixture, "dir", "index.ts")); + assert.deepStrictEqual(result, path.resolve(fixture, "dir", "index.ts")); done(); }); }); - it("should also allow the second alternative", (done) => { + it("should also allow the second alternative", (t, done) => { resolver.resolve({}, fixture, "./dir2/index.js", {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.resolve(fixture, "dir2", "index.js")); + assert.deepStrictEqual(result, path.resolve(fixture, "dir2", "index.js")); done(); }); }); - it("should support alias option without an array", (done) => { + it("should support alias option without an array", (t, done) => { resolver.resolve({}, fixture, "./dir2/index.mjs", {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.resolve(fixture, "dir2", "index.mts")); + assert.deepStrictEqual( + result, + path.resolve(fixture, "dir2", "index.mts"), + ); done(); }); }); - it("should not allow to fallback to the original extension or add extensions", (done) => { + it("should not allow to fallback to the original extension or add extensions", (t, done) => { resolver.resolve({}, fixture, "./index.mjs", {}, (err, _result) => { - expect(err).toBeInstanceOf(Error); + assert.ok(err instanceof Error); done(); }); }); - it("should try multiple extension aliases in order and logs each failure", (done) => { + it("should try multiple extension aliases in order and logs each failure", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem: nodeFileSystem, extensionAlias: { ".js": [".missing1", ".missing2", ".js"] }, @@ -74,12 +80,14 @@ describe("extension-alias", () => { { log: (m) => log.push(m) }, (err, result) => { if (err) return done(err); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(path.join(__dirname, "fixtures"), "a.js"), ); - expect( + assert.strictEqual( log.some((l) => l.includes("Failed to alias from extension alias")), - ).toBe(true); + true, + ); done(); }, ); @@ -92,32 +100,32 @@ describe("extension-alias", () => { "imports-field-extension-alias", ); - it("should apply extension alias to paths resolved via imports field", (done) => { + it("should apply extension alias to paths resolved via imports field", (t, done) => { resolver.resolve({}, importsFixture, "#foo", {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.resolve(importsFixture, "foo.ts")); + assert.deepStrictEqual(result, path.resolve(importsFixture, "foo.ts")); done(); }); }); - it("should fall back to later alternatives when first alias does not exist", (done) => { + it("should fall back to later alternatives when first alias does not exist", (t, done) => { resolver.resolve({}, importsFixture, "#bar", {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.resolve(importsFixture, "bar.js")); + assert.deepStrictEqual(result, path.resolve(importsFixture, "bar.js")); done(); }); }); - it("should support single-string alias (no array) via imports field", (done) => { + it("should support single-string alias (no array) via imports field", (t, done) => { resolver.resolve({}, importsFixture, "#only", {}, (err, _result) => { // ".mjs": ".mts" is a strict mapping with no fallback, so this // should error because only.mts does not exist - expect(err).toBeInstanceOf(Error); + assert.ok(err instanceof Error); done(); }); }); - it("should not fall back to the original extension via imports field (strict alias)", (done) => { + it("should not fall back to the original extension via imports field (strict alias)", (t, done) => { const strictResolver = ResolverFactory.createResolver({ extensions: [".js"], fileSystem: nodeFileSystem, @@ -125,7 +133,7 @@ describe("extension-alias", () => { }); strictResolver.resolve({}, importsFixture, "#bar", {}, (err, _result) => { // bar.ts does not exist and we explicitly disallow fallback - expect(err).toBeInstanceOf(Error); + assert.ok(err instanceof Error); done(); }); }); @@ -138,7 +146,7 @@ describe("extension-alias", () => { "exports-field-extension-alias-opt-in", ); - it("should not apply extension alias to exports-field targets by default (Node.js-aligned)", (done) => { + it("should not apply extension alias to exports-field targets by default (Node.js-aligned)", (t, done) => { const defaultResolver = ResolverFactory.createResolver({ extensions: [".js"], extensionAlias: { ".js": [".ts", ".js"] }, @@ -153,7 +161,8 @@ describe("extension-alias", () => { {}, (err, result) => { if (err) return done(err); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(exportsFixture, "./node_modules/pkg/dist/string.js"), ); done(); @@ -161,7 +170,7 @@ describe("extension-alias", () => { ); }); - it("should prefer the TS source over the exports-declared JS target when the option is enabled", (done) => { + it("should prefer the TS source over the exports-declared JS target when the option is enabled", (t, done) => { const tsResolver = ResolverFactory.createResolver({ extensions: [".js"], extensionAlias: { ".js": [".ts", ".js"] }, @@ -177,7 +186,8 @@ describe("extension-alias", () => { {}, (err, result) => { if (err) return done(err); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(exportsFixture, "./node_modules/pkg/dist/string.ts"), ); done(); @@ -196,18 +206,24 @@ describe("extension-alias", () => { }, }); - it("directory", (done) => { + it("directory", (t, done) => { resolver.resolve({}, fixture, "./dir2", {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.resolve(fixture, "dir2", "index.js")); + assert.deepStrictEqual( + result, + path.resolve(fixture, "dir2", "index.js"), + ); done(); }); }); - it("file", (done) => { + it("file", (t, done) => { resolver.resolve({}, fixture, "./dir2/index", {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.resolve(fixture, "dir2", "index.js")); + assert.deepStrictEqual( + result, + path.resolve(fixture, "dir2", "index.js"), + ); done(); }); }); diff --git a/test/extensions.test.js b/test/extensions.test.js index 4d6fd705..16ca60fe 100644 --- a/test/extensions.test.js +++ b/test/extensions.test.js @@ -1,8 +1,11 @@ "use strict"; +const assert = require("assert"); const fs = require("fs"); + const path = require("path"); const { CachedInputFileSystem, ResolverFactory } = require("../"); +const { describe, it } = require("./_runner"); const nodeFileSystem = new CachedInputFileSystem(fs, 4000); @@ -25,81 +28,85 @@ const resolver3 = ResolverFactory.createResolver({ const fixture = path.resolve(__dirname, "fixtures", "extensions"); describe("extensions", () => { - it("should resolve according to order of provided extensions", (done) => { + it("should resolve according to order of provided extensions", (t, done) => { resolver.resolve({}, fixture, "./foo", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(fixture, "foo.ts")); + assert.deepStrictEqual(result, path.resolve(fixture, "foo.ts")); done(); }); }); - it("should resolve according to order of provided extensions (dir index)", (done) => { + it("should resolve according to order of provided extensions (dir index)", (t, done) => { resolver.resolve({}, fixture, "./dir", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(fixture, "dir/index.ts")); + assert.deepStrictEqual(result, path.resolve(fixture, "dir/index.ts")); done(); }); }); - it("should resolve according to main field in module root", (done) => { + it("should resolve according to main field in module root", (t, done) => { resolver.resolve({}, fixture, ".", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(fixture, "index.js")); + assert.deepStrictEqual(result, path.resolve(fixture, "index.js")); done(); }); }); - it("should resolve single file module before directory", (done) => { + it("should resolve single file module before directory", (t, done) => { resolver.resolve({}, fixture, "module", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(fixture, "node_modules/module.js")); + assert.deepStrictEqual( + result, + path.resolve(fixture, "node_modules/module.js"), + ); done(); }); }); - it("should resolve trailing slash directory before single file", (done) => { + it("should resolve trailing slash directory before single file", (t, done) => { resolver.resolve({}, fixture, "module/", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "node_modules/module/index.ts"), ); done(); }); }); - it("should not resolve to file when request has a trailing slash (relative)", (done) => { + it("should not resolve to file when request has a trailing slash (relative)", (t, done) => { resolver.resolve({}, fixture, "./foo.js/", {}, (err, _result) => { if (!err) return done(new Error("No error")); - expect(err).toBeInstanceOf(Error); + assert.ok(err instanceof Error); done(); }); }); - it("should not resolve to file when request has a trailing slash (module)", (done) => { + it("should not resolve to file when request has a trailing slash (module)", (t, done) => { resolver.resolve({}, fixture, "module.js/", {}, (err, _result) => { if (!err) return done(new Error("No error")); - expect(err).toBeInstanceOf(Error); + assert.ok(err instanceof Error); done(); }); }); - it("should default enforceExtension to true when extensions includes an empty string", (done) => { + it("should default enforceExtension to true when extensions includes an empty string", (t, done) => { const missingDependencies = new Set(); resolver2.resolve({}, fixture, "./foo", { missingDependencies }, () => { - expect(missingDependencies).not.toContain(path.resolve(fixture, "foo")); + assert.ok(!missingDependencies.has(path.resolve(fixture, "foo"))); done(); }); }); - it("should respect enforceExtension when extensions includes an empty string", (done) => { + it("should respect enforceExtension when extensions includes an empty string", (t, done) => { const missingDependencies = new Set(); resolver3.resolve({}, fixture, "./foo", { missingDependencies }, () => { - expect(missingDependencies).toContain(path.resolve(fixture, "foo")); + assert.ok(missingDependencies.has(path.resolve(fixture, "foo"))); done(); }); }); diff --git a/test/fallback.test.js b/test/fallback.test.js index 9887da13..ed10c12f 100644 --- a/test/fallback.test.js +++ b/test/fallback.test.js @@ -1,7 +1,10 @@ "use strict"; +const assert = require("assert"); + const { Volume } = require("memfs"); const { ResolverFactory } = require("../"); +const { beforeEach, describe, it } = require("./_runner"); describe("fallback", () => { let resolver; @@ -46,65 +49,96 @@ describe("fallback", () => { }); it("should resolve a not aliased module", () => { - expect(resolver.resolveSync({}, "/", "a")).toBe("/a/index"); - expect(resolver.resolveSync({}, "/", "a/index")).toBe("/a/index"); - expect(resolver.resolveSync({}, "/", "a/dir")).toBe("/a/dir/index"); - expect(resolver.resolveSync({}, "/", "a/dir/index")).toBe("/a/dir/index"); + assert.strictEqual(resolver.resolveSync({}, "/", "a"), "/a/index"); + assert.strictEqual(resolver.resolveSync({}, "/", "a/index"), "/a/index"); + assert.strictEqual(resolver.resolveSync({}, "/", "a/dir"), "/a/dir/index"); + assert.strictEqual( + resolver.resolveSync({}, "/", "a/dir/index"), + "/a/dir/index", + ); }); it("should resolve an fallback module", () => { - expect(resolver.resolveSync({}, "/", "aliasA")).toBe("/a/index"); - expect(resolver.resolveSync({}, "/", "aliasA/index")).toBe("/a/index"); - expect(resolver.resolveSync({}, "/", "aliasA/dir")).toBe("/a/dir/index"); - expect(resolver.resolveSync({}, "/", "aliasA/dir/index")).toBe( + assert.strictEqual(resolver.resolveSync({}, "/", "aliasA"), "/a/index"); + assert.strictEqual( + resolver.resolveSync({}, "/", "aliasA/index"), + "/a/index", + ); + assert.strictEqual( + resolver.resolveSync({}, "/", "aliasA/dir"), + "/a/dir/index", + ); + assert.strictEqual( + resolver.resolveSync({}, "/", "aliasA/dir/index"), "/a/dir/index", ); }); it("should resolve an ignore module", () => { - expect(resolver.resolveSync({}, "/", "ignored")).toBe(false); + assert.strictEqual(resolver.resolveSync({}, "/", "ignored"), false); }); it("should resolve a recursive aliased module", () => { - expect(resolver.resolveSync({}, "/", "recursive")).toBe("/recursive/index"); - expect(resolver.resolveSync({}, "/", "recursive/index")).toBe( + assert.strictEqual( + resolver.resolveSync({}, "/", "recursive"), "/recursive/index", ); - expect(resolver.resolveSync({}, "/", "recursive/dir")).toBe( + assert.strictEqual( + resolver.resolveSync({}, "/", "recursive/index"), + "/recursive/index", + ); + assert.strictEqual( + resolver.resolveSync({}, "/", "recursive/dir"), "/recursive/dir/index", ); - expect(resolver.resolveSync({}, "/", "recursive/dir/index")).toBe( + assert.strictEqual( + resolver.resolveSync({}, "/", "recursive/dir/index"), "/recursive/dir/index", ); - expect(resolver.resolveSync({}, "/", "recursive/file")).toBe( + assert.strictEqual( + resolver.resolveSync({}, "/", "recursive/file"), "/recursive/dir/file", ); }); it("should resolve a file aliased module with a query", () => { - expect(resolver.resolveSync({}, "/", "b?query")).toBe("/b/index?query"); - expect(resolver.resolveSync({}, "/", "c?query")).toBe("/c/index?query"); + assert.strictEqual( + resolver.resolveSync({}, "/", "b?query"), + "/b/index?query", + ); + assert.strictEqual( + resolver.resolveSync({}, "/", "c?query"), + "/c/index?query", + ); }); it("should resolve a path in a file aliased module", () => { - expect(resolver.resolveSync({}, "/", "b/index")).toBe("/b/index"); - expect(resolver.resolveSync({}, "/", "b/dir")).toBe("/b/dir/index"); - expect(resolver.resolveSync({}, "/", "b/dir/index")).toBe("/b/dir/index"); - expect(resolver.resolveSync({}, "/", "c/index")).toBe("/c/index"); - expect(resolver.resolveSync({}, "/", "c/dir")).toBe("/c/dir/index"); - expect(resolver.resolveSync({}, "/", "c/dir/index")).toBe("/c/dir/index"); + assert.strictEqual(resolver.resolveSync({}, "/", "b/index"), "/b/index"); + assert.strictEqual(resolver.resolveSync({}, "/", "b/dir"), "/b/dir/index"); + assert.strictEqual( + resolver.resolveSync({}, "/", "b/dir/index"), + "/b/dir/index", + ); + assert.strictEqual(resolver.resolveSync({}, "/", "c/index"), "/c/index"); + assert.strictEqual(resolver.resolveSync({}, "/", "c/dir"), "/c/dir/index"); + assert.strictEqual( + resolver.resolveSync({}, "/", "c/dir/index"), + "/c/dir/index", + ); }); it("should resolve a file in multiple aliased dirs", () => { - expect(resolver.resolveSync({}, "/", "multiAlias/dir/file")).toBe( + assert.strictEqual( + resolver.resolveSync({}, "/", "multiAlias/dir/file"), "/e/dir/file", ); - expect(resolver.resolveSync({}, "/", "multiAlias/anotherDir")).toBe( + assert.strictEqual( + resolver.resolveSync({}, "/", "multiAlias/anotherDir"), "/e/anotherDir/index", ); }); - it("should log the correct info", (done) => { + it("should log the correct info", (t, done) => { const log = []; resolver.resolve( {}, @@ -113,8 +147,8 @@ describe("fallback", () => { { log: (v) => log.push(v) }, (err, result) => { if (err) return done(err); - expect(result).toBe("/a/dir/index"); - expect(log).toEqual([ + assert.strictEqual(result, "/a/dir/index"); + assert.deepStrictEqual(log, [ "resolve 'aliasA/dir' in '/'", " Parsed request is a module", " No description file found in / or above", diff --git a/test/file-url-options.test.js b/test/file-url-options.test.js index 1578e076..2ada9253 100644 --- a/test/file-url-options.test.js +++ b/test/file-url-options.test.js @@ -1,5 +1,7 @@ "use strict"; +const assert = require("assert"); + const fs = require("fs"); const path = require("path"); const { fileURLToPath, pathToFileURL } = require("url"); @@ -7,6 +9,7 @@ const enhancedResolve = require("../lib"); const CachedInputFileSystem = require("../lib/CachedInputFileSystem"); const ResolverFactory = require("../lib/ResolverFactory"); const { toPath } = require("../lib/util/path"); +const { describe, it } = require("./_runner"); describe("file: URL path options", () => { const fixtures = path.resolve(__dirname, "fixtures"); @@ -21,75 +24,75 @@ describe("file: URL path options", () => { }); describe("roots", () => { - it("should accept a URL instance", (done) => { + it("should accept a URL instance", (t, done) => { const resolver = makeResolver({ roots: [pathToFileURL(fixtures)] }); resolver.resolve({}, fixtures, "/b.js", {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.resolve(fixtures, "b.js")); + assert.deepStrictEqual(result, path.resolve(fixtures, "b.js")); done(); }); }); }); describe("modules", () => { - it("should accept a URL instance", (done) => { + it("should accept a URL instance", (t, done) => { const resolver = makeResolver({ modules: [pathToFileURL(modulesDir)] }); resolver.resolve({}, fixtures, "m1/a", {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.resolve(modulesDir, "m1/a.js")); + assert.deepStrictEqual(result, path.resolve(modulesDir, "m1/a.js")); done(); }); }); - it("should accept a single URL instance", (done) => { + it("should accept a single URL instance", (t, done) => { const resolver = makeResolver({ modules: pathToFileURL(modulesDir) }); resolver.resolve({}, fixtures, "m1/a", {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.resolve(modulesDir, "m1/a.js")); + assert.deepStrictEqual(result, path.resolve(modulesDir, "m1/a.js")); done(); }); }); - it("should keep folder-name entries untouched", (done) => { + it("should keep folder-name entries untouched", (t, done) => { const resolver = makeResolver({ modules: ["node_modules"] }); resolver.resolve({}, fixtures, "m1/a", {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.resolve(modulesDir, "m1/a.js")); + assert.deepStrictEqual(result, path.resolve(modulesDir, "m1/a.js")); done(); }); }); }); describe("alias", () => { - it("should accept a URL instance as the target", (done) => { + it("should accept a URL instance as the target", (t, done) => { const resolver = makeResolver({ alias: { "@": pathToFileURL(fixtures) }, }); resolver.resolve({}, fixtures, "@/b.js", {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.resolve(fixtures, "b.js")); + assert.deepStrictEqual(result, path.resolve(fixtures, "b.js")); done(); }); }); - it("should accept a URL instance in an array target", (done) => { + it("should accept a URL instance in an array target", (t, done) => { const resolver = makeResolver({ alias: { "@": [pathToFileURL(modulesDir), pathToFileURL(fixtures)] }, }); resolver.resolve({}, fixtures, "@/b.js", {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.resolve(fixtures, "b.js")); + assert.deepStrictEqual(result, path.resolve(fixtures, "b.js")); done(); }); }); - it("should accept array-form entries with a URL target", (done) => { + it("should accept array-form entries with a URL target", (t, done) => { const resolver = makeResolver({ alias: [{ name: "@", alias: pathToFileURL(fixtures) }], }); resolver.resolve({}, fixtures, "@/b.js", {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.resolve(fixtures, "b.js")); + assert.deepStrictEqual(result, path.resolve(fixtures, "b.js")); done(); }); }); @@ -97,47 +100,47 @@ describe("file: URL path options", () => { // A `file:` string target is not converted here (strings stay literal), // but the rewritten request still resolves because the request side // (`parseIdentifier`) converts `file:` request strings. - it("should still resolve a file: string target via request parsing", (done) => { + it("should still resolve a file: string target via request parsing", (t, done) => { const resolver = makeResolver({ alias: { "@": String(pathToFileURL(fixtures)) }, }); resolver.resolve({}, fixtures, "@/b.js", {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.resolve(fixtures, "b.js")); + assert.deepStrictEqual(result, path.resolve(fixtures, "b.js")); done(); }); }); }); describe("restrictions", () => { - it("should accept a URL instance", (done) => { + it("should accept a URL instance", (t, done) => { const resolver = makeResolver({ restrictions: [pathToFileURL(fixtures)], }); resolver.resolve({}, fixtures, "./b.js", {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.resolve(fixtures, "b.js")); + assert.deepStrictEqual(result, path.resolve(fixtures, "b.js")); done(); }); }); - it("should keep RegExp entries untouched", (done) => { + it("should keep RegExp entries untouched", (t, done) => { const resolver = makeResolver({ restrictions: [/\.js$/] }); resolver.resolve({}, fixtures, "./b.js", {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.resolve(fixtures, "b.js")); + assert.deepStrictEqual(result, path.resolve(fixtures, "b.js")); done(); }); }); // A `file:` string restriction stays literal, so no real path is ever // "inside" it and resolution is blocked — use a URL instance or a path. - it("should treat a file: string restriction as a literal path", (done) => { + it("should treat a file: string restriction as a literal path", (t, done) => { const resolver = makeResolver({ restrictions: [String(pathToFileURL(fixtures))], }); resolver.resolve({}, fixtures, "./b.js", {}, (err) => { - expect(err).toBeInstanceOf(Error); + assert.ok(err instanceof Error); done(); }); }); @@ -147,7 +150,7 @@ describe("file: URL path options", () => { const tsconfigDir = path.resolve(fixtures, "tsconfig-paths", "base"); const tsconfigFile = path.join(tsconfigDir, "tsconfig.json"); - it("should accept a URL instance as the config file", (done) => { + it("should accept a URL instance as the config file", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx"], @@ -162,7 +165,8 @@ describe("file: URL path options", () => { {}, (err, result) => { if (err) return done(err); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(tsconfigDir, "src", "components", "button.ts"), ); done(); @@ -170,7 +174,7 @@ describe("file: URL path options", () => { ); }); - it("should accept a URL instance as options.configFile", (done) => { + it("should accept a URL instance as options.configFile", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx"], @@ -185,7 +189,8 @@ describe("file: URL path options", () => { {}, (err, result) => { if (err) return done(err); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(tsconfigDir, "src", "components", "button.ts"), ); done(); @@ -196,15 +201,15 @@ describe("file: URL path options", () => { describe("toPath", () => { it("should convert a file: URL instance to a path", () => { - expect(toPath(pathToFileURL(modulesDir))).toBe(modulesDir); + assert.strictEqual(toPath(pathToFileURL(modulesDir)), modulesDir); }); // A string is always a literal path (matches Node fs, nodejs/node#17658), // so a directory literally named `file:` is never mistaken for a URL. it("should leave strings untouched, including `file:`-prefixed ones", () => { - expect(toPath("file:foo")).toBe("file:foo"); - expect(toPath("file:///abs")).toBe("file:///abs"); - expect(toPath(modulesDir)).toBe(modulesDir); + assert.strictEqual(toPath("file:foo"), "file:foo"); + assert.strictEqual(toPath("file:///abs"), "file:///abs"); + assert.strictEqual(toPath(modulesDir), modulesDir); }); }); }); @@ -220,7 +225,7 @@ describe("file: URL resolve context and request", () => { }); describe("context (path) argument", () => { - it("should accept a URL instance as the context path", (done) => { + it("should accept a URL instance as the context path", (t, done) => { resolver.resolve( {}, pathToFileURL(fixtures), @@ -228,25 +233,26 @@ describe("file: URL resolve context and request", () => { {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(bFile); + assert.deepStrictEqual(result, bFile); done(); }, ); }); - it("should accept a URL context when the context object is omitted", (done) => { + it("should accept a URL context when the context object is omitted", (t, done) => { resolver.resolve(pathToFileURL(fixtures), "./b.js", {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(bFile); + assert.deepStrictEqual(result, bFile); done(); }); }); - it("should still reject a non-string, non-URL context path", (done) => { + it("should still reject a non-string, non-URL context path", (t, done) => { // @ts-expect-error for tests resolver.resolve({}, 42, "./b.js", {}, (err) => { - expect(err).toBeInstanceOf(Error); - expect(/** @type {Error} */ (err).message).toMatch( + assert.ok(err instanceof Error); + assert.match( + /** @type {Error} */ (err).message, /path argument is not a string/, ); done(); @@ -255,7 +261,7 @@ describe("file: URL resolve context and request", () => { }); describe("request argument", () => { - it("should accept a file: URL instance as the request", (done) => { + it("should accept a file: URL instance as the request", (t, done) => { resolver.resolve( {}, fixtures, @@ -263,17 +269,18 @@ describe("file: URL resolve context and request", () => { {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(bFile); + assert.deepStrictEqual(result, bFile); done(); }, ); }); - it("should still reject a non-string, non-URL request", (done) => { + it("should still reject a non-string, non-URL request", (t, done) => { // @ts-expect-error for tests resolver.resolve({}, fixtures, 42, {}, (err) => { - expect(err).toBeInstanceOf(Error); - expect(/** @type {Error} */ (err).message).toMatch( + assert.ok(err instanceof Error); + assert.match( + /** @type {Error} */ (err).message, /request argument is not a string/, ); done(); @@ -285,37 +292,42 @@ describe("file: URL resolve context and request", () => { // context)` — request is the first param, context the base — so an absolute // `file:` request wins over the context base, exactly like the URL constructor. describe("both context and request as URL", () => { - it("should resolve a URL request against a URL context like new URL()", (done) => { + it("should resolve a URL request against a URL context like new URL()", (t, done) => { const contextURL = pathToFileURL(fixtures); const requestURL = pathToFileURL(bFile); resolver.resolve({}, contextURL, requestURL, {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(bFile); - expect(result).toEqual(fileURLToPath(new URL(requestURL, contextURL))); + assert.deepStrictEqual(result, bFile); + assert.deepStrictEqual( + result, + fileURLToPath(new URL(requestURL, contextURL)), + ); done(); }); }); }); describe("high-level resolve API", () => { - it("resolve should accept a URL context with the context object omitted", (done) => { + it("resolve should accept a URL context with the context object omitted", (t, done) => { enhancedResolve(pathToFileURL(fixtures), "./b.js", (err, result) => { if (err) return done(err); - expect(result).toEqual(bFile); + assert.deepStrictEqual(result, bFile); done(); }); }); it("resolveSync should accept a URL context", () => { - expect(enhancedResolve.sync(pathToFileURL(fixtures), "./b.js")).toEqual( + assert.deepStrictEqual( + enhancedResolve.sync(pathToFileURL(fixtures), "./b.js"), bFile, ); }); it("resolvePromise should accept a URL context", async () => { - await expect( - enhancedResolve.promise(pathToFileURL(fixtures), "./b.js"), - ).resolves.toEqual(bFile); + assert.deepStrictEqual( + await enhancedResolve.promise(pathToFileURL(fixtures), "./b.js"), + bFile, + ); }); }); }); diff --git a/test/fileURLToPath.test.js b/test/fileURLToPath.test.js index d9599cd8..99b026c1 100644 --- a/test/fileURLToPath.test.js +++ b/test/fileURLToPath.test.js @@ -1,8 +1,11 @@ "use strict"; +const assert = require("assert"); + const path = require("path"); const { pathToFileURL } = require("url"); const fileURLToPath = require("../lib/util/fileURLToPath"); +const { describe, it } = require("./_runner"); describe("fileURLToPath", () => { // Expected values are pinned literals (computed once from Node's reference @@ -30,7 +33,7 @@ describe("fileURLToPath", () => { describe("posix branch", () => { for (const [input, expected] of posixCases) { it(`converts ${input}`, () => { - expect(fileURLToPath(input, { windows: false })).toBe(expected); + assert.strictEqual(fileURLToPath(input, { windows: false }), expected); }); } }); @@ -38,55 +41,66 @@ describe("fileURLToPath", () => { describe("windows branch", () => { for (const [input, expected] of windowsCases) { it(`converts ${input}`, () => { - expect(fileURLToPath(input, { windows: true })).toBe(expected); + assert.strictEqual(fileURLToPath(input, { windows: true }), expected); }); } }); it("accepts a URL instance", () => { const url = new URL("file:///home/user/project"); - expect(fileURLToPath(url, { windows: false })).toBe("/home/user/project"); + assert.strictEqual( + fileURLToPath(url, { windows: false }), + "/home/user/project", + ); }); it("round-trips pathToFileURL on the host platform", () => { // Build a host-absolute path so the round-trip is correct on Windows // (drive letter) as well as POSIX, using the host-default platform branch. - const p = path.resolve("a b", "c"); - expect(fileURLToPath(pathToFileURL(p))).toBe(p); + const pth = path.resolve("a b", "c"); + assert.strictEqual(fileURLToPath(pathToFileURL(pth)), pth); }); it("throws for a non-file: scheme", () => { - expect(() => fileURLToPath("http://example.com/x")).toThrow("scheme file"); + assert.throws( + () => fileURLToPath("http://example.com/x"), + (err) => err instanceof Error && err.message.includes("scheme file"), + ); }); it("throws for an encoded slash in the posix branch", () => { - expect(() => fileURLToPath("file:///a%2fb", { windows: false })).toThrow( + assert.throws( + () => fileURLToPath("file:///a%2fb", { windows: false }), /encoded \/ characters/, ); }); it("throws for an encoded backslash in the windows branch", () => { - expect(() => fileURLToPath("file:///C:/a%5cb", { windows: true })).toThrow( + assert.throws( + () => fileURLToPath("file:///C:/a%5cb", { windows: true }), /encoded \\ or \/ characters/, ); }); it("throws for a non-absolute windows drive path", () => { - expect(() => fileURLToPath("file:///foo", { windows: true })).toThrow( - "must be absolute", + assert.throws( + () => fileURLToPath("file:///foo", { windows: true }), + (err) => err instanceof Error && err.message.includes("must be absolute"), ); }); it("throws for a posix host that is not empty", () => { - expect(() => fileURLToPath("file://host/x", { windows: false })).toThrow( + assert.throws( + () => fileURLToPath("file://host/x", { windows: false }), /host/, ); }); it("decodes a UNC path with an ASCII host in the windows branch", () => { - expect( + assert.strictEqual( fileURLToPath("file://server/share/file.js", { windows: true }), - ).toBe("\\\\server\\share\\file.js"); + "\\\\server\\share\\file.js", + ); }); // Documented deviation: Node runs UNC hosts through domainToUnicode @@ -94,7 +108,8 @@ describe("fileURLToPath", () => { // differing only for rare internationalized UNC hosts. // cspell:ignore aagokeh it("keeps a punycode UNC host as-is (deviation from Node)", () => { - expect(fileURLToPath("file://xn--h1aagokeh/a", { windows: true })).toBe( + assert.strictEqual( + fileURLToPath("file://xn--h1aagokeh/a", { windows: true }), "\\\\xn--h1aagokeh\\a", ); }); diff --git a/test/forEachBail.test.js b/test/forEachBail.test.js index 8a9ce90b..b0dc831a 100644 --- a/test/forEachBail.test.js +++ b/test/forEachBail.test.js @@ -1,9 +1,11 @@ "use strict"; +const assert = require("assert"); const { forEachBail } = require("../"); +const { describe, it } = require("./_runner"); describe("forEachBail", () => { - it("should iterate correctly", (done) => { + it("should iterate correctly", (t, done) => { const log = []; forEachBail( [0, 1, 2, 3, 4, 5, 6], @@ -17,48 +19,48 @@ describe("forEachBail", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("Should have result")); - expect(result).toEqual({ path: "test" }); - expect(log).toEqual([0, 1, 2, 3, 4, 5]); + assert.deepStrictEqual(result, { path: "test" }); + assert.deepStrictEqual(log, [0, 1, 2, 3, 4, 5]); done(); }, ); }); - it("should handle empty array", (done) => { + it("should handle empty array", (t, done) => { forEachBail( [], () => { done(new Error("Should not be called")); }, (err, result) => { - expect(err).toBeUndefined(); - expect(result).toBeUndefined(); + assert.strictEqual(err, undefined); + assert.strictEqual(result, undefined); done(); }, ); }); - it("should sync finish with undefined", (done) => { + it("should sync finish with undefined", (t, done) => { forEachBail( [2, 3, 4, 5, 6], (value, callback) => callback(), (err, result) => { - expect(err).toBeUndefined(); - expect(result).toBeUndefined(); + assert.strictEqual(err, undefined); + assert.strictEqual(result, undefined); done(); }, ); }); - it("should async finish with undefined", (done) => { + it("should async finish with undefined", (t, done) => { forEachBail( [2, 3, 4, 5, 6], (value, callback) => { process.nextTick(callback); }, (err, result) => { - expect(err).toBeUndefined(); - expect(result).toBeUndefined(); + assert.strictEqual(err, undefined); + assert.strictEqual(result, undefined); done(); }, ); diff --git a/test/fullSpecified.test.js b/test/fullSpecified.test.js index c8c666b3..6d6bda5f 100644 --- a/test/fullSpecified.test.js +++ b/test/fullSpecified.test.js @@ -1,7 +1,10 @@ "use strict"; +const assert = require("assert"); + const { Volume } = require("memfs"); const { ResolverFactory } = require("../"); +const { describe, it } = require("./_runner"); describe("fullSpecified", () => { const fileSystem = Volume.fromJSON( @@ -80,9 +83,9 @@ describe("fullSpecified", () => { const request = failingResolves[key]; it(`should fail resolving ${key}`, () => { - expect(() => { + assert.throws(() => { resolver.resolveSync({}, "/a", request); - }).toThrow(/Can't resolve/); + }, /Can't resolve/); }); } @@ -91,7 +94,10 @@ describe("fullSpecified", () => { it(`should resolve ${key} successfully`, () => { try { - expect(resolver.resolveSync({}, "/a", request)).toEqual(expected); + assert.deepStrictEqual( + resolver.resolveSync({}, "/a", request), + expected, + ); } catch (err) { err.message += `\n${err.details}`; throw err; @@ -121,7 +127,8 @@ describe("fullSpecified", () => { it(`should resolve ${key} successfully to an context`, () => { try { - expect(contextResolver.resolveSync({}, "/a", request)).toEqual( + assert.deepStrictEqual( + contextResolver.resolveSync({}, "/a", request), expected, ); } catch (err) { diff --git a/test/getPaths.test.js b/test/getPaths.test.js index 7b5f5c8c..1fc80413 100644 --- a/test/getPaths.test.js +++ b/test/getPaths.test.js @@ -1,7 +1,10 @@ "use strict"; +const assert = require("assert"); + const getPaths = require("../lib/getPaths"); const { getPathsCached } = require("../lib/getPaths"); +const { describe, it } = require("./_runner"); /** * @type {[string, { paths: string[], segments: string[] }][]} @@ -21,8 +24,8 @@ describe("get paths", () => { for (const case_ of cases) { it(case_[0], () => { const { paths, segments } = getPaths(case_[0]); - expect(paths).toEqual(case_[1].paths); - expect(segments).toEqual(case_[1].segments); + assert.deepStrictEqual(paths, case_[1].paths); + assert.deepStrictEqual(segments, case_[1].segments); }); } }); @@ -33,15 +36,19 @@ describe("getPathsCached", () => { const a = getPathsCached(fs, "/a/b/c"); const b = getPathsCached(fs, "/a/b/c"); // Same cached object — paths/segments arrays are shared. - expect(a).toBe(b); - expect(a.paths).toBe(b.paths); - expect(a.segments).toBe(b.segments); + assert.strictEqual(a, b); + assert.strictEqual(a.paths, b.paths); + assert.strictEqual(a.segments, b.segments); }); it("still returns correct values after cache miss", () => { const fs = /** @type {import("../lib/Resolver").FileSystem} */ ({}); - expect(getPathsCached(fs, "/a/b").paths).toEqual(["/a/b", "/a", "/"]); - expect(getPathsCached(fs, "/x/y/z").paths).toEqual([ + assert.deepStrictEqual(getPathsCached(fs, "/a/b").paths, [ + "/a/b", + "/a", + "/", + ]); + assert.deepStrictEqual(getPathsCached(fs, "/x/y/z").paths, [ "/x/y/z", "/x/y", "/x", @@ -53,9 +60,9 @@ describe("getPathsCached", () => { const fs = /** @type {import("../lib/Resolver").FileSystem} */ ({}); const a = getPathsCached(fs, "/"); const b = getPathsCached(fs, "/"); - expect(a).toBe(b); - expect(a.paths).toEqual(["/"]); - expect(a.segments).toEqual([""]); + assert.strictEqual(a, b); + assert.deepStrictEqual(a.paths, ["/"]); + assert.deepStrictEqual(a.segments, [""]); }); it("keeps caches independent across filesystems", () => { @@ -64,7 +71,7 @@ describe("getPathsCached", () => { const first = getPathsCached(fsA, "/p/q"); const second = getPathsCached(fsB, "/p/q"); // Values equal but not the same object — separate cache namespaces. - expect(first).not.toBe(second); - expect(first.paths).toEqual(second.paths); + assert.notStrictEqual(first, second); + assert.deepStrictEqual(first.paths, second.paths); }); }); diff --git a/test/identifier.test.js b/test/identifier.test.js index 5e730206..f009d2d7 100644 --- a/test/identifier.test.js +++ b/test/identifier.test.js @@ -1,6 +1,8 @@ "use strict"; +const assert = require("assert"); const { parseIdentifier } = require("../lib/util/identifier"); +const { describe, it } = require("./_runner"); /** * @typedef {{ input: string, expected: [string, string, string] }} TestSuite @@ -17,7 +19,7 @@ describe("identifier", () => { if (!parsed) throw new Error("should not be null"); - expect(parsed).toEqual(expected); + assert.deepStrictEqual(parsed, expected); }); } } @@ -190,11 +192,11 @@ describe("identifier", () => { describe("parse identifier. malformed inputs", () => { it("returns null for a single null-byte input (regex no-match)", () => { - expect(parseIdentifier("\0")).toBeNull(); + assert.strictEqual(parseIdentifier("\0"), null); }); it("returns null for an empty input", () => { - expect(parseIdentifier("")).toBeNull(); + assert.strictEqual(parseIdentifier(""), null); }); }); }); diff --git a/test/importsField.test.js b/test/importsField.test.js index e38cb4e3..89ca1da3 100644 --- a/test/importsField.test.js +++ b/test/importsField.test.js @@ -1,10 +1,13 @@ "use strict"; +const assert = require("assert"); const fs = require("fs"); + const path = require("path"); const CachedInputFileSystem = require("../lib/CachedInputFileSystem"); const ResolverFactory = require("../lib/ResolverFactory"); const { processImportsField } = require("../lib/util/entrypoints"); +const { describe, it } = require("./_runner"); /** @typedef {import("../lib/util/entrypoints").ImportsField} ImportsField */ @@ -1224,19 +1227,23 @@ describe("process imports field", () => { for (const testCase of testCases) { it(testCase.name, () => { if (testCase.expect instanceof Error) { - expect(() => - processImportsField(testCase.suite[0])( - testCase.suite[1], - new Set(testCase.suite[2]), - ), - ).toThrow(testCase.expect.message); + const { message } = testCase.expect; + assert.throws( + () => + processImportsField(testCase.suite[0])( + testCase.suite[1], + new Set(testCase.suite[2]), + ), + (err) => err instanceof Error && err.message.includes(message), + ); } else { - expect( + assert.deepStrictEqual( processImportsField(testCase.suite[0])( testCase.suite[1], new Set(testCase.suite[2]), )[0], - ).toEqual(testCase.expect); + testCase.expect, + ); } }); } @@ -1252,16 +1259,16 @@ describe("importsFieldPlugin", () => { conditionNames: ["webpack"], }); - it("should resolve using imports field instead of self-referencing", (done) => { + it("should resolve using imports field instead of self-referencing", (t, done) => { resolver.resolve({}, fixture, "#imports-field", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(fixture, "b.js")); + assert.deepStrictEqual(result, path.resolve(fixture, "b.js")); done(); }); }); - it("should resolve using imports field instead of self-referencing for a subpath", (done) => { + it("should resolve using imports field instead of self-referencing for a subpath", (t, done) => { resolver.resolve( {}, path.resolve(fixture, "dir"), @@ -1270,24 +1277,25 @@ describe("importsFieldPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(fixture, "b.js")); + assert.deepStrictEqual(result, path.resolve(fixture, "b.js")); done(); }, ); }); - it("should disallow resolve out of package scope", (done) => { + it("should disallow resolve out of package scope", (t, done) => { resolver.resolve({}, fixture, "#b", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch( + assert.ok(err instanceof Error); + assert.match( + err.message, /Invalid "imports" target "\.\.\/b\.js" defined for "#b"/, ); done(); }); }); - it("field name #1", (done) => { + it("field name #1", (t, done) => { const resolver = ResolverFactory.createResolver({ extensions: [".js"], fileSystem: nodeFileSystem, @@ -1299,12 +1307,12 @@ describe("importsFieldPlugin", () => { resolver.resolve({}, fixture, "#imports-field", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(fixture, "b.js")); + assert.deepStrictEqual(result, path.resolve(fixture, "b.js")); done(); }); }); - it("field name #2", (done) => { + it("field name #2", (t, done) => { const resolver = ResolverFactory.createResolver({ extensions: [".js"], fileSystem: nodeFileSystem, @@ -1316,50 +1324,57 @@ describe("importsFieldPlugin", () => { resolver.resolve({}, fixture, "#b", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(fixture, "a.js")); + assert.deepStrictEqual(result, path.resolve(fixture, "a.js")); done(); }); }); - it("should resolve package #1", (done) => { + it("should resolve package #1", (t, done) => { resolver.resolve({}, fixture, "#a/dist/main.js", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "node_modules/a/lib/main.js"), ); done(); }); }); - it("should resolve package #2", (done) => { + it("should resolve package #2", (t, done) => { resolver.resolve({}, fixture, "#a", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch(/is not imported from package/); + assert.ok(err instanceof Error); + assert.match(err.message, /is not imported from package/); done(); }); }); - it("should resolve package #3", (done) => { + it("should resolve package #3", (t, done) => { resolver.resolve({}, fixture, "#ccc/index.js", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(fixture, "node_modules/c/index.js")); + assert.deepStrictEqual( + result, + path.resolve(fixture, "node_modules/c/index.js"), + ); done(); }); }); - it("should resolve package #4", (done) => { + it("should resolve package #4", (t, done) => { resolver.resolve({}, fixture, "#c", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(fixture, "node_modules/c/index.js")); + assert.deepStrictEqual( + result, + path.resolve(fixture, "node_modules/c/index.js"), + ); done(); }); }); - it("should resolve absolute path as an imports field target", (done) => { + it("should resolve absolute path as an imports field target", (t, done) => { const tmpdirPrefix = path.join(fixture, "node_modules/absolute-tmp-"); fs.mkdtemp(tmpdirPrefix, (err, dir) => { if (err) done(err); @@ -1375,13 +1390,13 @@ describe("importsFieldPlugin", () => { fs.rmdirSync(dir); if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(file); + assert.deepStrictEqual(result, file); done(); }); }); }); - it("should log the correct info", (done) => { + it("should log the correct info", (t, done) => { const log = []; resolver.resolve( {}, @@ -1391,34 +1406,36 @@ describe("importsFieldPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(fixture, "node_modules/a/lib/index.js"), ); - expect( + assert.deepStrictEqual( log.map((line) => line.replace(fixture, "...").replace(/\\/g, "/")), - ).toEqual([ - "resolve '#a/dist/index.js' in '...'", - " using description file: .../package.json (relative path: .)", - " resolve as internal import", - " using imports field: a/dist/index.js", - " Parsed request is a module", - " using description file: .../package.json (relative path: .)", - " resolve as module", - " looking for modules in .../node_modules", - " existing directory .../node_modules/a", - " using description file: .../node_modules/a/package.json (relative path: .)", - " using exports field: ./lib/index.js", - " using description file: .../node_modules/a/package.json (relative path: ./lib/index.js)", - " no extension", - " existing file: .../node_modules/a/lib/index.js", - " reporting result .../node_modules/a/lib/index.js", - ]); + [ + "resolve '#a/dist/index.js' in '...'", + " using description file: .../package.json (relative path: .)", + " resolve as internal import", + " using imports field: a/dist/index.js", + " Parsed request is a module", + " using description file: .../package.json (relative path: .)", + " resolve as module", + " looking for modules in .../node_modules", + " existing directory .../node_modules/a", + " using description file: .../node_modules/a/package.json (relative path: .)", + " using exports field: ./lib/index.js", + " using description file: .../node_modules/a/package.json (relative path: ./lib/index.js)", + " no extension", + " existing file: .../node_modules/a/lib/index.js", + " reporting result .../node_modules/a/lib/index.js", + ], + ); done(); }, ); }); - it("should resolve with wildcard pattern", (done) => { + it("should resolve with wildcard pattern", (t, done) => { const fixture = path.resolve( __dirname, "./fixtures/imports-exports-wildcard/node_modules/m/", @@ -1426,52 +1443,57 @@ describe("importsFieldPlugin", () => { resolver.resolve({}, fixture, "#internal/i.js", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(fixture, "./src/internal/i.js")); + assert.deepStrictEqual( + result, + path.resolve(fixture, "./src/internal/i.js"), + ); done(); }); }); - it("resolver should respect query parameters #1", (done) => { + it("resolver should respect query parameters #1", (t, done) => { resolver.resolve({}, fixture, "#a/dist/main.js?foo", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "node_modules/a/lib/main.js?foo"), ); done(); }); }); - it("resolver should respect query parameters #2. Direct matching", (done) => { + it("resolver should respect query parameters #2. Direct matching", (t, done) => { resolver.resolve({}, fixture, "#imports-field?foo", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch(/is not imported from package/); + assert.ok(err instanceof Error); + assert.match(err.message, /is not imported from package/); done(); }); }); - it("resolver should respect fragment parameters #1", (done) => { + it("resolver should respect fragment parameters #1", (t, done) => { resolver.resolve({}, fixture, "#a/dist/main.js#foo", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "node_modules/a/lib/main.js#foo"), ); done(); }); }); - it("resolver should respect fragment parameters #2. Direct matching", (done) => { + it("resolver should respect fragment parameters #2. Direct matching", (t, done) => { resolver.resolve({}, fixture, "#imports-field#foo", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch(/is not imported from package/); + assert.ok(err instanceof Error); + assert.match(err.message, /is not imported from package/); done(); }); }); - it("resolver should respect query and fragment parameters together", (done) => { + it("resolver should respect query and fragment parameters together", (t, done) => { resolver.resolve( {}, fixture, @@ -1480,7 +1502,8 @@ describe("importsFieldPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "node_modules/a/lib/main.js?foo=bar#frag"), ); done(); @@ -1488,208 +1511,216 @@ describe("importsFieldPlugin", () => { ); }); - it("should work and throw an error on invalid imports #1", (done) => { + it("should work and throw an error on invalid imports #1", (t, done) => { // Note: #/ patterns are now allowed per Node.js PR #60864 // #/dep will now try to resolve but fail because there's no mapping resolver.resolve({}, fixture, "#/dep", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch(/is not imported from package/); + assert.ok(err instanceof Error); + assert.match(err.message, /is not imported from package/); done(); }); }); - it("should work and throw an error on invalid imports #2", (done) => { + it("should work and throw an error on invalid imports #2", (t, done) => { resolver.resolve({}, fixture, "#dep/", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch( + assert.ok(err instanceof Error); + assert.match( + err.message, /Resolving to directories is not possible with the imports field \(request was #dep\/\)/, ); done(); }); }); - it("should work with invalid imports #1", (done) => { + it("should work with invalid imports #1", (t, done) => { resolver.resolve({}, fixture1, "#dep", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toBe(`${path.resolve(fixture1, "./a.js")}?foo=../`); + assert.strictEqual(result, `${path.resolve(fixture1, "./a.js")}?foo=../`); done(); }); }); - it("should work with invalid imports #2", (done) => { + it("should work with invalid imports #2", (t, done) => { resolver.resolve({}, fixture1, "#dep/foo/a.js", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toBe(`${path.resolve(fixture1, "./a.js")}?foo=../#../`); + assert.strictEqual( + result, + `${path.resolve(fixture1, "./a.js")}?foo=../#../`, + ); done(); }); }); - it("should work with invalid imports #3", (done) => { + it("should work with invalid imports #3", (t, done) => { resolver.resolve({}, fixture1, "#dep/bar", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch(/Can't resolve '#dep\/bar' in/); + assert.ok(err instanceof Error); + assert.match(err.message, /Can't resolve '#dep\/bar' in/); done(); }); }); - it("should work with invalid imports #4", (done) => { + it("should work with invalid imports #4", (t, done) => { resolver.resolve({}, fixture1, "#dep/baz", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch(/Can't resolve '#dep\/baz' in/); + assert.ok(err instanceof Error); + assert.match(err.message, /Can't resolve '#dep\/baz' in/); done(); }); }); - it("should work with invalid imports #5", (done) => { + it("should work with invalid imports #5", (t, done) => { resolver.resolve({}, fixture1, "#dep/baz-multi", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch(/Can't resolve '#dep\/baz-multi' in/); + assert.ok(err instanceof Error); + assert.match(err.message, /Can't resolve '#dep\/baz-multi' in/); done(); }); }); - it("should work with invalid imports #6", (done) => { + it("should work with invalid imports #6", (t, done) => { resolver.resolve({}, fixture1, "#dep/baz-multi", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch(/Can't resolve '#dep\/baz-multi' in/); + assert.ok(err instanceof Error); + assert.match(err.message, /Can't resolve '#dep\/baz-multi' in/); done(); }); }); - it("should work with invalid imports #7", (done) => { + it("should work with invalid imports #7", (t, done) => { resolver.resolve({}, fixture1, "#dep/pattern/a.js", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch(/Can't resolve '#dep\/pattern\/a.js' in/); + assert.ok(err instanceof Error); + assert.match(err.message, /Can't resolve '#dep\/pattern\/a.js' in/); done(); }); }); - it("should work with invalid imports #8", (done) => { + it("should work with invalid imports #8", (t, done) => { resolver.resolve({}, fixture1, "#dep/array", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(fixture1, "./a.js")); + assert.deepStrictEqual(result, path.resolve(fixture1, "./a.js")); done(); }); }); - it("should work with invalid imports #9", (done) => { + it("should work with invalid imports #9", (t, done) => { resolver.resolve({}, fixture1, "#dep/array2", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch(/Can't resolve '#dep\/array2' in/); + assert.ok(err instanceof Error); + assert.match(err.message, /Can't resolve '#dep\/array2' in/); done(); }); }); - it("should work with invalid imports #10", (done) => { + it("should work with invalid imports #10", (t, done) => { resolver.resolve({}, fixture1, "#dep/array3", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(fixture1, "./a.js")); + assert.deepStrictEqual(result, path.resolve(fixture1, "./a.js")); done(); }); }); - it("should work with invalid imports #11", (done) => { + it("should work with invalid imports #11", (t, done) => { resolver.resolve({}, fixture1, "#dep/empty", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch(/Can't resolve '#dep\/empty' in/); + assert.ok(err instanceof Error); + assert.match(err.message, /Can't resolve '#dep\/empty' in/); done(); }); }); - it("should work with invalid imports #12", (done) => { + it("should work with invalid imports #12", (t, done) => { resolver.resolve({}, fixture1, "#dep/with-bad", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(fixture1, "./a.js")); + assert.deepStrictEqual(result, path.resolve(fixture1, "./a.js")); done(); }); }); - it("should work with invalid imports #13", (done) => { + it("should work with invalid imports #13", (t, done) => { resolver.resolve({}, fixture1, "#dep/with-bad2", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(fixture1, "./a.js")); + assert.deepStrictEqual(result, path.resolve(fixture1, "./a.js")); done(); }); }); - it("should work with invalid imports #14", (done) => { + it("should work with invalid imports #14", (t, done) => { resolver.resolve({}, fixture1, "#timezones/pdt.mjs", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch(/Expecting folder to folder mapping/); + assert.ok(err instanceof Error); + assert.match(err.message, /Expecting folder to folder mapping/); done(); }); }); - it("should work with invalid imports #15", (done) => { + it("should work with invalid imports #15", (t, done) => { resolver.resolve({}, fixture1, "#dep/multi1", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch( + assert.ok(err instanceof Error); + assert.match( + err.message, /Invalid "imports" target "\.\.\/\.\.\/test\/foo" defined for "#dep\/multi1"/, ); done(); }); }); - it("should work with invalid imports #16", (done) => { + it("should work with invalid imports #16", (t, done) => { resolver.resolve({}, fixture1, "#dep/multi2", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch( + assert.ok(err instanceof Error); + assert.match( + err.message, /Invalid "imports" target "\.\.\/\.\.\/test" defined for "#dep\/multi2"/, ); done(); }); }); - it("should work with invalid imports #17", (done) => { + it("should work with invalid imports #17", (t, done) => { resolver.resolve({}, fixture1, "#dep/multi1", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch( + assert.ok(err instanceof Error); + assert.match( + err.message, /Invalid "imports" target "\.\.\/\.\.\/test\/foo" defined for "#dep\/multi1"/, ); done(); }); }); - it("should work with invalid imports #18", (done) => { + it("should work with invalid imports #18", (t, done) => { resolver.resolve({}, fixture1, "#dep/multi2", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - expect(err.message).toMatch( + assert.ok(err instanceof Error); + assert.match( + err.message, /Invalid "imports" target "\.\.\/\.\.\/test" defined for "#dep\/multi2"/, ); done(); }); }); - it("should work and resolve with array imports", (done) => { + it("should work and resolve with array imports", (t, done) => { resolver.resolve({}, fixture1, "#dep/multi", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(fixture1, "./a.js")); + assert.deepStrictEqual(result, path.resolve(fixture1, "./a.js")); done(); }); }); - it("should work and resolve an imports-field key to a real file", (done) => { + it("should work and resolve an imports-field key to a real file", (t, done) => { const resolver = ResolverFactory.createResolver({ extensions: [".js"], conditionNames: ["node"], @@ -1706,7 +1737,8 @@ describe("importsFieldPlugin", () => { {}, (err, result) => { if (err) return done(err); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join( path.join(__dirname, "fixtures"), "imports-field-error-trigger/resolved.js", @@ -1717,7 +1749,7 @@ describe("importsFieldPlugin", () => { ); }); - it("should throw errors for # requests without a description file in scope", (done) => { + it("should throw errors for # requests without a description file in scope", (t, done) => { const resolver = ResolverFactory.createResolver({ extensions: [".js"], conditionNames: ["node"], @@ -1725,7 +1757,7 @@ describe("importsFieldPlugin", () => { fileSystem: nodeFileSystem, }); resolver.resolve({}, "/tmp", "#not-in-scope", {}, (err) => { - expect(err).toBeInstanceOf(Error); + assert.ok(err instanceof Error); done(); }); }); @@ -1741,23 +1773,23 @@ describe("importsFieldPlugin", () => { "imports-field-chained", ); - it("should fail to resolve #a when it maps to #b (another import specifier)", (done) => { + it("should fail to resolve #a when it maps to #b (another import specifier)", (t, done) => { resolver.resolve({}, chainedFixture, "#a", {}, (err, result) => { if (!err) { return done( new Error(`expected error for chained imports, got ${result}`), ); } - expect(err).toBeInstanceOf(Error); + assert.ok(err instanceof Error); done(); }); }); - it("should still resolve #b to ./the.js directly", (done) => { + it("should still resolve #b to ./the.js directly", (t, done) => { resolver.resolve({}, chainedFixture, "#b", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(chainedFixture, "the.js")); + assert.deepStrictEqual(result, path.resolve(chainedFixture, "the.js")); done(); }); }); @@ -1773,7 +1805,7 @@ describe("importsFieldPlugin", () => { "imports-slash-pattern", ); - it("should resolve #/utils.js using #/* pattern", (done) => { + it("should resolve #/utils.js using #/* pattern", (t, done) => { resolver.resolve( {}, slashPatternFixture, @@ -1782,7 +1814,8 @@ describe("importsFieldPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(slashPatternFixture, "src/utils.js"), ); done(); @@ -1790,7 +1823,7 @@ describe("importsFieldPlugin", () => { ); }); - it("should resolve #/nested/deep.js using #/* pattern", (done) => { + it("should resolve #/nested/deep.js using #/* pattern", (t, done) => { resolver.resolve( {}, slashPatternFixture, @@ -1799,7 +1832,8 @@ describe("importsFieldPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(slashPatternFixture, "src/nested/deep.js"), ); done(); diff --git a/test/incorrect-description-file.test.js b/test/incorrect-description-file.test.js index a30a3b0c..c636ce00 100644 --- a/test/incorrect-description-file.test.js +++ b/test/incorrect-description-file.test.js @@ -1,8 +1,11 @@ "use strict"; +const assert = require("assert"); const fs = require("fs"); + const path = require("path"); const { CachedInputFileSystem, ResolverFactory } = require("../"); +const { describe, it } = require("./_runner"); const fixtures = path.join(__dirname, "fixtures", "incorrect-package"); const nodeFileSystem = new CachedInputFileSystem(fs, 4000); @@ -11,7 +14,7 @@ const nodeFileSystem = new CachedInputFileSystem(fs, 4000); * @param {string[]} args args * @returns {string} paths */ -function p(...args) { +function pp(...args) { return path.join(fixtures, ...args); } @@ -21,7 +24,7 @@ describe("incorrect description file", () => { fileSystem: nodeFileSystem, }); - it("should not resolve main in incorrect description file #1", (done) => { + it("should not resolve main in incorrect description file #1", (t, done) => { let called = false; const ctx = { fileDependencies: new Set(), @@ -29,16 +32,19 @@ describe("incorrect description file", () => { called = true; }, }; - resolver.resolve({}, p("pack1"), ".", ctx, (err, _result) => { + resolver.resolve({}, pp("pack1"), ".", ctx, (err, _result) => { if (!err) return done(new Error("No error")); - expect(err).toBeInstanceOf(Error); - expect(ctx.fileDependencies.has(p("pack1", "package.json"))).toBe(true); - expect(called).toBe(true); + assert.ok(err instanceof Error); + assert.strictEqual( + ctx.fileDependencies.has(pp("pack1", "package.json")), + true, + ); + assert.strictEqual(called, true); done(); }); }); - it("should not resolve main in incorrect description file #2", (done) => { + it("should not resolve main in incorrect description file #2", (t, done) => { let called = false; const ctx = { fileDependencies: new Set(), @@ -46,18 +52,21 @@ describe("incorrect description file", () => { called = true; }, }; - resolver.resolve({}, p("pack2"), ".", ctx, (err, _result) => { + resolver.resolve({}, pp("pack2"), ".", ctx, (err, _result) => { if (!err) return done(new Error("No error")); - expect(ctx.fileDependencies.has(p("pack2", "package.json"))).toBe(true); - expect(called).toBe(true); + assert.strictEqual( + ctx.fileDependencies.has(pp("pack2", "package.json")), + true, + ); + assert.strictEqual(called, true); done(); }); }); - it("should not resolve main in incorrect description file #3", (done) => { - resolver.resolve({}, p("pack2"), ".", {}, (err, _result) => { + it("should not resolve main in incorrect description file #3", (t, done) => { + resolver.resolve({}, pp("pack2"), ".", {}, (err, _result) => { if (!err) return done(new Error("No error")); - expect(err).toBeInstanceOf(Error); + assert.ok(err instanceof Error); done(); }); }); diff --git a/test/log-info.test.js b/test/log-info.test.js index 567d19ca..acd189b1 100644 --- a/test/log-info.test.js +++ b/test/log-info.test.js @@ -1,15 +1,18 @@ "use strict"; +const assert = require("assert"); const fs = require("fs"); + const path = require("path"); const { CachedInputFileSystem, ResolverFactory } = require("../"); const LogInfoPlugin = require("../lib/LogInfoPlugin"); +const { describe, it } = require("./_runner"); const fixtures = path.join(__dirname, "fixtures"); const nodeFileSystem = new CachedInputFileSystem(fs, 4000); describe("LogInfoPlugin", () => { - it("logs resolution steps when a log function is provided", (done) => { + it("logs resolution steps when a log function is provided", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem: nodeFileSystem, extensions: [".js"], @@ -24,14 +27,17 @@ describe("LogInfoPlugin", () => { { log: (m) => log.push(m) }, (err) => { if (err) return done(err); - expect(log.length).toBeGreaterThan(0); - expect(log.some((l) => l.includes("[resolve]"))).toBe(true); + assert.ok(log.length > 0); + assert.strictEqual( + log.some((l) => l.includes("[resolve]")), + true, + ); done(); }, ); }); - it("logs query and fragment when present in the request", (done) => { + it("logs query and fragment when present in the request", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem: nodeFileSystem, extensions: [".js"], @@ -46,18 +52,20 @@ describe("LogInfoPlugin", () => { { log: (m) => log.push(m) }, (err) => { if (err) return done(err); - expect( + assert.strictEqual( log.some((l) => l.includes("Resolving request query: ?query")), - ).toBe(true); - expect( + true, + ); + assert.strictEqual( log.some((l) => l.includes("Resolving request fragment: #frag")), - ).toBe(true); + true, + ); done(); }, ); }); - it("logs a module request marker when resolving a module request", (done) => { + it("logs a module request marker when resolving a module request", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem: nodeFileSystem, plugins: [new LogInfoPlugin("normal-resolve")], @@ -71,23 +79,26 @@ describe("LogInfoPlugin", () => { { log: (m) => log.push(m) }, (err) => { if (err) return done(err); - expect( + assert.strictEqual( log.some((l) => l.includes("Request is an module request.")), - ).toBe(true); - expect(log.some((l) => l.includes("Has description data from"))).toBe( true, ); - expect( + assert.strictEqual( + log.some((l) => l.includes("Has description data from")), + true, + ); + assert.strictEqual( log.some((l) => l.includes("Relative path from description file is:"), ), - ).toBe(true); + true, + ); done(); }, ); }); - it("logs a directory marker when resolving a directory request", (done) => { + it("logs a directory marker when resolving a directory request", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem: nodeFileSystem, plugins: [new LogInfoPlugin("normal-resolve")], @@ -101,15 +112,16 @@ describe("LogInfoPlugin", () => { { log: (m) => log.push(m) }, (err) => { if (err) return done(err); - expect( + assert.strictEqual( log.some((l) => l.includes("Request is a directory request.")), - ).toBe(true); + true, + ); done(); }, ); }); - it("does not log when no log function is provided", (done) => { + it("does not log when no log function is provided", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem: nodeFileSystem, extensions: [".js"], @@ -119,7 +131,7 @@ describe("LogInfoPlugin", () => { // This resolve should succeed without errors even though no log is provided. resolver.resolve({}, fixtures, "./a.js", {}, (err, result) => { if (err) return done(err); - expect(result).toBeTruthy(); + assert.ok(result); done(); }); }); diff --git a/test/main-fields.test.js b/test/main-fields.test.js index f3404b7d..d5c2bac4 100644 --- a/test/main-fields.test.js +++ b/test/main-fields.test.js @@ -1,7 +1,9 @@ "use strict"; +const assert = require("assert"); const fs = require("fs"); const { CachedInputFileSystem, ResolverFactory } = require("../"); +const { describe, it } = require("./_runner"); const nodeFileSystem = new CachedInputFileSystem(fs, 4000); @@ -11,7 +13,7 @@ describe("mainFields normalization", () => { fileSystem: nodeFileSystem, mainFields: ["main"], }); - expect(r.options.mainFields).toEqual([ + assert.deepStrictEqual(r.options.mainFields, [ { name: ["main"], forceRelative: true }, ]); }); @@ -21,7 +23,7 @@ describe("mainFields normalization", () => { fileSystem: nodeFileSystem, mainFields: [["browser", "main"]], }); - expect(r.options.mainFields).toEqual([ + assert.deepStrictEqual(r.options.mainFields, [ { name: ["browser", "main"], forceRelative: true }, ]); }); @@ -31,7 +33,7 @@ describe("mainFields normalization", () => { fileSystem: nodeFileSystem, mainFields: [{ name: "main", forceRelative: false }], }); - expect(r.options.mainFields).toEqual([ + assert.deepStrictEqual(r.options.mainFields, [ { name: ["main"], forceRelative: false }, ]); }); @@ -41,7 +43,7 @@ describe("mainFields normalization", () => { fileSystem: nodeFileSystem, mainFields: [{ name: ["a", "b"], forceRelative: true }], }); - expect(r.options.mainFields).toEqual([ + assert.deepStrictEqual(r.options.mainFields, [ { name: ["a", "b"], forceRelative: true }, ]); }); diff --git a/test/missing.test.js b/test/missing.test.js index d185ea5a..d7153a77 100644 --- a/test/missing.test.js +++ b/test/missing.test.js @@ -1,7 +1,10 @@ "use strict"; +const assert = require("assert"); + const path = require("path"); const resolve = require("../"); +const { describe, it } = require("./_runner"); describe("missing", () => { /** @@ -72,22 +75,23 @@ describe("missing", () => { ], ]; for (const testCase of testCases) { - it(`should tell about missing file when trying to resolve ${testCase[1]}`, (done) => { + it(`should tell about missing file when trying to resolve ${testCase[1]}`, (t, done) => { const missingDependencies = new Set(); /** * @param {Error | null} _err err * @param {string} _filename _filename */ function callback(_err, _filename) { - expect([...missingDependencies].sort()).toEqual( - expect.arrayContaining(testCase[2].sort()), - ); + const actual = [...missingDependencies].sort(); + for (const dep of testCase[2]) { + assert.ok(actual.includes(dep)); + } done(); } resolve(testCase[0], testCase[1], { missingDependencies }, callback); }); - it(`should report error details exactly once when trying to resolve ${testCase[1]}`, (done) => { + it(`should report error details exactly once when trying to resolve ${testCase[1]}`, (t, done) => { /** * @param {Error & { details: string } | null} err err * @param {string} _filename _filename @@ -97,8 +101,9 @@ describe("missing", () => { const details = err.details.split("\n"); const firstDetail = details.shift(); - expect(firstDetail).toContain(testCase[1]); - expect(details).not.toContain(firstDetail); + assert.ok(firstDetail !== undefined); + assert.ok(firstDetail.includes(testCase[1])); + assert.ok(!details.includes(firstDetail)); } done(); diff --git a/test/path-browser.test.js b/test/path-browser.test.js index 4172c248..76a25130 100644 --- a/test/path-browser.test.js +++ b/test/path-browser.test.js @@ -1,7 +1,10 @@ "use strict"; +const assert = require("assert"); + const nodePath = require("path"); const pathBrowser = require("../lib/util/path-browser"); +const { describe, it } = require("./_runner"); // The browser shim must behave exactly like Node's `path` for the subset the // resolver relies on. Parity is asserted directly against Node's real module. @@ -88,7 +91,8 @@ describe("path-browser shim", () => { describe("posix.normalize", () => { for (const input of posixCases) { it(`matches Node for ${JSON.stringify(input)}`, () => { - expect(pathBrowser.posix.normalize(input)).toBe( + assert.strictEqual( + pathBrowser.posix.normalize(input), nodePath.posix.normalize(input), ); }); @@ -98,7 +102,8 @@ describe("path-browser shim", () => { describe("win32.normalize", () => { for (const input of win32Cases) { it(`matches Node for ${JSON.stringify(input)}`, () => { - expect(pathBrowser.win32.normalize(input)).toBe( + assert.strictEqual( + pathBrowser.win32.normalize(input), nodePath.win32.normalize(input), ); }); @@ -108,7 +113,7 @@ describe("path-browser shim", () => { describe("win32.normalize device paths and colon guard (pinned to Node 22)", () => { for (const [input, expected] of win32Pinned) { it(`normalizes ${JSON.stringify(input)}`, () => { - expect(pathBrowser.win32.normalize(input)).toBe(expected); + assert.strictEqual(pathBrowser.win32.normalize(input), expected); }); } }); @@ -116,7 +121,8 @@ describe("path-browser shim", () => { describe("posix.dirname", () => { for (const input of posixCases) { it(`matches Node for ${JSON.stringify(input)}`, () => { - expect(pathBrowser.posix.dirname(input)).toBe( + assert.strictEqual( + pathBrowser.posix.dirname(input), nodePath.posix.dirname(input), ); }); @@ -126,7 +132,8 @@ describe("path-browser shim", () => { describe("win32.dirname", () => { for (const input of win32Cases) { it(`matches Node for ${JSON.stringify(input)}`, () => { - expect(pathBrowser.win32.dirname(input)).toBe( + assert.strictEqual( + pathBrowser.win32.dirname(input), nodePath.win32.dirname(input), ); }); @@ -148,7 +155,8 @@ describe("path-browser shim", () => { ]; for (const [input, suffix] of cases) { it(`matches Node for ${JSON.stringify(input)} / ${JSON.stringify(suffix)}`, () => { - expect(pathBrowser.basename(input, suffix)).toBe( + assert.strictEqual( + pathBrowser.basename(input, suffix), nodePath.posix.basename(input, suffix), ); }); @@ -161,7 +169,10 @@ describe("path-browser shim", () => { // shim's own output so any unintended change is caught. describe("win32.normalize reserved device name (documented divergence)", () => { it("does not special-case \\\\.\\COM1:", () => { - expect(pathBrowser.win32.normalize("\\\\.\\COM1:")).toBe("\\\\.\\COM1:"); + assert.strictEqual( + pathBrowser.win32.normalize("\\\\.\\COM1:"), + "\\\\.\\COM1:", + ); }); }); }); diff --git a/test/path.test.js b/test/path.test.js index 9bcab677..20ae64f8 100644 --- a/test/path.test.js +++ b/test/path.test.js @@ -1,5 +1,6 @@ "use strict"; +const assert = require("assert"); const { PathType, createCachedBasename, @@ -14,103 +15,108 @@ const { join, normalize, } = require("../lib/util/path"); +const { describe, it } = require("./_runner"); describe("util/path getType", () => { it("returns Empty for the empty string", () => { - expect(getType("")).toBe(PathType.Empty); + assert.strictEqual(getType(""), PathType.Empty); }); it("classifies single-character inputs", () => { - expect(getType(".")).toBe(PathType.Relative); - expect(getType("/")).toBe(PathType.AbsolutePosix); - expect(getType("#")).toBe(PathType.Internal); - expect(getType("a")).toBe(PathType.Normal); + assert.strictEqual(getType("."), PathType.Relative); + assert.strictEqual(getType("/"), PathType.AbsolutePosix); + assert.strictEqual(getType("#"), PathType.Internal); + assert.strictEqual(getType("a"), PathType.Normal); }); it("classifies two-character inputs", () => { - expect(getType("..")).toBe(PathType.Relative); - expect(getType("./")).toBe(PathType.Relative); - expect(getType(".x")).toBe(PathType.Normal); - expect(getType("/a")).toBe(PathType.AbsolutePosix); - expect(getType("#a")).toBe(PathType.Internal); - expect(getType("C:")).toBe(PathType.AbsoluteWin); - expect(getType("c:")).toBe(PathType.AbsoluteWin); - expect(getType("ab")).toBe(PathType.Normal); - expect(getType("1:")).toBe(PathType.Normal); + assert.strictEqual(getType(".."), PathType.Relative); + assert.strictEqual(getType("./"), PathType.Relative); + assert.strictEqual(getType(".x"), PathType.Normal); + assert.strictEqual(getType("/a"), PathType.AbsolutePosix); + assert.strictEqual(getType("#a"), PathType.Internal); + assert.strictEqual(getType("C:"), PathType.AbsoluteWin); + assert.strictEqual(getType("c:"), PathType.AbsoluteWin); + assert.strictEqual(getType("ab"), PathType.Normal); + assert.strictEqual(getType("1:"), PathType.Normal); }); it("classifies longer inputs", () => { - expect(getType("./a")).toBe(PathType.Relative); - expect(getType("../a")).toBe(PathType.Relative); - expect(getType(".a")).toBe(PathType.Normal); - expect(getType("..a")).toBe(PathType.Normal); - expect(getType(".a/")).toBe(PathType.Normal); - expect(getType("/abc")).toBe(PathType.AbsolutePosix); - expect(getType("#foo")).toBe(PathType.Internal); - expect(getType("C:\\foo")).toBe(PathType.AbsoluteWin); - expect(getType("c:/foo")).toBe(PathType.AbsoluteWin); - expect(getType("foo")).toBe(PathType.Normal); - expect(getType("9:/foo")).toBe(PathType.Normal); - expect(getType("C:foo")).toBe(PathType.Normal); + assert.strictEqual(getType("./a"), PathType.Relative); + assert.strictEqual(getType("../a"), PathType.Relative); + assert.strictEqual(getType(".a"), PathType.Normal); + assert.strictEqual(getType("..a"), PathType.Normal); + assert.strictEqual(getType(".a/"), PathType.Normal); + assert.strictEqual(getType("/abc"), PathType.AbsolutePosix); + assert.strictEqual(getType("#foo"), PathType.Internal); + assert.strictEqual(getType("C:\\foo"), PathType.AbsoluteWin); + assert.strictEqual(getType("c:/foo"), PathType.AbsoluteWin); + assert.strictEqual(getType("foo"), PathType.Normal); + assert.strictEqual(getType("9:/foo"), PathType.Normal); + assert.strictEqual(getType("C:foo"), PathType.Normal); }); it("classifies DOS device paths as Windows-absolute", () => { // Win32 file namespace (\\?\) - expect(getType("\\\\?\\C:\\foo")).toBe(PathType.AbsoluteWin); - expect(getType("\\\\?\\C:\\foo\\bar")).toBe(PathType.AbsoluteWin); - expect(getType("\\\\?\\UNC\\server\\share")).toBe(PathType.AbsoluteWin); - expect(getType("\\\\?\\Volume{abc}\\f")).toBe(PathType.AbsoluteWin); + assert.strictEqual(getType("\\\\?\\C:\\foo"), PathType.AbsoluteWin); + assert.strictEqual(getType("\\\\?\\C:\\foo\\bar"), PathType.AbsoluteWin); + assert.strictEqual( + getType("\\\\?\\UNC\\server\\share"), + PathType.AbsoluteWin, + ); + assert.strictEqual(getType("\\\\?\\Volume{abc}\\f"), PathType.AbsoluteWin); // Win32 device namespace (\\.\) - expect(getType("\\\\.\\C:\\foo")).toBe(PathType.AbsoluteWin); - expect(getType("\\\\.\\PhysicalDrive0")).toBe(PathType.AbsoluteWin); + assert.strictEqual(getType("\\\\.\\C:\\foo"), PathType.AbsoluteWin); + assert.strictEqual(getType("\\\\.\\PhysicalDrive0"), PathType.AbsoluteWin); // Bare prefix still counts — the filesystem will reject it, but // classifying it as Windows-absolute keeps downstream calls on // `path.win32` instead of silently falling back to posix. - expect(getType("\\\\?\\")).toBe(PathType.AbsoluteWin); - expect(getType("\\\\.\\")).toBe(PathType.AbsoluteWin); + assert.strictEqual(getType("\\\\?\\"), PathType.AbsoluteWin); + assert.strictEqual(getType("\\\\.\\"), PathType.AbsoluteWin); }); it("does not classify non-DOS backslash paths as Windows-absolute", () => { // Plain UNC (\\server\share) is not a DOS device path — don't // misclassify it (its handling is out of scope of this change). - expect(getType("\\\\server\\share")).toBe(PathType.Normal); + assert.strictEqual(getType("\\\\server\\share"), PathType.Normal); // Too short to match a DOS device prefix. - expect(getType("\\\\?")).toBe(PathType.Normal); - expect(getType("\\\\.")).toBe(PathType.Normal); + assert.strictEqual(getType("\\\\?"), PathType.Normal); + assert.strictEqual(getType("\\\\."), PathType.Normal); // Second char must also be a backslash. - expect(getType("\\?\\C:\\foo")).toBe(PathType.Normal); + assert.strictEqual(getType("\\?\\C:\\foo"), PathType.Normal); // Forward-slash variants aren't equivalent — Windows won't normalize // a DOS device path expressed with `/`. - expect(getType("//?/C:/foo")).toBe(PathType.AbsolutePosix); + assert.strictEqual(getType("//?/C:/foo"), PathType.AbsolutePosix); }); }); describe("util/path normalize", () => { it("returns the input when empty", () => { - expect(normalize("")).toBe(""); + assert.strictEqual(normalize(""), ""); }); it("normalizes Windows absolute paths", () => { - expect(normalize("C:\\foo\\..\\bar")).toBe("C:\\bar"); + assert.strictEqual(normalize("C:\\foo\\..\\bar"), "C:\\bar"); }); it("keeps relative paths relative", () => { - expect(normalize("./a/b")).toBe("./a/b"); - expect(normalize("./a/../b")).toBe("./b"); + assert.strictEqual(normalize("./a/b"), "./a/b"); + assert.strictEqual(normalize("./a/../b"), "./b"); }); it("normalizes posix absolute paths", () => { - expect(normalize("/a/b/../c")).toBe("/a/c"); + assert.strictEqual(normalize("/a/b/../c"), "/a/c"); }); it("normalizes normal paths through posix normalize", () => { - expect(normalize("a/b/../c")).toBe("a/c"); + assert.strictEqual(normalize("a/b/../c"), "a/c"); }); it("normalizes DOS device paths via win32", () => { - expect(normalize("\\\\?\\C:\\foo\\..\\bar")).toBe("\\\\?\\C:\\bar"); - expect(normalize("\\\\.\\C:\\foo\\..\\bar")).toBe("\\\\.\\C:\\bar"); - expect(normalize("\\\\?\\UNC\\server\\share\\a\\..\\b")).toBe( + assert.strictEqual(normalize("\\\\?\\C:\\foo\\..\\bar"), "\\\\?\\C:\\bar"); + assert.strictEqual(normalize("\\\\.\\C:\\foo\\..\\bar"), "\\\\.\\C:\\bar"); + assert.strictEqual( + normalize("\\\\?\\UNC\\server\\share\\a\\..\\b"), "\\\\?\\UNC\\server\\share\\b", ); }); @@ -118,50 +124,51 @@ describe("util/path normalize", () => { describe("util/path join", () => { it("returns normalized rootPath when no request is given", () => { - expect(join("/a/b", "")).toBe("/a/b"); - expect(join("/a/b", undefined)).toBe("/a/b"); + assert.strictEqual(join("/a/b", ""), "/a/b"); + assert.strictEqual(join("/a/b", undefined), "/a/b"); }); it("uses an absolute posix request as-is", () => { - expect(join("/a/b", "/c/d")).toBe("/c/d"); + assert.strictEqual(join("/a/b", "/c/d"), "/c/d"); }); it("uses an absolute windows request as-is", () => { - expect(join("/a/b", "C:\\c\\d")).toBe("C:\\c\\d"); + assert.strictEqual(join("/a/b", "C:\\c\\d"), "C:\\c\\d"); }); it("joins rooted posix-style paths", () => { - expect(join("/a/b", "./c")).toBe("/a/b/c"); - expect(join("a/b", "c")).toBe("a/b/c"); - expect(join("./a", "b")).toBe("a/b"); + assert.strictEqual(join("/a/b", "./c"), "/a/b/c"); + assert.strictEqual(join("a/b", "c"), "a/b/c"); + assert.strictEqual(join("./a", "b"), "a/b"); }); it("joins rooted windows-style paths", () => { - expect(join("C:\\a", "b")).toBe("C:\\a\\b"); + assert.strictEqual(join("C:\\a", "b"), "C:\\a\\b"); }); it("joins DOS device paths with win32 semantics", () => { - expect(join("\\\\?\\C:\\a", "b")).toBe("\\\\?\\C:\\a\\b"); - expect(join("\\\\.\\C:\\a", "b")).toBe("\\\\.\\C:\\a\\b"); + assert.strictEqual(join("\\\\?\\C:\\a", "b"), "\\\\?\\C:\\a\\b"); + assert.strictEqual(join("\\\\.\\C:\\a", "b"), "\\\\.\\C:\\a\\b"); // Absolute DOS device request wins over any root. - expect(join("/posix/root", "\\\\?\\C:\\c")).toBe("\\\\?\\C:\\c"); + assert.strictEqual(join("/posix/root", "\\\\?\\C:\\c"), "\\\\?\\C:\\c"); }); }); describe("util/path dirname", () => { it("computes posix dirname for posix paths", () => { - expect(dirname("/a/b/c")).toBe("/a/b"); - expect(dirname("a/b")).toBe("a"); + assert.strictEqual(dirname("/a/b/c"), "/a/b"); + assert.strictEqual(dirname("a/b"), "a"); }); it("computes windows dirname for windows absolute paths", () => { - expect(dirname("C:\\foo\\bar")).toBe("C:\\foo"); + assert.strictEqual(dirname("C:\\foo\\bar"), "C:\\foo"); }); it("computes windows dirname for DOS device paths", () => { - expect(dirname("\\\\?\\C:\\foo\\bar")).toBe("\\\\?\\C:\\foo"); - expect(dirname("\\\\.\\C:\\foo\\bar")).toBe("\\\\.\\C:\\foo"); - expect(dirname("\\\\?\\UNC\\server\\share\\a\\b")).toBe( + assert.strictEqual(dirname("\\\\?\\C:\\foo\\bar"), "\\\\?\\C:\\foo"); + assert.strictEqual(dirname("\\\\.\\C:\\foo\\bar"), "\\\\.\\C:\\foo"); + assert.strictEqual( + dirname("\\\\?\\UNC\\server\\share\\a\\b"), "\\\\?\\UNC\\server\\share\\a", ); }); @@ -172,8 +179,8 @@ describe("util/path cachedJoin", () => { const cachedJoin = createCachedJoin().fn; const a = cachedJoin("/root", "a/b"); const b = cachedJoin("/root", "a/b"); - expect(a).toBe(b); - expect(a).toBe("/root/a/b"); + assert.strictEqual(a, b); + assert.strictEqual(a, "/root/a/b"); }); it("keeps separate caches per root", () => { @@ -181,8 +188,8 @@ describe("util/path cachedJoin", () => { const a = cachedJoin("/x", "req"); const b = cachedJoin("/y", "req"); const a2 = cachedJoin("/x", "req"); - expect(a).toBe(a2); - expect(a).not.toBe(b); + assert.strictEqual(a, a2); + assert.notStrictEqual(a, b); }); }); @@ -191,8 +198,8 @@ describe("util/path cachedDirname", () => { const cachedDirname = createCachedDirname().fn; const a = cachedDirname("/cached/a/b"); const b = cachedDirname("/cached/a/b"); - expect(a).toBe(b); - expect(a).toBe("/cached/a"); + assert.strictEqual(a, b); + assert.strictEqual(a, "/cached/a"); }); }); @@ -201,16 +208,16 @@ describe("util/path cachedBasename", () => { const cachedBasename = createCachedBasename().fn; const a = cachedBasename("/cached/a/b"); const b = cachedBasename("/cached/a/b"); - expect(a).toBe(b); - expect(a).toBe("b"); + assert.strictEqual(a, b); + assert.strictEqual(a, "b"); }); it("returns the same value on cache hit with suffix", () => { const cachedBasename = createCachedBasename().fn; const a = cachedBasename("/cached/a/b.ext", ".ext"); const b = cachedBasename("/cached/a/b.ext", ".ext"); - expect(a).toBe(b); - expect(a).toBe("b"); + assert.strictEqual(a, b); + assert.strictEqual(a, "b"); }); it("keeps separate caches per root", () => { @@ -218,8 +225,8 @@ describe("util/path cachedBasename", () => { const a = cachedBasename("/x"); const b = cachedBasename("/y"); const a2 = cachedBasename("/x"); - expect(a).toBe(a2); - expect(a).not.toBe(b); + assert.strictEqual(a, a2); + assert.notStrictEqual(a, b); }); it("keeps separate caches per root with suffix", () => { @@ -227,8 +234,8 @@ describe("util/path cachedBasename", () => { const a = cachedBasename("/x.ext", ".ext"); const b = cachedBasename("/y.ext", ".ext"); const a2 = cachedBasename("/x.ext", ".ext"); - expect(a).toBe(a2); - expect(a).not.toBe(b); + assert.strictEqual(a, a2); + assert.notStrictEqual(a, b); }); }); @@ -236,95 +243,95 @@ describe("util/path isRelativeRequest", () => { // Must match the legacy /^\.\.?(?:\/|$)/ regex exactly, since the helper // replaced it in several hot paths. Verify each branch individually. it("returns true for exactly '.'", () => { - expect(isRelativeRequest(".")).toBe(true); + assert.strictEqual(isRelativeRequest("."), true); }); it("returns true for exactly '..'", () => { - expect(isRelativeRequest("..")).toBe(true); + assert.strictEqual(isRelativeRequest(".."), true); }); it("returns true for './' and './foo/bar'", () => { - expect(isRelativeRequest("./")).toBe(true); - expect(isRelativeRequest("./foo")).toBe(true); - expect(isRelativeRequest("./foo/bar")).toBe(true); + assert.strictEqual(isRelativeRequest("./"), true); + assert.strictEqual(isRelativeRequest("./foo"), true); + assert.strictEqual(isRelativeRequest("./foo/bar"), true); }); it("returns true for '../' and '../foo'", () => { - expect(isRelativeRequest("../")).toBe(true); - expect(isRelativeRequest("../foo")).toBe(true); + assert.strictEqual(isRelativeRequest("../"), true); + assert.strictEqual(isRelativeRequest("../foo"), true); }); it("returns false for bare specifiers and absolute paths", () => { - expect(isRelativeRequest("")).toBe(false); - expect(isRelativeRequest("foo")).toBe(false); - expect(isRelativeRequest("/abs")).toBe(false); - expect(isRelativeRequest("#imports")).toBe(false); - expect(isRelativeRequest("C:\\win")).toBe(false); + assert.strictEqual(isRelativeRequest(""), false); + assert.strictEqual(isRelativeRequest("foo"), false); + assert.strictEqual(isRelativeRequest("/abs"), false); + assert.strictEqual(isRelativeRequest("#imports"), false); + assert.strictEqual(isRelativeRequest("C:\\win"), false); }); it("returns false for dotted names that are not relative requests", () => { // ".foo" is a normal specifier (hidden-file-style), not a relative request. - expect(isRelativeRequest(".foo")).toBe(false); + assert.strictEqual(isRelativeRequest(".foo"), false); // "..foo" likewise — only "..", "../..." are relative. - expect(isRelativeRequest("..foo")).toBe(false); + assert.strictEqual(isRelativeRequest("..foo"), false); }); }); describe("util/path isSubPath", () => { it("returns true for a child under parent", () => { - expect(isSubPath("/a/b", "/a/b/c")).toBe(true); + assert.strictEqual(isSubPath("/a/b", "/a/b/c"), true); }); it("returns false for a sibling that starts with the parent name", () => { - expect(isSubPath("/app", "/app-other/file")).toBe(false); + assert.strictEqual(isSubPath("/app", "/app-other/file"), false); }); it("handles parents that already end with a slash", () => { - expect(isSubPath("/a/b/", "/a/b/c")).toBe(true); + assert.strictEqual(isSubPath("/a/b/", "/a/b/c"), true); }); it("handles parents that already end with a backslash", () => { - expect(isSubPath("C:\\a\\b\\", "C:\\a\\b\\c")).toBe(true); + assert.strictEqual(isSubPath("C:\\a\\b\\", "C:\\a\\b\\c"), true); }); it("handles Windows-style children when the parent is not separator-terminated", () => { - expect(isSubPath("C:\\a", "C:\\a\\b")).toBe(true); + assert.strictEqual(isSubPath("C:\\a", "C:\\a\\b"), true); }); it("returns false when child and parent are equal (without trailing separator)", () => { // A path is not a subpath of itself — there has to be a separator // after the parent prefix. - expect(isSubPath("/a/b", "/a/b")).toBe(false); + assert.strictEqual(isSubPath("/a/b", "/a/b"), false); }); it("returns true when child equals a parent that already ends with a separator", () => { // `/a/b/` IS considered a "prefix" of `/a/b/` — startsWith is true // and the old implementation agreed. Lock it in so later refactors // don't silently regress. - expect(isSubPath("/a/b/", "/a/b/")).toBe(true); + assert.strictEqual(isSubPath("/a/b/", "/a/b/"), true); }); it("returns false when parent is longer than child", () => { - expect(isSubPath("/a/b/c", "/a/b")).toBe(false); + assert.strictEqual(isSubPath("/a/b/c", "/a/b"), false); }); it("returns true for an empty parent only when the child starts with a separator", () => { // Matches the old `normalize("" + "/") === "/"` fallback semantics. - expect(isSubPath("", "/a/b")).toBe(true); - expect(isSubPath("", "C:\\a")).toBe(false); - expect(isSubPath("", "foo")).toBe(false); - expect(isSubPath("", "")).toBe(false); + assert.strictEqual(isSubPath("", "/a/b"), true); + assert.strictEqual(isSubPath("", "C:\\a"), false); + assert.strictEqual(isSubPath("", "foo"), false); + assert.strictEqual(isSubPath("", ""), false); }); }); describe("util/path exported regexes", () => { it("deprecatedInvalidSegmentRegEx matches .. segments", () => { - expect(deprecatedInvalidSegmentRegEx.test("/foo/../bar")).toBe(true); + assert.strictEqual(deprecatedInvalidSegmentRegEx.test("/foo/../bar"), true); }); it("invalidSegmentRegEx matches node_modules segments", () => { - expect(invalidSegmentRegEx.test("/foo/node_modules/bar")).toBe(true); - expect(invalidSegmentRegEx.test("/foo/../bar")).toBe(true); + assert.strictEqual(invalidSegmentRegEx.test("/foo/node_modules/bar"), true); + assert.strictEqual(invalidSegmentRegEx.test("/foo/../bar"), true); }); }); @@ -332,23 +339,23 @@ describe("util/path join fallbacks for special rootPath types", () => { it("falls back when rootPath is Empty and request is Relative", () => { // rootPath empty → falls into the last switch. Relative request returns // posixNormalize("") === "." which is itself relative, returned as-is. - expect(join("", "./foo")).toBe("."); + assert.strictEqual(join("", "./foo"), "."); }); it("falls back when rootPath is Empty and request is a Normal name", () => { // Normal request: falls through to posixNormalize(rootPath) === "." - expect(join("", "foo")).toBe("."); + assert.strictEqual(join("", "foo"), "."); }); it("falls back when rootPath is Internal (#...) and request is Normal", () => { // rootPath "#x" (Internal) and request "foo" (Normal): falls through to // posixNormalize(rootPath). - expect(join("#x", "foo")).toBe("#x"); + assert.strictEqual(join("#x", "foo"), "#x"); }); it("falls back when rootPath is Internal (#...) and request is Relative", () => { // rootPath "#x" (Internal) and request "./foo" (Relative): returns // posixNormalize(rootPath) ("#x"), not relative, so prefixed with "./". - expect(join("#x", "./foo")).toBe("./#x"); + assert.strictEqual(join("#x", "./foo"), "./#x"); }); }); diff --git a/test/plugins.test.js b/test/plugins.test.js index 93284362..6815cb65 100644 --- a/test/plugins.test.js +++ b/test/plugins.test.js @@ -1,15 +1,18 @@ "use strict"; +const assert = require("assert"); const fs = require("fs"); + const path = require("path"); const { CachedInputFileSystem, CloneBasenamePlugin, ResolverFactory, } = require("../"); +const { describe, it } = require("./_runner"); describe("plugins", () => { - it("should resolve with the CloneBasenamePlugin", (done) => { + it("should resolve with the CloneBasenamePlugin", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem: require("fs"), plugins: [ @@ -28,7 +31,8 @@ describe("plugins", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve( __dirname, "fixtures/directory-default/directory-default.js", @@ -39,7 +43,7 @@ describe("plugins", () => { ); }); - it("should ignore 'false'/'null'/'undefined' plugins", (done) => { + it("should ignore 'false'/'null'/'undefined' plugins", (t, done) => { const FailedPlugin = class { apply() { throw new Error("FailedPlugin"); @@ -70,7 +74,8 @@ describe("plugins", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve( __dirname, "fixtures/directory-default/directory-default.js", @@ -92,6 +97,6 @@ describe("plugins", () => { }, ], }); - expect(seenResolver).toBe(r); + assert.strictEqual(seenResolver, r); }); }); diff --git a/test/pnp.test.js b/test/pnp.test.js index f43e0e6d..fd1191db 100644 --- a/test/pnp.test.js +++ b/test/pnp.test.js @@ -1,8 +1,11 @@ "use strict"; +const assert = require("assert"); const fs = require("fs"); + const path = require("path"); const { CachedInputFileSystem, ResolverFactory } = require("../"); +const { after, before, beforeEach, describe, it } = require("./_runner"); const nodeFileSystem = new CachedInputFileSystem(fs, 4000); const fixture = path.resolve(__dirname, "fixtures", "pnp"); @@ -28,7 +31,7 @@ describe("pnp", () => { let resolver; if (isAdmin) { - beforeAll(() => { + before(() => { fs.symlinkSync("dir", path.resolve(fixture, "pkg/symlink"), "dir"); }); } @@ -79,29 +82,29 @@ describe("pnp", () => { }); if (isAdmin) { - afterAll(() => { + after(() => { fs.unlinkSync(path.resolve(fixture, "pkg/symlink")); }); } - it("should resolve by going through the pnp api", (done) => { + it("should resolve by going through the pnp api", (t, done) => { pnpApi.mocks.set("pkg", path.resolve(fixture, "pkg")); resolver.resolve({}, __dirname, "pkg/dir/index.js", {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.resolve(fixture, "pkg/dir/index.js")); + assert.deepStrictEqual(result, path.resolve(fixture, "pkg/dir/index.js")); done(); }); }); - it("should not resolve a not fully specified request when fullySpecified is set", (done) => { + it("should not resolve a not fully specified request when fullySpecified is set", (t, done) => { pnpApi.mocks.set("pkg", path.resolve(fixture, "pkg")); resolver.resolve({}, __dirname, "pkg/dir/index", {}, (err, _result) => { - expect(err).toBeInstanceOf(Error); + assert.ok(err instanceof Error); done(); }); }); - it("should track dependency to the pnp api", (done) => { + it("should track dependency to the pnp api", (t, done) => { pnpApi.mocks.set("pkg", path.resolve(fixture, "pkg")); pnpApi.mocks.set("pnpapi", path.resolve(fixture, ".pnp.js")); const fileDependencies = new Set(); @@ -112,29 +115,32 @@ describe("pnp", () => { { fileDependencies }, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.resolve(fixture, "pkg/dir/index.js")); - expect([...fileDependencies]).toContainEqual( - path.resolve(fixture, ".pnp.js"), + assert.deepStrictEqual( + result, + path.resolve(fixture, "pkg/dir/index.js"), + ); + assert.ok( + [...fileDependencies].includes(path.resolve(fixture, ".pnp.js")), ); done(); }, ); }); - it("should resolve module names with package.json", (done) => { + it("should resolve module names with package.json", (t, done) => { pnpApi.mocks.set("pkg", path.resolve(fixture, "pkg")); resolver.resolve({}, __dirname, "pkg", {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.resolve(fixture, "pkg/main.js")); + assert.deepStrictEqual(result, path.resolve(fixture, "pkg/main.js")); done(); }); }); - it("should resolve namespaced module names", (done) => { + it("should resolve namespaced module names", (t, done) => { pnpApi.mocks.set("@user/pkg", path.resolve(fixture, "pkg")); resolver.resolve({}, __dirname, "@user/pkg", {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.resolve(fixture, "pkg/main.js")); + assert.deepStrictEqual(result, path.resolve(fixture, "pkg/main.js")); done(); }); }); @@ -142,7 +148,7 @@ describe("pnp", () => { it( "should not resolve symlinks", isAdmin - ? (done) => { + ? (t, done) => { pnpApi.mocks.set("pkg", path.resolve(fixture, "pkg")); resolverFuzzy.resolve( {}, @@ -151,7 +157,8 @@ describe("pnp", () => { {}, (err, result) => { if (err) return done(err); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "pkg/symlink/index.js"), ); done(); @@ -161,7 +168,7 @@ describe("pnp", () => { : undefined, ); - it("should properly deal with other extensions", (done) => { + it("should properly deal with other extensions", (t, done) => { pnpApi.mocks.set("@user/pkg", path.resolve(fixture, "pkg")); resolverFuzzy.resolve( {}, @@ -170,7 +177,8 @@ describe("pnp", () => { {}, (err, result) => { if (err) return done(err); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "pkg/typescript/index.ts"), ); done(); @@ -178,7 +186,7 @@ describe("pnp", () => { ); }); - it("should properly deal package.json alias", (done) => { + it("should properly deal package.json alias", (t, done) => { pnpApi.mocks.set("pkg", path.resolve(fixture, "pkg")); resolverFuzzy.resolve( {}, @@ -187,7 +195,8 @@ describe("pnp", () => { {}, (err, result) => { if (err) return done(err); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "pkg/package-alias/browser.js"), ); done(); @@ -195,7 +204,7 @@ describe("pnp", () => { ); }); - it("should prefer pnp resolves over normal modules", (done) => { + it("should prefer pnp resolves over normal modules", (t, done) => { pnpApi.mocks.set("m1", path.resolve(fixture, "../node_modules/m2")); resolver.resolve( {}, @@ -204,7 +213,8 @@ describe("pnp", () => { {}, (err, result) => { if (err) return done(err); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "../node_modules/m2/b.js"), ); done(); @@ -212,7 +222,7 @@ describe("pnp", () => { ); }); - it("should prefer alternative module directories over pnp", (done) => { + it("should prefer alternative module directories over pnp", (t, done) => { pnpApi.mocks.set("m1", path.resolve(fixture, "../node_modules/m2")); resolver.resolve( {}, @@ -221,7 +231,8 @@ describe("pnp", () => { {}, (err, result) => { if (err) return done(err); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve( __dirname, "fixtures/prefer-pnp/alternative-modules/m1/b.js", @@ -232,7 +243,7 @@ describe("pnp", () => { ); }); - it("should prefer alias over pnp resolves", (done) => { + it("should prefer alias over pnp resolves", (t, done) => { pnpApi.mocks.set("alias", path.resolve(fixture, "pkg/dir")); resolver.resolve( {}, @@ -241,13 +252,13 @@ describe("pnp", () => { {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.resolve(fixture, "pkg/index.js")); + assert.deepStrictEqual(result, path.resolve(fixture, "pkg/index.js")); done(); }, ); }); - it("should prefer pnp over modules after node_modules", (done) => { + it("should prefer pnp over modules after node_modules", (t, done) => { pnpApi.mocks.set("m2", path.resolve(fixture, "pkg")); resolver.resolve( {}, @@ -256,13 +267,13 @@ describe("pnp", () => { {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.resolve(fixture, "pkg/index.js")); + assert.deepStrictEqual(result, path.resolve(fixture, "pkg/index.js")); done(); }, ); }); - it("should fallback to alternatives when pnp resolving fails", (done) => { + it("should fallback to alternatives when pnp resolving fails", (t, done) => { resolver.resolve( {}, path.resolve(__dirname, "fixtures"), @@ -270,13 +281,16 @@ describe("pnp", () => { {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.resolve(fixture, "../pnp-a/m2/a.js")); + assert.deepStrictEqual( + result, + path.resolve(fixture, "../pnp-a/m2/a.js"), + ); done(); }, ); }); - it("should fallback to alternatives when pnp doesn't manage the issuer", (done) => { + it("should fallback to alternatives when pnp doesn't manage the issuer", (t, done) => { pnpApi.ignoredIssuers.add(`${path.resolve(__dirname, "fixtures")}/`); // Add the wrong path on purpose to make sure the issuer is ignored pnpApi.mocks.set("m2", path.resolve(fixture, "pkg")); @@ -287,7 +301,8 @@ describe("pnp", () => { {}, (err, result) => { if (err) return done(err); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(__dirname, "fixtures/node_modules/m2/b.js"), ); done(); @@ -295,7 +310,7 @@ describe("pnp", () => { ); }); - it("should handle the exports field when using PnP", (done) => { + it("should handle the exports field when using PnP", (t, done) => { pnpApi.mocks.set("m1", path.resolve(fixture, "pkg3")); resolver.resolve( {}, @@ -304,13 +319,13 @@ describe("pnp", () => { {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.resolve(fixture, "pkg3/a.js")); + assert.deepStrictEqual(result, path.resolve(fixture, "pkg3/a.js")); done(); }, ); }); - it("should handle the exports field when using PnP (with sub path)", (done) => { + it("should handle the exports field when using PnP (with sub path)", (t, done) => { pnpApi.mocks.set("@user/m1", path.resolve(fixture, "pkg3")); resolver.resolve( {}, @@ -319,13 +334,13 @@ describe("pnp", () => { {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.resolve(fixture, "pkg3/a.js")); + assert.deepStrictEqual(result, path.resolve(fixture, "pkg3/a.js")); done(); }, ); }); - it("falls through when pnpApi throws an UNDECLARED_DEPENDENCY error and logs each line", (done) => { + it("falls through when pnpApi throws an UNDECLARED_DEPENDENCY error and logs each line", (t, done) => { const pnpApi = { resolveToUnqualified() { const err = @@ -349,16 +364,20 @@ describe("pnp", () => { { log: (m) => logs.push(m) }, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.resolve(fixture, "../pnp-a/m2/a.js")); - expect( + assert.deepStrictEqual( + result, + path.resolve(fixture, "../pnp-a/m2/a.js"), + ); + assert.strictEqual( logs.some((l) => l.includes("request is not managed by the pnpapi")), - ).toBe(true); + true, + ); done(); }, ); }); - it("propagates unexpected errors from pnpApi", (done) => { + it("propagates unexpected errors from pnpApi", (t, done) => { const pnpApi = { resolveToUnqualified() { throw new Error("unexpected-pnp"); @@ -375,14 +394,17 @@ describe("pnp", () => { "m2/a.js", {}, (err) => { - expect(err).toBeTruthy(); - expect(/** @type {Error} */ (err).message).toBe("unexpected-pnp"); + assert.ok(err); + assert.strictEqual( + /** @type {Error} */ (err).message, + "unexpected-pnp", + ); done(); }, ); }); - it("returns an error when neither pnp nor the alternate find a result", (done) => { + it("returns an error when neither pnp nor the alternate find a result", (t, done) => { const pnpApi = { resolveToUnqualified() { return null; @@ -399,7 +421,7 @@ describe("pnp", () => { "no-such-package", {}, (err) => { - expect(err).toBeInstanceOf(Error); + assert.ok(err instanceof Error); done(); }, ); @@ -413,9 +435,9 @@ describe("pnp", () => { value: "0.0.0", configurable: true, }); - expect(() => + assert.doesNotThrow(() => ResolverFactory.createResolver({ fileSystem: nodeFileSystem }), - ).not.toThrow(); + ); } finally { if (originalPnp === undefined) { // eslint-disable-next-line jsdoc/reject-any-type diff --git a/test/polyfill-text-encoding.js b/test/polyfill-text-encoding.js index 85719a93..4e04a82c 100644 --- a/test/polyfill-text-encoding.js +++ b/test/polyfill-text-encoding.js @@ -1,5 +1,9 @@ "use strict"; +// TODO: drop this file once `engines.node` is bumped to >= 11. It is a no-op +// on every supported runtime today and only exists for the Node.js 10 leg of +// the test CI matrix. + // Node 10 lacks the global TextEncoder/TextDecoder that browsers, Deno, Bun and // Node >= 11 provide; expose them from `util` so the suite (and the library's // Uint8Array decode path) runs there too. No-op on every supported runtime. diff --git a/test/pr-53.test.js b/test/pr-53.test.js index 3e7b4293..03a693ed 100644 --- a/test/pr-53.test.js +++ b/test/pr-53.test.js @@ -1,6 +1,8 @@ "use strict"; +const assert = require("assert"); const { CachedInputFileSystem } = require("../"); +const { describe, it } = require("./_runner"); describe("pr-53", () => { it("should allow to readJsonSync in CachedInputFileSystem", () => { @@ -14,6 +16,6 @@ describe("pr-53", () => { 1000, ); if (!cfs.readJsonSync) throw new Error("readJsonSync must be available"); - expect(cfs.readJsonSync("xyz")).toBe("abcxyz"); + assert.strictEqual(cfs.readJsonSync("xyz"), "abcxyz"); }); }); diff --git a/test/recursion.test.js b/test/recursion.test.js index 29fd9f40..9144797a 100644 --- a/test/recursion.test.js +++ b/test/recursion.test.js @@ -1,14 +1,17 @@ "use strict"; +const assert = require("assert"); const fs = require("fs"); + const path = require("path"); const { CachedInputFileSystem, ResolverFactory } = require("../"); +const { describe, it } = require("./_runner"); const fixtures = path.join(__dirname, "fixtures"); const nodeFileSystem = new CachedInputFileSystem(fs, 4000); describe("recursion detection", () => { - it("surfaces a recursion error when a plugin re-invokes doResolve on the same hook/request", (done) => { + it("surfaces a recursion error when a plugin re-invokes doResolve on the same hook/request", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem: nodeFileSystem, extensions: [".js"], @@ -26,15 +29,18 @@ describe("recursion detection", () => { }); resolver.resolve({}, fixtures, "./a.js", {}, (err) => { - expect(err).toBeInstanceOf(Error); + assert.ok(err instanceof Error); // The recursion error may be wrapped; either shape is acceptable. const msg = /** @type {Error} */ (err).message; - expect(/Recursion in resolving|Can't resolve/.test(msg)).toBe(true); + assert.strictEqual( + /Recursion in resolving|Can't resolve/.test(msg), + true, + ); done(); }); }); - it("logs 'abort resolving because of recursion' when a log is provided", (done) => { + it("logs 'abort resolving because of recursion' when a log is provided", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem: nodeFileSystem, extensions: [".js"], @@ -56,10 +62,11 @@ describe("recursion detection", () => { "./a.js", { log: (m) => log.push(m) }, (err) => { - expect(err).toBeInstanceOf(Error); - expect( + assert.ok(err instanceof Error); + assert.strictEqual( log.some((l) => l.includes("abort resolving because of recursion")), - ).toBe(true); + true, + ); done(); }, ); diff --git a/test/resolve-context-stack.test.js b/test/resolve-context-stack.test.js index a9ab9c58..fadd4308 100644 --- a/test/resolve-context-stack.test.js +++ b/test/resolve-context-stack.test.js @@ -1,8 +1,11 @@ "use strict"; +const assert = require("assert"); const fs = require("fs"); + const path = require("path"); const { CachedInputFileSystem, ResolverFactory } = require("../"); +const { describe, it } = require("./_runner"); const nodeFileSystem = new CachedInputFileSystem(fs, 4000); @@ -14,15 +17,15 @@ describe("resolveContext.stack", () => { fileSystem: nodeFileSystem, }); - it("should resolve when no stack is supplied", (done) => { + it("should resolve when no stack is supplied", (t, done) => { resolver.resolve({}, fixture, "./foo", {}, (err, result) => { if (err) return done(err); - expect(result).toBeTruthy(); + assert.ok(result); done(); }); }); - it("should resolve when an empty StackEntry is supplied as stack", (done) => { + it("should resolve when an empty StackEntry is supplied as stack", (t, done) => { resolver.resolve( {}, fixture, @@ -30,13 +33,13 @@ describe("resolveContext.stack", () => { { stack: new Set() }, (err, result) => { if (err) return done(err); - expect(result).toBeTruthy(); + assert.ok(result); done(); }, ); }); - it("should resolve when a non-empty Set is supplied as stack", (done) => { + it("should resolve when a non-empty Set is supplied as stack", (t, done) => { // The values below are arbitrary tokens that must not collide with any // real `resolve` step. Providing them exercises the code path where a // caller pre-seeds the recursion-tracking stack. @@ -47,13 +50,13 @@ describe("resolveContext.stack", () => { { stack: new Set(["custom-entry-1", "custom-entry-2"]) }, (err, result) => { if (err) return done(err); - expect(result).toBeTruthy(); + assert.ok(result); done(); }, ); }); - it("should detect recursion against entries pre-seeded in the stack", (done) => { + it("should detect recursion against entries pre-seeded in the stack", (t, done) => { // The first stack entry that `resolve` pushes for this request is // `resolve: (…fixture…) ./foo`. Pre-seeding an identical string in // the context must trigger the recursion guard and abort the resolve. @@ -64,16 +67,17 @@ describe("resolveContext.stack", () => { "./foo", { stack: new Set([preSeededEntry]) }, (err) => { - expect(err).toBeTruthy(); - expect( + assert.ok(err); + assert.strictEqual( /** @type {Error & { recursion?: boolean }} */ (err).recursion, - ).toBe(true); + true, + ); done(); }, ); }); - it("should detect recursion against Set entries at deeper resolve steps", (done) => { + it("should detect recursion against Set entries at deeper resolve steps", (t, done) => { // `parsedResolve` runs after the top-level `resolve` hook, so // pre-seeding its entry only triggers recursion at a deeper // `doResolve` call. This exercises the path where the legacy Set @@ -86,10 +90,11 @@ describe("resolveContext.stack", () => { "./foo", { stack: new Set([deeperEntry]) }, (err) => { - expect(err).toBeTruthy(); - expect( + assert.ok(err); + assert.strictEqual( /** @type {Error & { recursion?: boolean }} */ (err).recursion, - ).toBe(true); + true, + ); done(); }, ); @@ -101,43 +106,45 @@ describe("resolveContext.stack", () => { // either omitting `stack` or assigning `undefined`. Both forms must clear // any prior pre-seeded entries so a follow-up resolve no longer recurses. - it("should reset the stack by assigning `undefined` (StackEntry equivalent of `new Set()`)", (done) => { + it("should reset the stack by assigning `undefined` (StackEntry equivalent of `new Set()`)", (t, done) => { // First call: pre-seed an entry that triggers recursion immediately. // Reuse the same `ctx` object on the second call after clearing the // field — the resolve must succeed because the seeded entry is gone. /** @type {import("../").ResolveContext} */ const ctx = { stack: new Set([`resolve: (${fixture}) ./foo`]) }; resolver.resolve({}, fixture, "./foo", ctx, (err) => { - expect(err).toBeTruthy(); - expect( + assert.ok(err); + assert.strictEqual( /** @type {Error & { recursion?: boolean }} */ (err).recursion, - ).toBe(true); + true, + ); ctx.stack = undefined; resolver.resolve({}, fixture, "./foo", ctx, (err2, result) => { if (err2) return done(err2); - expect(result).toBeTruthy(); + assert.ok(result); done(); }); }); }); - it("should reset the stack by assigning a fresh `new Set()` on a reused context", (done) => { + it("should reset the stack by assigning a fresh `new Set()` on a reused context", (t, done) => { // Same pattern, but using the legacy Set form for the reset to confirm // back-compat: a fresh empty Set clears the recursion guard just like // `undefined` does. /** @type {import("../").ResolveContext} */ const ctx = { stack: new Set([`resolve: (${fixture}) ./foo`]) }; resolver.resolve({}, fixture, "./foo", ctx, (err) => { - expect(err).toBeTruthy(); - expect( + assert.ok(err); + assert.strictEqual( /** @type {Error & { recursion?: boolean }} */ (err).recursion, - ).toBe(true); + true, + ); ctx.stack = new Set(); resolver.resolve({}, fixture, "./foo", ctx, (err2, result) => { if (err2) return done(err2); - expect(result).toBeTruthy(); + assert.ok(result); done(); }); }); @@ -205,7 +212,7 @@ describe("resolveContext.stack", () => { }); }; - it("succeeds when the plugin resets `stack` to undefined before re-issuing", (done) => { + it("succeeds when the plugin resets `stack` to undefined before re-issuing", (t, done) => { buildReplayResolver(true).resolve( {}, fixture, @@ -213,22 +220,23 @@ describe("resolveContext.stack", () => { {}, (err, result) => { if (err) return done(err); - expect(result).toBeTruthy(); + assert.ok(result); done(); }, ); }); - it("trips the recursion guard if the plugin forgets to reset `stack`", (done) => { + it("trips the recursion guard if the plugin forgets to reset `stack`", (t, done) => { // Negative control: confirms the reset above isn't a no-op. // Without it, the inner `resolver.resolve()` inherits the outer // chain, sees its own `resolve: (...)` entry already on the stack, // and aborts. buildReplayResolver(false).resolve({}, fixture, "./foo", {}, (err) => { - expect(err).toBeTruthy(); - expect( + assert.ok(err); + assert.strictEqual( /** @type {Error & { recursion?: boolean }} */ (err).recursion, - ).toBe(true); + true, + ); done(); }); }); @@ -238,7 +246,7 @@ describe("resolveContext.stack", () => { // the stack and runs `String.prototype` methods on each entry. Pre-5.21 // this worked because `stack` was a `Set`; the iterator must // keep yielding strings so the snippet from the issue doesn't TypeError. - it("supports `[...resolveContext.stack].find(a => a.includes(...))` (issue #567)", (done) => { + it("supports `[...resolveContext.stack].find(a => a.includes(...))` (issue #567)", (t, done) => { /** @type {string | undefined} */ let moduleEntry; const plugin = { @@ -268,15 +276,18 @@ describe("resolveContext.stack", () => { }); r.resolve({}, fixture, "m1/a", {}, (err, result) => { if (err) return done(err); - expect(result).toBeTruthy(); + assert.ok(result); const entry = /** @type {string} */ (moduleEntry); - expect(entry).toBeTruthy(); - expect(typeof entry).toBe("string"); - expect(entry).toMatch(/^module: \(.+\) \.\//); + assert.ok(entry); + assert.strictEqual(typeof entry, "string"); + assert.match(entry, /^module: \(.+\) \.\//); // The exact regex from the issue's `DependencyDedupePlugin` // plugin: strip the `module: (path) ./` prefix and keep the // rest. For a `m1/a` request that yields `"m1/a"`. - expect(entry.replace(/^(module: \(.+\) \.\/)(?=.+$)/, "")).toBe("m1/a"); + assert.strictEqual( + entry.replace(/^(module: \(.+\) \.\/)(?=.+$)/, ""), + "m1/a", + ); done(); }); }); diff --git a/test/resolve-logging.test.js b/test/resolve-logging.test.js index ae4baec8..f89010c3 100644 --- a/test/resolve-logging.test.js +++ b/test/resolve-logging.test.js @@ -1,9 +1,12 @@ "use strict"; +const assert = require("assert"); const fs = require("fs"); + const path = require("path"); const { CachedInputFileSystem, ResolverFactory } = require("../"); const resolve = require("../"); +const { describe, it } = require("./_runner"); const fixtures = path.join(__dirname, "fixtures"); const nodeFileSystem = new CachedInputFileSystem(fs, 4000); @@ -14,7 +17,7 @@ describe("directory/file existence logging", () => { extensions: [".js"], }); - it("logs 'doesn't exist' when a directory is missing during resolution", (done) => { + it("logs 'doesn't exist' when a directory is missing during resolution", (t, done) => { const log = []; resolver.resolve( {}, @@ -22,14 +25,17 @@ describe("directory/file existence logging", () => { "./does-not-exist", { log: (m) => log.push(m) }, (err) => { - expect(err).toBeInstanceOf(Error); - expect(log.some((l) => l.includes("doesn't exist"))).toBe(true); + assert.ok(err instanceof Error); + assert.strictEqual( + log.some((l) => l.includes("doesn't exist")), + true, + ); done(); }, ); }); - it("tracks missing directories in resolveContext.missingDependencies", (done) => { + it("tracks missing directories in resolveContext.missingDependencies", (t, done) => { const missingDependencies = new Set(); resolver.resolve( {}, @@ -37,8 +43,8 @@ describe("directory/file existence logging", () => { "./does-not-exist", { missingDependencies }, (err) => { - expect(err).toBeInstanceOf(Error); - expect(missingDependencies.size).toBeGreaterThan(0); + assert.ok(err instanceof Error); + assert.ok(missingDependencies.size > 0); done(); }, ); @@ -51,18 +57,18 @@ describe("fragment handling (ParsePlugin)", () => { extensions: [".js"], }); - it("preserves unique fragments when parsing requests", (done) => { + it("preserves unique fragments when parsing requests", (t, done) => { resolver.resolve({}, fixtures, "./a.js#frag", {}, (err, result) => { if (err) return done(err); - expect(result).toBe(`${path.join(fixtures, "a.js")}#frag`); + assert.strictEqual(result, `${path.join(fixtures, "a.js")}#frag`); done(); }); }); - it("preserves queries together with fragments", (done) => { + it("preserves queries together with fragments", (t, done) => { resolver.resolve({}, fixtures, "./a.js?q#f", {}, (err, result) => { if (err) return done(err); - expect(result).toBe(`${path.join(fixtures, "a.js")}?q#f`); + assert.strictEqual(result, `${path.join(fixtures, "a.js")}?q#f`); done(); }); }); @@ -73,7 +79,7 @@ describe("resolver resolves request without a fragment or module marker", () => // that has no directory/module/query/fragment/descriptionFile attached. const LogInfoPlugin = require("../lib/LogInfoPlugin"); - it("runs without logging query/fragment/module/directory lines", (done) => { + it("runs without logging query/fragment/module/directory lines", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem: nodeFileSystem, extensions: [".js"], @@ -89,11 +95,18 @@ describe("resolver resolves request without a fragment or module marker", () => if (err) return done(err); // The "file" hook sees a request where module/directory are false and // query/fragment are empty — so these branches are skipped. - expect(log.some((l) => l.includes("[file] Resolving in"))).toBe(true); - expect(log.some((l) => l.includes("Request is a directory"))).toBe( + assert.strictEqual( + log.some((l) => l.includes("[file] Resolving in")), + true, + ); + assert.strictEqual( + log.some((l) => l.includes("Request is a directory")), + false, + ); + assert.strictEqual( + log.some((l) => l.includes("Request is an module")), false, ); - expect(log.some((l) => l.includes("Request is an module"))).toBe(false); done(); }, ); @@ -102,24 +115,24 @@ describe("resolver resolves request without a fragment or module marker", () => // A convenience sanity check that the full top-level resolve() works. describe("top-level resolve()", () => { - it("resolves a fixture with the default node resolver", (done) => { + it("resolves a fixture with the default node resolver", (t, done) => { resolve(fixtures, "./a.js", (err, result) => { if (err) return done(err); - expect(result).toEqual(path.join(fixtures, "a.js")); + assert.deepStrictEqual(result, path.join(fixtures, "a.js")); done(); }); }); }); describe("resolving a directory as a file (FileExistsPlugin 'is not a file' branch)", () => { - it("emits an error when enforceExtension matches a directory", (done) => { + it("emits an error when enforceExtension matches a directory", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem: nodeFileSystem, enforceExtension: true, extensions: [".js"], }); resolver.resolve({}, fixtures, "./directory-default", {}, (err) => { - expect(err).toBeInstanceOf(Error); + assert.ok(err instanceof Error); done(); }); }); diff --git a/test/resolve.test.js b/test/resolve.test.js index 21051760..c0d95b1f 100644 --- a/test/resolve.test.js +++ b/test/resolve.test.js @@ -1,8 +1,11 @@ "use strict"; +const assert = require("assert"); + const path = require("path"); const url = require("url"); const resolve = require("../"); +const { describe, it } = require("./_runner"); const fixtures = path.join(__dirname, "fixtures"); @@ -41,23 +44,23 @@ function testResolve(name, context, moduleName, result) { describe(name, () => { it("should resolve sync correctly", () => { const filename = resolve.sync(context, moduleName); - expect(filename).toBeDefined(); - expect(filename).toEqual(result); + assert.notStrictEqual(filename, undefined); + assert.deepStrictEqual(filename, result); }); - it("should resolve async correctly", (done) => { + it("should resolve async correctly", (t, done) => { resolve(context, moduleName, (err, filename) => { if (err) return done(err); - expect(filename).toBeDefined(); - expect(filename).toEqual(result); + assert.notStrictEqual(filename, undefined); + assert.deepStrictEqual(filename, result); done(); }); }); it("should resolve promise correctly", async () => { const filename = await resolve.promise(context, moduleName); - expect(filename).toBeDefined(); - expect(filename).toEqual(result); + assert.notStrictEqual(filename, undefined); + assert.deepStrictEqual(filename, result); }); }); } @@ -71,25 +74,25 @@ function testResolve(name, context, moduleName, result) { */ function testResolveContext(name, context, moduleName, result) { describe(name, () => { - it("should resolve async correctly", (done) => { + it("should resolve async correctly", (t, done) => { asyncContextResolve(context, moduleName, (err, filename) => { if (err) done(err); - expect(filename).toBeDefined(); - expect(filename).toEqual(result); + assert.notStrictEqual(filename, undefined); + assert.deepStrictEqual(filename, result); done(); }); }); it("should resolve sync correctly", () => { const filename = syncContextResolve(context, moduleName); - expect(filename).toBeDefined(); - expect(filename).toEqual(result); + assert.notStrictEqual(filename, undefined); + assert.deepStrictEqual(filename, result); }); it("should resolve promise correctly", async () => { const filename = await promiseContextResolve(context, moduleName); - expect(filename).toBeDefined(); - expect(filename).toEqual(result); + assert.notStrictEqual(filename, undefined); + assert.deepStrictEqual(filename, result); }); }); } @@ -329,7 +332,7 @@ describe("resolve", () => { path.join(fixtures, "main1.js"), ); - it("should correctly resolve", (done) => { + it("should correctly resolve", (t, done) => { const issue238 = path.resolve(fixtures, "issue-238"); issue238Resolve( @@ -337,8 +340,9 @@ describe("resolve", () => { "config/myObjectFile", (err, filename) => { if (err) done(err); - expect(filename).toBeDefined(); - expect(filename).toEqual( + assert.notStrictEqual(filename, undefined); + assert.deepStrictEqual( + filename, path.resolve(issue238, "./src/common/config/myObjectFile.js"), ); done(); @@ -346,46 +350,47 @@ describe("resolve", () => { ); }); - it("should correctly resolve with preferRelative", (done) => { + it("should correctly resolve with preferRelative", (t, done) => { preferRelativeResolve(fixtures, "main1.js", (err, filename) => { if (err) done(err); - expect(filename).toBeDefined(); - expect(filename).toEqual(path.join(fixtures, "main1.js")); + assert.notStrictEqual(filename, undefined); + assert.deepStrictEqual(filename, path.join(fixtures, "main1.js")); done(); }); }); - it("should correctly resolve with preferRelative #2", (done) => { + it("should correctly resolve with preferRelative #2", (t, done) => { preferRelativeResolve(fixtures, "m1/a.js", (err, filename) => { if (err) done(err); - expect(filename).toBeDefined(); - expect(filename).toEqual( + assert.notStrictEqual(filename, undefined); + assert.deepStrictEqual( + filename, path.join(fixtures, "node_modules", "m1", "a.js"), ); done(); }); }); - it("should not crash when passing undefined as path", (done) => { + it("should not crash when passing undefined as path", (t, done) => { // @ts-expect-error testing invalid arguments resolve(fixtures, undefined, (err) => { - expect(err).toBeInstanceOf(Error); + assert.ok(err instanceof Error); done(); }); }); - it("should not crash when passing undefined as context", (done) => { + it("should not crash when passing undefined as context", (t, done) => { // @ts-expect-error testing invalid arguments resolve({}, undefined, "./test/resolve.js", (err) => { - expect(err).toBeInstanceOf(Error); + assert.ok(err instanceof Error); done(); }); }); - it("should not crash when passing undefined everywhere", (done) => { + it("should not crash when passing undefined everywhere", (t, done) => { // @ts-expect-error testing invalid arguments resolve(undefined, undefined, undefined, undefined, (err) => { - expect(err).toBeInstanceOf(Error); + assert.ok(err instanceof Error); done(); }); }); diff --git a/test/resolver-cache.test.js b/test/resolver-cache.test.js index 2105b23d..c91251f7 100644 --- a/test/resolver-cache.test.js +++ b/test/resolver-cache.test.js @@ -1,9 +1,12 @@ "use strict"; +const assert = require("assert"); const fs = require("fs"); + const path = require("path"); const { CachedInputFileSystem, ResolverFactory } = require("../"); const { dirname, join } = require("../lib/util/path"); +const { describe, it } = require("./_runner"); describe("Resolver join/dirname cache", () => { describe("when unsafeCache is enabled", () => { @@ -21,7 +24,7 @@ describe("Resolver join/dirname cache", () => { unsafeCache: true, }); - expect(resolver1.pathCache).toBe(resolver2.pathCache); + assert.strictEqual(resolver1.pathCache, resolver2.pathCache); }); it("should use independent caches for different fileSystems", () => { @@ -39,7 +42,7 @@ describe("Resolver join/dirname cache", () => { unsafeCache: true, }); - expect(resolver1.pathCache).not.toBe(resolver2.pathCache); + assert.notStrictEqual(resolver1.pathCache, resolver2.pathCache); }); it("should produce correct results", () => { @@ -51,14 +54,19 @@ describe("Resolver join/dirname cache", () => { unsafeCache: true, }); - expect(resolver.join("/a/b", "c")).toBe(join("/a/b", "c")); - expect(resolver.dirname("/a/b/c")).toBe(dirname("/a/b/c")); - expect(resolver.basename("/a/b/c")).toBe(path.basename("/a/b/c")); - expect(resolver.basename("/a/b/c.ext", ".ext")).toBe( + assert.strictEqual(resolver.join("/a/b", "c"), join("/a/b", "c")); + assert.strictEqual(resolver.dirname("/a/b/c"), dirname("/a/b/c")); + assert.strictEqual(resolver.basename("/a/b/c"), path.basename("/a/b/c")); + assert.strictEqual( + resolver.basename("/a/b/c.ext", ".ext"), path.basename("/a/b/c.ext", ".ext"), ); - expect(resolver.basename("/a/b/c.ext")).toBe(path.basename("/a/b/c.ext")); - expect(resolver.basename("/a/b/c.ext", ".other")).toBe( + assert.strictEqual( + resolver.basename("/a/b/c.ext"), + path.basename("/a/b/c.ext"), + ); + assert.strictEqual( + resolver.basename("/a/b/c.ext", ".other"), path.basename("/a/b/c.ext", ".other"), ); }); @@ -76,22 +84,22 @@ describe("Resolver join/dirname cache", () => { resolver.dirname("/a/b/c"); resolver.basename("/a/b/c"); - expect(resolver.pathCache.join.cache.size).toBeGreaterThan(0); - expect(resolver.pathCache.dirname.cache.size).toBeGreaterThan(0); - expect(resolver.pathCache.basename.cache.size).toBeGreaterThan(0); + assert.ok(resolver.pathCache.join.cache.size > 0); + assert.ok(resolver.pathCache.dirname.cache.size > 0); + assert.ok(resolver.pathCache.basename.cache.size > 0); resolver.pathCache.join.cache.clear(); resolver.pathCache.dirname.cache.clear(); resolver.pathCache.basename.cache.clear(); - expect(resolver.pathCache.join.cache.size).toBe(0); - expect(resolver.pathCache.dirname.cache.size).toBe(0); - expect(resolver.pathCache.basename.cache.size).toBe(0); + assert.strictEqual(resolver.pathCache.join.cache.size, 0); + assert.strictEqual(resolver.pathCache.dirname.cache.size, 0); + assert.strictEqual(resolver.pathCache.basename.cache.size, 0); // Still works after clearing - expect(resolver.join("/a/b", "c")).toBe(join("/a/b", "c")); - expect(resolver.dirname("/a/b/c")).toBe(dirname("/a/b/c")); - expect(resolver.basename("/a/b/c")).toBe(path.basename("/a/b/c")); + assert.strictEqual(resolver.join("/a/b", "c"), join("/a/b", "c")); + assert.strictEqual(resolver.dirname("/a/b/c"), dirname("/a/b/c")); + assert.strictEqual(resolver.basename("/a/b/c"), path.basename("/a/b/c")); }); it("should clear only join cache when calling pathCache.join.clear()", () => { @@ -109,9 +117,9 @@ describe("Resolver join/dirname cache", () => { resolver.pathCache.join.cache.clear(); - expect(resolver.pathCache.join.cache.size).toBe(0); - expect(resolver.pathCache.dirname.cache.size).toBeGreaterThan(0); - expect(resolver.pathCache.basename.cache.size).toBeGreaterThan(0); + assert.strictEqual(resolver.pathCache.join.cache.size, 0); + assert.ok(resolver.pathCache.dirname.cache.size > 0); + assert.ok(resolver.pathCache.basename.cache.size > 0); }); it("should clear only dirname cache when calling pathCache.dirname.clear()", () => { @@ -129,9 +137,9 @@ describe("Resolver join/dirname cache", () => { resolver.pathCache.dirname.cache.clear(); - expect(resolver.pathCache.join.cache.size).toBeGreaterThan(0); - expect(resolver.pathCache.dirname.cache.size).toBe(0); - expect(resolver.pathCache.basename.cache.size).toBeGreaterThan(0); + assert.ok(resolver.pathCache.join.cache.size > 0); + assert.strictEqual(resolver.pathCache.dirname.cache.size, 0); + assert.ok(resolver.pathCache.basename.cache.size > 0); }); it("should clear only dirname cache when calling pathCache.basename.clear()", () => { @@ -149,9 +157,9 @@ describe("Resolver join/dirname cache", () => { resolver.pathCache.basename.cache.clear(); - expect(resolver.pathCache.join.cache.size).toBeGreaterThan(0); - expect(resolver.pathCache.dirname.cache.size).toBeGreaterThan(0); - expect(resolver.pathCache.basename.cache.size).toBe(0); + assert.ok(resolver.pathCache.join.cache.size > 0); + assert.ok(resolver.pathCache.dirname.cache.size > 0); + assert.strictEqual(resolver.pathCache.basename.cache.size, 0); }); }); @@ -168,7 +176,7 @@ describe("Resolver join/dirname cache", () => { extensions: [".js"], }); - expect(resolver1.pathCache).toBe(resolver2.pathCache); + assert.strictEqual(resolver1.pathCache, resolver2.pathCache); }); }); }); diff --git a/test/restrictions.test.js b/test/restrictions.test.js index ac65d043..2214bbf6 100644 --- a/test/restrictions.test.js +++ b/test/restrictions.test.js @@ -1,15 +1,18 @@ "use strict"; +const assert = require("assert"); const fs = require("fs"); + const path = require("path"); const CachedInputFileSystem = require("../lib/CachedInputFileSystem"); const ResolverFactory = require("../lib/ResolverFactory"); +const { after, describe, it } = require("./_runner"); const fixture = path.resolve(__dirname, "fixtures", "restrictions"); const nodeFileSystem = new CachedInputFileSystem(fs, 4000); describe("restrictions", () => { - it("should respect RegExp restriction", (done) => { + it("should respect RegExp restriction", (t, done) => { const resolver = ResolverFactory.createResolver({ extensions: [".js"], fileSystem: nodeFileSystem, @@ -18,12 +21,12 @@ describe("restrictions", () => { resolver.resolve({}, fixture, "pck1", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); + assert.ok(err instanceof Error); done(); }); }); - it("should try to find alternative #1", (done) => { + it("should try to find alternative #1", (t, done) => { const resolver = ResolverFactory.createResolver({ extensions: [".js", ".css"], fileSystem: nodeFileSystem, @@ -34,14 +37,15 @@ describe("restrictions", () => { resolver.resolve({}, fixture, "pck1", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "node_modules/pck1/index.css"), ); done(); }); }); - it("should respect string restriction", (done) => { + it("should respect string restriction", (t, done) => { const resolver = ResolverFactory.createResolver({ extensions: [".js"], fileSystem: nodeFileSystem, @@ -50,12 +54,12 @@ describe("restrictions", () => { resolver.resolve({}, fixture, "pck2", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); + assert.ok(err instanceof Error); done(); }); }); - it("should try to find alternative #2", (done) => { + it("should try to find alternative #2", (t, done) => { const resolver = ResolverFactory.createResolver({ extensions: [".js"], fileSystem: nodeFileSystem, @@ -66,14 +70,15 @@ describe("restrictions", () => { resolver.resolve({}, fixture, "pck2", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "node_modules/pck2/index.css"), ); done(); }); }); - it("should try to find alternative #3", (done) => { + it("should try to find alternative #3", (t, done) => { const resolver = ResolverFactory.createResolver({ extensions: [".js"], fileSystem: nodeFileSystem, @@ -91,148 +96,70 @@ describe("restrictions", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "node_modules/pck2/index.css"), ); - expect( + assert.deepStrictEqual( log.map((line) => line .replace(path.resolve(__dirname, ".."), "...") .replace(path.resolve(__dirname, ".."), "...") .replace(/\\/g, "/"), ), - ).toEqual([ - "resolve 'pck2' in '.../test/fixtures/restrictions'", - " Parsed request is a module", - " using description file: .../package.json (relative path: ./test/fixtures/restrictions)", - " resolve as module", - " looking for modules in .../test/fixtures/restrictions/node_modules", - " single file module", - " using description file: .../package.json (relative path: ./test/fixtures/restrictions/node_modules/pck2)", - " no extension", - " .../test/fixtures/restrictions/node_modules/pck2 is not a file", - " .js", - " .../test/fixtures/restrictions/node_modules/pck2.js doesn't exist", - " existing directory .../test/fixtures/restrictions/node_modules/pck2", - " using description file: .../test/fixtures/restrictions/node_modules/pck2/package.json (relative path: .)", - " using description file: .../package.json (relative path: ./test/fixtures/restrictions/node_modules/pck2)", - " no extension", - " .../test/fixtures/restrictions/node_modules/pck2 is not a file", - " .js", - " .../test/fixtures/restrictions/node_modules/pck2.js doesn't exist", - " as directory", - " existing directory .../test/fixtures/restrictions/node_modules/pck2", - " using description file: .../test/fixtures/restrictions/node_modules/pck2/package.json (relative path: .)", - " use ../../../c.js from main in package.json", - " using description file: .../package.json (relative path: ./test/fixtures/c.js)", - " no extension", - " existing file: .../test/fixtures/c.js", - " .../test/fixtures/c.js is not inside of the restriction .../test/fixtures/restrictions", - " .js", - " .../test/fixtures/c.js.js doesn't exist", - " as directory", - " .../test/fixtures/c.js is not a directory", - " use ./module.js from module in package.json", - " using description file: .../test/fixtures/restrictions/node_modules/pck2/package.json (relative path: ./module.js)", - " no extension", - " existing file: .../test/fixtures/restrictions/node_modules/pck2/module.js", - " .../test/fixtures/restrictions/node_modules/pck2/module.js doesn't match the restriction //.(sass|scss|css)$/", - " .js", - " .../test/fixtures/restrictions/node_modules/pck2/module.js.js doesn't exist", - " as directory", - " .../test/fixtures/restrictions/node_modules/pck2/module.js is not a directory", - " use ./index.css from style in package.json", - " using description file: .../test/fixtures/restrictions/node_modules/pck2/package.json (relative path: ./index.css)", - " no extension", - " existing file: .../test/fixtures/restrictions/node_modules/pck2/index.css", - " reporting result .../test/fixtures/restrictions/node_modules/pck2/index.css", - ]); - done(); - }, - ); - }); - - it("should fall back to the next modules entry when an exports target is outside the restriction", (done) => { - const buildModules = path.resolve(fixture, "build/node_modules"); - const resolver = ResolverFactory.createResolver({ - fileSystem: nodeFileSystem, - modules: ["node_modules", buildModules], - restrictions: [buildModules], - }); - - resolver.resolve( - {}, - fixture, - "exports-pck", - {}, - (err, result, resolveRequest) => { - if (err) return done(err); - if (!result) return done(new Error("No result")); - expect(result).toEqual( - path.resolve(buildModules, "exports-pck/lib/index.js"), + [ + "resolve 'pck2' in '.../test/fixtures/restrictions'", + " Parsed request is a module", + " using description file: .../package.json (relative path: ./test/fixtures/restrictions)", + " resolve as module", + " looking for modules in .../test/fixtures/restrictions/node_modules", + " single file module", + " using description file: .../package.json (relative path: ./test/fixtures/restrictions/node_modules/pck2)", + " no extension", + " .../test/fixtures/restrictions/node_modules/pck2 is not a file", + " .js", + " .../test/fixtures/restrictions/node_modules/pck2.js doesn't exist", + " existing directory .../test/fixtures/restrictions/node_modules/pck2", + " using description file: .../test/fixtures/restrictions/node_modules/pck2/package.json (relative path: .)", + " using description file: .../package.json (relative path: ./test/fixtures/restrictions/node_modules/pck2)", + " no extension", + " .../test/fixtures/restrictions/node_modules/pck2 is not a file", + " .js", + " .../test/fixtures/restrictions/node_modules/pck2.js doesn't exist", + " as directory", + " existing directory .../test/fixtures/restrictions/node_modules/pck2", + " using description file: .../test/fixtures/restrictions/node_modules/pck2/package.json (relative path: .)", + " use ../../../c.js from main in package.json", + " using description file: .../package.json (relative path: ./test/fixtures/c.js)", + " no extension", + " existing file: .../test/fixtures/c.js", + " .../test/fixtures/c.js is not inside of the restriction .../test/fixtures/restrictions", + " .js", + " .../test/fixtures/c.js.js doesn't exist", + " as directory", + " .../test/fixtures/c.js is not a directory", + " use ./module.js from module in package.json", + " using description file: .../test/fixtures/restrictions/node_modules/pck2/package.json (relative path: ./module.js)", + " no extension", + " existing file: .../test/fixtures/restrictions/node_modules/pck2/module.js", + " .../test/fixtures/restrictions/node_modules/pck2/module.js doesn't match the restriction //.(sass|scss|css)$/", + " .js", + " .../test/fixtures/restrictions/node_modules/pck2/module.js.js doesn't exist", + " as directory", + " .../test/fixtures/restrictions/node_modules/pck2/module.js is not a directory", + " use ./index.css from style in package.json", + " using description file: .../test/fixtures/restrictions/node_modules/pck2/package.json (relative path: ./index.css)", + " no extension", + " existing file: .../test/fixtures/restrictions/node_modules/pck2/index.css", + " reporting result .../test/fixtures/restrictions/node_modules/pck2/index.css", + ], ); - // the internal carrier must not leak onto the result - expect(resolveRequest).not.toHaveProperty("__restrictionsMarker"); done(); }, ); }); - it("should fall back when an exports target fails a RegExp restriction", (done) => { - const buildModules = path.resolve(fixture, "build/node_modules"); - const resolver = ResolverFactory.createResolver({ - fileSystem: nodeFileSystem, - modules: ["node_modules", buildModules], - restrictions: [/[\\/]build[\\/]node_modules[\\/]/], - }); - - resolver.resolve({}, fixture, "exports-pck", {}, (err, result) => { - if (err) return done(err); - if (!result) return done(new Error("No result")); - expect(result).toEqual( - path.resolve(buildModules, "exports-pck/lib/index.js"), - ); - done(); - }); - }); - - it("should not leak the internal marker when restrictions are not configured", (done) => { - const resolver = ResolverFactory.createResolver({ - fileSystem: nodeFileSystem, - modules: ["node_modules"], - }); - - resolver.resolve( - {}, - fixture, - "exports-pck", - {}, - (err, result, resolveRequest) => { - if (err) return done(err); - expect(result).toEqual( - path.resolve(fixture, "node_modules/exports-pck/lib/index.js"), - ); - expect(resolveRequest).not.toHaveProperty("__restrictionsMarker"); - done(); - }, - ); - }); - - it("should still throw when an exports target has no in-restriction fallback", (done) => { - const resolver = ResolverFactory.createResolver({ - fileSystem: nodeFileSystem, - modules: ["node_modules"], - restrictions: [path.resolve(fixture, "build/node_modules")], - }); - - resolver.resolve({}, fixture, "exports-pck", {}, (err, result) => { - if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); - done(); - }); - }); - - it("should throw an error when the path is outside a string restriction", (done) => { + it("should throw an error when the path is outside a string restriction", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem: nodeFileSystem, extensions: [".js"], @@ -245,16 +172,17 @@ describe("restrictions", () => { "pck1", { log: (m) => log.push(m) }, (err) => { - expect(err).toBeInstanceOf(Error); - expect( + assert.ok(err instanceof Error); + assert.strictEqual( log.some((l) => l.includes("is not inside of the restriction")), - ).toBe(true); + true, + ); done(); }, ); }); - it("should throw an error when the path does not match a regex restriction", (done) => { + it("should throw an error when the path does not match a regex restriction", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem: nodeFileSystem, extensions: [".js"], @@ -267,10 +195,11 @@ describe("restrictions", () => { "pck1", { log: (m) => log.push(m) }, (err) => { - expect(err).toBeInstanceOf(Error); - expect( + assert.ok(err instanceof Error); + assert.strictEqual( log.some((l) => l.includes("doesn't match the restriction")), - ).toBe(true); + true, + ); done(); }, ); @@ -301,7 +230,7 @@ describe("restrictions", () => { canSymlink = false; } - afterAll(() => { + after(() => { for (const file of [ path.join(allowed, "link.js"), path.join(allowed, "rel-link.js"), @@ -324,7 +253,7 @@ describe("restrictions", () => { }); if (canSymlink) { - it("should reject an in-root symlink whose real target is outside the restriction", (done) => { + it("should reject an in-root symlink whose real target is outside the restriction", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem: nodeFileSystem, extensions: [".js"], @@ -333,12 +262,12 @@ describe("restrictions", () => { resolver.resolve({}, allowed, "./link.js", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); + assert.ok(err instanceof Error); done(); }); }); - it("should reject an in-root relative symlink whose real target is outside the restriction", (done) => { + it("should reject an in-root relative symlink whose real target is outside the restriction", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem: nodeFileSystem, extensions: [".js"], @@ -347,12 +276,12 @@ describe("restrictions", () => { resolver.resolve({}, allowed, "./rel-link.js", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); + assert.ok(err instanceof Error); done(); }); }); - it("should still resolve a real in-root file under the restriction", (done) => { + it("should still resolve a real in-root file under the restriction", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem: nodeFileSystem, extensions: [".js"], @@ -361,12 +290,11 @@ describe("restrictions", () => { resolver.resolve({}, allowed, "./real.js", {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.join(allowed, "real.js")); + assert.deepStrictEqual(result, path.join(allowed, "real.js")); done(); }); }); } else { - // eslint-disable-next-line jest/expect-expect it("cannot test symlinks because we have no permission to create them", () => { // Nothing }); diff --git a/test/roots.test.js b/test/roots.test.js index 040c7295..cb2f15d0 100644 --- a/test/roots.test.js +++ b/test/roots.test.js @@ -1,9 +1,12 @@ "use strict"; +const assert = require("assert"); const fs = require("fs"); + const path = require("path"); const CachedInputFileSystem = require("../lib/CachedInputFileSystem"); const ResolverFactory = require("../lib/ResolverFactory"); +const { describe, it } = require("./_runner"); describe("roots", () => { const fixtures = path.resolve(__dirname, "fixtures"); @@ -44,34 +47,34 @@ describe("roots", () => { resolveToContext: true, }); - it("should respect roots option", (done) => { + it("should respect roots option", (t, done) => { resolver.resolve({}, fixtures, "/fixtures/b.js", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(fixtures, "b.js")); + assert.deepStrictEqual(result, path.resolve(fixtures, "b.js")); done(); }); }); - it("should try another root option, if it exists", (done) => { + it("should try another root option, if it exists", (t, done) => { resolver.resolve({}, fixtures, "/b.js", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(fixtures, "b.js")); + assert.deepStrictEqual(result, path.resolve(fixtures, "b.js")); done(); }); }); - it("should respect extension", (done) => { + it("should respect extension", (t, done) => { resolver.resolve({}, fixtures, "/fixtures/b", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(fixtures, "b.js")); + assert.deepStrictEqual(result, path.resolve(fixtures, "b.js")); done(); }); }); - it("should resolve in directory", (done) => { + it("should resolve in directory", (t, done) => { resolver.resolve( {}, fixtures, @@ -80,7 +83,8 @@ describe("roots", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixtures, "extensions/dir/index.js"), ); done(); @@ -88,16 +92,16 @@ describe("roots", () => { ); }); - it("should respect aliases", (done) => { + it("should respect aliases", (t, done) => { resolver.resolve({}, fixtures, "foo/b", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(fixtures, "b.js")); + assert.deepStrictEqual(result, path.resolve(fixtures, "b.js")); done(); }); }); - it("should support roots options with resolveToContext", (done) => { + it("should support roots options with resolveToContext", (t, done) => { contextResolver.resolve( {}, fixtures, @@ -106,21 +110,21 @@ describe("roots", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(fixtures, "lib")); + assert.deepStrictEqual(result, path.resolve(fixtures, "lib")); done(); }, ); }); - it("should not work with relative path", (done) => { + it("should not work with relative path", (t, done) => { resolver.resolve({}, fixtures, "fixtures/b.js", {}, (err, result) => { if (!err) return done(new Error(`expect error, got ${result}`)); - expect(err).toBeInstanceOf(Error); + assert.ok(err instanceof Error); done(); }); }); - it("should resolve an absolute path (prefer absolute)", (done) => { + it("should resolve an absolute path (prefer absolute)", (t, done) => { resolverPreferAbsolute.resolve( {}, fixtures, @@ -129,34 +133,34 @@ describe("roots", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.resolve(fixtures, "b.js")); + assert.deepStrictEqual(result, path.resolve(fixtures, "b.js")); done(); }, ); }); - it("should throw an error for empty requests (no root rewriting)", (done) => { + it("should throw an error for empty requests (no root rewriting)", (t, done) => { // Empty request should produce an error, not a root rewrite. resolver.resolve({}, fixtures, "", {}, (err) => { - expect(err).toBeInstanceOf(Error); + assert.ok(err instanceof Error); done(); }); }); - it("should work falls through for relative requests (no root rewriting)", (done) => { + it("should work falls through for relative requests (no root rewriting)", (t, done) => { // Relative request resolves normally (not via roots). resolver.resolve({}, fixtures, "./a.js", {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.join(fixtures, "a.js")); + assert.deepStrictEqual(result, path.join(fixtures, "a.js")); done(); }); }); - it("should rewrites absolute-style requests against roots", (done) => { + it("should rewrites absolute-style requests against roots", (t, done) => { // Absolute request "/a.js" should be rewritten to roots[0] + /a.js resolver.resolve({}, fixtures, "/a.js", {}, (err, result) => { if (err) return done(err); - expect(result).toEqual(path.join(fixtures, "a.js")); + assert.deepStrictEqual(result, path.join(fixtures, "a.js")); done(); }); }); diff --git a/test/scoped-packages.test.js b/test/scoped-packages.test.js index a43e40f4..5811cc7f 100644 --- a/test/scoped-packages.test.js +++ b/test/scoped-packages.test.js @@ -1,8 +1,11 @@ "use strict"; +const assert = require("assert"); const fs = require("fs"); + const path = require("path"); const { CachedInputFileSystem, ResolverFactory } = require("../"); +const { describe, it } = require("./_runner"); const fixture = path.join(__dirname, "fixtures", "scoped"); @@ -14,33 +17,36 @@ const resolver = ResolverFactory.createResolver({ }); describe("scoped-packages", () => { - it("main field should work", (done) => { + it("main field should work", (t, done) => { resolver.resolve({}, fixture, "@scope/pack1", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "./node_modules/@scope/pack1/main.js"), ); done(); }); }); - it("browser field should work", (done) => { + it("browser field should work", (t, done) => { resolver.resolve({}, fixture, "@scope/pack2", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "./node_modules/@scope/pack2/main.js"), ); done(); }); }); - it("folder request should work", (done) => { + it("folder request should work", (t, done) => { resolver.resolve({}, fixture, "@scope/pack2/lib", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.resolve(fixture, "./node_modules/@scope/pack2/lib/index.js"), ); done(); diff --git a/test/simple.test.js b/test/simple.test.js index a282967e..d623c2ce 100644 --- a/test/simple.test.js +++ b/test/simple.test.js @@ -1,9 +1,12 @@ "use strict"; +const assert = require("assert"); const fs = require("fs"); + const path = require("path"); const resolve = require("../"); const { CachedInputFileSystem, ResolverFactory } = require("../"); +const { describe, it } = require("./_runner"); const fixtures = path.join(__dirname, "fixtures"); @@ -20,7 +23,7 @@ describe("simple", () => { ]; for (const pathToIt of pathsToIt) { - it(`should resolve itself callback ${pathToIt[2]}`, (done) => { + it(`should resolve itself callback ${pathToIt[2]}`, (t, done) => { resolve(pathToIt[0], pathToIt[1], (err, filename) => { if (err) { return done( @@ -28,13 +31,16 @@ describe("simple", () => { ); } - expect(filename).toBeDefined(); - expect(filename).toEqual(path.join(__dirname, "..", "lib", "index.js")); + assert.notStrictEqual(filename, undefined); + assert.deepStrictEqual( + filename, + path.join(__dirname, "..", "lib", "index.js"), + ); done(); }); }); - it(`should resolve itself callback ${pathToIt[2]} and accept context argument`, (done) => { + it(`should resolve itself callback ${pathToIt[2]} and accept context argument`, (t, done) => { resolve({}, pathToIt[0], pathToIt[1], (err, filename) => { if (err) { return done( @@ -42,13 +48,16 @@ describe("simple", () => { ); } - expect(filename).toBeDefined(); - expect(filename).toEqual(path.join(__dirname, "..", "lib", "index.js")); + assert.notStrictEqual(filename, undefined); + assert.deepStrictEqual( + filename, + path.join(__dirname, "..", "lib", "index.js"), + ); done(); }); }); - it(`should resolve itself callback ${pathToIt[2]} and accept a resolveContext argument`, (done) => { + it(`should resolve itself callback ${pathToIt[2]} and accept a resolveContext argument`, (t, done) => { const resolveContext = {}; resolve({}, pathToIt[0], pathToIt[1], resolveContext, (err, filename) => { if (err) { @@ -57,8 +66,11 @@ describe("simple", () => { ); } - expect(filename).toBeDefined(); - expect(filename).toEqual(path.join(__dirname, "..", "lib", "index.js")); + assert.notStrictEqual(filename, undefined); + assert.deepStrictEqual( + filename, + path.join(__dirname, "..", "lib", "index.js"), + ); done(); }); }); @@ -66,15 +78,21 @@ describe("simple", () => { it(`should resolve itself sync ${pathToIt[2]}`, () => { const filename = resolve.sync(pathToIt[0], pathToIt[1]); - expect(filename).toBeDefined(); - expect(filename).toEqual(path.join(__dirname, "..", "lib", "index.js")); + assert.notStrictEqual(filename, undefined); + assert.deepStrictEqual( + filename, + path.join(__dirname, "..", "lib", "index.js"), + ); }); it(`should resolve itself sync ${pathToIt[2]} and accept a context argument`, () => { const filename = resolve.sync({}, pathToIt[0], pathToIt[1]); - expect(filename).toBeDefined(); - expect(filename).toEqual(path.join(__dirname, "..", "lib", "index.js")); + assert.notStrictEqual(filename, undefined); + assert.deepStrictEqual( + filename, + path.join(__dirname, "..", "lib", "index.js"), + ); }); it(`should resolve itself promise ${pathToIt[2]} and accept a resolveContext argument`, () => { @@ -86,21 +104,30 @@ describe("simple", () => { resolveContext, ); - expect(filename).toEqual(path.join(__dirname, "..", "lib", "index.js")); + assert.deepStrictEqual( + filename, + path.join(__dirname, "..", "lib", "index.js"), + ); }); it(`should resolve itself promise ${pathToIt[2]}`, async () => { const filename = await resolve.promise(pathToIt[0], pathToIt[1]); - expect(filename).toBeDefined(); - expect(typeof filename).toBe("string"); - expect(filename).toEqual(path.join(__dirname, "..", "lib", "index.js")); + assert.notStrictEqual(filename, undefined); + assert.strictEqual(typeof filename, "string"); + assert.deepStrictEqual( + filename, + path.join(__dirname, "..", "lib", "index.js"), + ); }); it(`should resolve itself promise ${pathToIt[2]} and accept a context argument`, async () => { const filename = await resolve.promise({}, pathToIt[0], pathToIt[1]); - expect(filename).toEqual(path.join(__dirname, "..", "lib", "index.js")); + assert.deepStrictEqual( + filename, + path.join(__dirname, "..", "lib", "index.js"), + ); }); it(`should resolve itself promise ${pathToIt[2]} and accept a resolveContext argument`, async () => { @@ -112,12 +139,15 @@ describe("simple", () => { resolveContext, ); - expect(filename).toEqual(path.join(__dirname, "..", "lib", "index.js")); + assert.deepStrictEqual( + filename, + path.join(__dirname, "..", "lib", "index.js"), + ); }); } it("should reject on unresolvable requests", async () => { - await expect( + await assert.rejects( new Promise( /** * @param {(value: void) => void} res resolve @@ -130,22 +160,25 @@ describe("simple", () => { }); }, ), - ).rejects.toThrow(/Can't resolve/); + /Can't resolve/, + ); }); it("should reject on unresolvable requests sync", () => { - expect(() => - resolve.sync(__dirname, "this-module-should-not-exist"), - ).toThrow(/Can't resolve/); + assert.throws( + () => resolve.sync(__dirname, "this-module-should-not-exist"), + /Can't resolve/, + ); }); it("should reject on unresolvable requests promise", async () => { - await expect( + await assert.rejects( resolve.promise(__dirname, "this-module-should-not-exist"), - ).rejects.toThrow(/Can't resolve/); + /Can't resolve/, + ); }); - it("should create a async resolver", (done) => { + it("should create a async resolver", (t, done) => { const myResolve = resolve.create({ extensions: [".js", ".json", ".node"], }); @@ -156,12 +189,15 @@ describe("simple", () => { return; } - expect(filename).toEqual(path.join(__dirname, "..", "lib", "index.js")); + assert.deepStrictEqual( + filename, + path.join(__dirname, "..", "lib", "index.js"), + ); done(); }); }); - it("should create a async resolver and accepting context", (done) => { + it("should create a async resolver and accepting context", (t, done) => { const myResolve = resolve.create({ extensions: [".js", ".json", ".node"], }); @@ -172,7 +208,10 @@ describe("simple", () => { return; } - expect(filename).toEqual(path.join(__dirname, "..", "lib", "index.js")); + assert.deepStrictEqual( + filename, + path.join(__dirname, "..", "lib", "index.js"), + ); done(); }); }); @@ -182,7 +221,7 @@ describe("simple", () => { extensions: [".js"], }); - await expect( + await assert.rejects( new Promise( /** * @param {(value: void) => void} res resolve @@ -195,7 +234,8 @@ describe("simple", () => { }); }, ), - ).rejects.toThrow(/Can't resolve/); + /Can't resolve/, + ); }); it("should create a sync resolver", () => { @@ -204,7 +244,10 @@ describe("simple", () => { }); const filename = myResolve(__dirname, "../lib/index"); - expect(filename).toEqual(path.join(__dirname, "..", "lib", "index.js")); + assert.deepStrictEqual( + filename, + path.join(__dirname, "..", "lib", "index.js"), + ); }); it("should create a sync resolver and accepting context", () => { @@ -213,14 +256,18 @@ describe("simple", () => { }); const filename = myResolve({}, __dirname, "../lib/index"); - expect(filename).toEqual(path.join(__dirname, "..", "lib", "index.js")); + assert.deepStrictEqual( + filename, + path.join(__dirname, "..", "lib", "index.js"), + ); }); it("should create a sync resolver and throw an error on unresolvable request", () => { const myResolve = resolve.create.sync({ extensions: [".js"], }); - expect(() => myResolve(__dirname, "this-module-should-not-exist")).toThrow( + assert.throws( + () => myResolve(__dirname, "this-module-should-not-exist"), /Can't resolve/, ); }); @@ -231,7 +278,10 @@ describe("simple", () => { }); const filename = await myResolve(__dirname, "../lib/index"); - expect(filename).toEqual(path.join(__dirname, "..", "lib", "index.js")); + assert.deepStrictEqual( + filename, + path.join(__dirname, "..", "lib", "index.js"), + ); }); it("should create a promise resolver and accepting context", async () => { @@ -240,19 +290,23 @@ describe("simple", () => { }); const filename = await myResolve({}, __dirname, "../lib/index"); - expect(filename).toEqual(path.join(__dirname, "..", "lib", "index.js")); + assert.deepStrictEqual( + filename, + path.join(__dirname, "..", "lib", "index.js"), + ); }); it("should create a promise resolver and return rejected promise on unresolvable request", async () => { const myResolve = resolve.create.promise({ extensions: [".js"], }); - await expect( + await assert.rejects( myResolve(__dirname, "this-module-should-not-exist"), - ).rejects.toThrow(/Can't resolve/); + /Can't resolve/, + ); }); - it("should resolve via the Resolver.resolve method", (done) => { + it("should resolve via the Resolver.resolve method", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem: new CachedInputFileSystem(fs, 4000), extensions: [".js", ".json", ".node"], @@ -264,12 +318,15 @@ describe("simple", () => { return; } - expect(filename).toEqual(path.join(__dirname, "..", "lib", "index.js")); + assert.deepStrictEqual( + filename, + path.join(__dirname, "..", "lib", "index.js"), + ); done(); }); }); - it("should resolve via the Resolver.resolve method with resolve context", (done) => { + it("should resolve via the Resolver.resolve method with resolve context", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem: new CachedInputFileSystem(fs, 4000), extensions: [".js", ".json", ".node"], @@ -281,12 +338,15 @@ describe("simple", () => { return; } - expect(filename).toEqual(path.join(__dirname, "..", "lib", "index.js")); + assert.deepStrictEqual( + filename, + path.join(__dirname, "..", "lib", "index.js"), + ); done(); }); }); - it("should resolve via the Resolver.resolve method with context", (done) => { + it("should resolve via the Resolver.resolve method with context", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem: new CachedInputFileSystem(fs, 4000), extensions: [".js", ".json", ".node"], @@ -298,12 +358,15 @@ describe("simple", () => { return; } - expect(filename).toEqual(path.join(__dirname, "..", "lib", "index.js")); + assert.deepStrictEqual( + filename, + path.join(__dirname, "..", "lib", "index.js"), + ); done(); }); }); - it("should resolve via the Resolver.resolve method with context and resolve context", (done) => { + it("should resolve via the Resolver.resolve method with context and resolve context", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem: new CachedInputFileSystem(fs, 4000), extensions: [".js", ".json", ".node"], @@ -315,7 +378,10 @@ describe("simple", () => { return; } - expect(filename).toEqual(path.join(__dirname, "..", "lib", "index.js")); + assert.deepStrictEqual( + filename, + path.join(__dirname, "..", "lib", "index.js"), + ); done(); }); }); @@ -329,7 +395,10 @@ describe("simple", () => { const filename = resolver.resolveSync(__dirname, "../lib/index"); - expect(filename).toEqual(path.join(__dirname, "..", "lib", "index.js")); + assert.deepStrictEqual( + filename, + path.join(__dirname, "..", "lib", "index.js"), + ); }); it("should resolve via the Resolver.resolveSync method with resolve context", () => { @@ -341,7 +410,10 @@ describe("simple", () => { const filename = resolver.resolveSync(__dirname, "../lib/index", {}); - expect(filename).toEqual(path.join(__dirname, "..", "lib", "index.js")); + assert.deepStrictEqual( + filename, + path.join(__dirname, "..", "lib", "index.js"), + ); }); it("should resolve via the Resolver.resolveSync method with context", () => { @@ -353,7 +425,10 @@ describe("simple", () => { const filename = resolver.resolveSync({}, __dirname, "../lib/index"); - expect(filename).toEqual(path.join(__dirname, "..", "lib", "index.js")); + assert.deepStrictEqual( + filename, + path.join(__dirname, "..", "lib", "index.js"), + ); }); it("should resolve via the Resolver.resolveSync method with context and resolve context", () => { @@ -365,7 +440,10 @@ describe("simple", () => { const filename = resolver.resolveSync({}, __dirname, "../lib/index", {}); - expect(filename).toEqual(path.join(__dirname, "..", "lib", "index.js")); + assert.deepStrictEqual( + filename, + path.join(__dirname, "..", "lib", "index.js"), + ); }); it("should resolve via the Resolver.resolvePromise method", async () => { @@ -376,7 +454,10 @@ describe("simple", () => { const filename = await resolver.resolvePromise(__dirname, "../lib/index"); - expect(filename).toEqual(path.join(__dirname, "..", "lib", "index.js")); + assert.deepStrictEqual( + filename, + path.join(__dirname, "..", "lib", "index.js"), + ); }); it("should resolve via the Resolver.resolvePromise method with resolve context", async () => { @@ -391,7 +472,10 @@ describe("simple", () => { {}, ); - expect(filename).toEqual(path.join(__dirname, "..", "lib", "index.js")); + assert.deepStrictEqual( + filename, + path.join(__dirname, "..", "lib", "index.js"), + ); }); it("should resolve via the Resolver.resolvePromise method with context", async () => { @@ -406,7 +490,10 @@ describe("simple", () => { "../lib/index", ); - expect(filename).toEqual(path.join(__dirname, "..", "lib", "index.js")); + assert.deepStrictEqual( + filename, + path.join(__dirname, "..", "lib", "index.js"), + ); }); it("should resolve via the Resolver.resolvePromise method with context and resolve context", async () => { @@ -421,7 +508,10 @@ describe("simple", () => { "../lib/index", ); - expect(filename).toEqual(path.join(__dirname, "..", "lib", "index.js")); + assert.deepStrictEqual( + filename, + path.join(__dirname, "..", "lib", "index.js"), + ); }); describe("API", () => { @@ -433,61 +523,66 @@ describe("simple", () => { it("getHook returns the wrapped hook for 'before*' names", () => { const hook = resolver.getHook("beforeResolve"); - expect(typeof hook.tapAsync).toBe("function"); + assert.strictEqual(typeof hook.tapAsync, "function"); }); it("getHook returns the wrapped hook for 'after*' names", () => { const hook = resolver.getHook("afterResolve"); - expect(typeof hook.tapAsync).toBe("function"); + assert.strictEqual(typeof hook.tapAsync, "function"); }); it("getHook throws on an unknown hook name", () => { - expect(() => resolver.getHook("doesNotExist")).toThrow( - "Hook doesNotExist doesn't exist", + assert.throws( + () => resolver.getHook("doesNotExist"), + (err) => + err instanceof Error && + err.message.includes("Hook doesNotExist doesn't exist"), ); }); it("getHook returns the given hook instance as-is", () => { const hook = resolver.hooks.resolve; - expect(resolver.getHook(hook)).toBe(hook); + assert.strictEqual(resolver.getHook(hook), hook); }); it("ensureHook creates a hook when it does not exist", () => { const hook = resolver.ensureHook("customCreatedHook"); - expect(typeof hook.tapAsync).toBe("function"); + assert.strictEqual(typeof hook.tapAsync, "function"); // Calling again should return the same hook. const hook2 = resolver.ensureHook("customCreatedHook"); - expect(hook2).toBe(hook); + assert.strictEqual(hook2, hook); }); it("ensureHook wraps 'before*' and 'after*' names", () => { - expect(typeof resolver.ensureHook("beforeAnotherHook").tapAsync).toBe( + assert.strictEqual( + typeof resolver.ensureHook("beforeAnotherHook").tapAsync, "function", ); - expect(typeof resolver.ensureHook("afterAnotherHook").tapAsync).toBe( + assert.strictEqual( + typeof resolver.ensureHook("afterAnotherHook").tapAsync, "function", ); }); it("isModule recognizes module paths", () => { - expect(resolver.isModule("foo")).toBe(true); - expect(resolver.isModule("./foo")).toBe(false); - expect(resolver.isModule("/foo")).toBe(false); + assert.strictEqual(resolver.isModule("foo"), true); + assert.strictEqual(resolver.isModule("./foo"), false); + assert.strictEqual(resolver.isModule("/foo"), false); }); it("isPrivate recognizes internal paths", () => { - expect(resolver.isPrivate("#foo")).toBe(true); - expect(resolver.isPrivate("./foo")).toBe(false); + assert.strictEqual(resolver.isPrivate("#foo"), true); + assert.strictEqual(resolver.isPrivate("./foo"), false); }); it("isDirectory recognizes paths ending in /", () => { - expect(resolver.isDirectory("/foo/")).toBe(true); - expect(resolver.isDirectory("/foo")).toBe(false); + assert.strictEqual(resolver.isDirectory("/foo/"), true); + assert.strictEqual(resolver.isDirectory("/foo"), false); }); it("join and normalize delegate to util/path", () => { - expect(resolver.join("/a", "b")).toBe("/a/b"); - expect(resolver.normalize("/a/./b")).toBe("/a/b"); + assert.strictEqual(resolver.join("/a", "b"), "/a/b"); + assert.strictEqual(resolver.normalize("/a/./b"), "/a/b"); }); it("throws when resolveSync is used on a non-synchronous filesystem", () => { @@ -495,28 +590,33 @@ describe("simple", () => { fileSystem: nodeFileSystem, extensions: [".js"], }); - expect(() => asyncResolver.resolveSync({}, fixtures, "./a")).toThrow( - "Cannot 'resolveSync' because the fileSystem is not sync. Use 'resolve'!", + assert.throws( + () => asyncResolver.resolveSync({}, fixtures, "./a"), + (err) => + err instanceof Error && + err.message.includes( + "Cannot 'resolveSync' because the fileSystem is not sync. Use 'resolve'!", + ), ); }); - it("resolves when context is omitted", (done) => { + it("resolves when context is omitted", (t, done) => { resolver.resolve(fixtures, "./a", (err, result) => { if (err) return done(err); - expect(typeof result).toBe("string"); + assert.strictEqual(typeof result, "string"); done(); }); }); - it("resolves when context is omitted (with resolveContext)", (done) => { + it("resolves when context is omitted (with resolveContext)", (t, done) => { resolver.resolve(fixtures, "./a", {}, (err, result) => { if (err) return done(err); - expect(typeof result).toBe("string"); + assert.strictEqual(typeof result, "string"); done(); }); }); - it("reports an error when the path argument is not a string", (done) => { + it("reports an error when the path argument is not a string", (t, done) => { resolver.resolve( {}, // @ts-expect-error for tests @@ -524,16 +624,14 @@ describe("simple", () => { "./a", {}, (err) => { - expect(err).toBeInstanceOf(Error); - expect(/** @type {Error} */ (err).message).toMatch( - "path argument is not a string", - ); + assert.ok(err instanceof Error); + assert.ok(err.message.includes("path argument is not a string")); done(); }, ); }); - it("reports an error when the request argument is not a string", (done) => { + it("reports an error when the request argument is not a string", (t, done) => { resolver.resolve( {}, fixtures, @@ -541,24 +639,22 @@ describe("simple", () => { null, {}, (err) => { - expect(err).toBeInstanceOf(Error); - expect(/** @type {Error} */ (err).message).toMatch( - "request argument is not a string", - ); + assert.ok(err instanceof Error); + assert.ok(err.message.includes("request argument is not a string")); done(); }, ); }); - it("resolves when resolveContext is omitted", (done) => { + it("resolves when resolveContext is omitted", (t, done) => { resolver.resolve({}, fixtures, "./a", (err, result) => { if (err) return done(err); - expect(typeof result).toBe("string"); + assert.strictEqual(typeof result, "string"); done(); }); }); - it("resolves when resolveContext is null", (done) => { + it("resolves when resolveContext is null", (t, done) => { resolver.resolve( {}, fixtures, @@ -567,20 +663,25 @@ describe("simple", () => { null, (err, result) => { if (err) return done(err); - expect(typeof result).toBe("string"); + assert.strictEqual(typeof result, "string"); done(); }, ); }); it("throws when callback is not a function", () => { - expect(() => { - // @ts-expect-error for tests - resolver.resolve({}, fixtures, "./a", {}); - }).toThrow("callback argument is not a function"); + assert.throws( + () => { + // @ts-expect-error for tests + resolver.resolve({}, fixtures, "./a", {}); + }, + (err) => + err instanceof Error && + err.message.includes("callback argument is not a function"), + ); }); - it("invokes the noResolve hook on resolution failure", (done) => { + it("invokes the noResolve hook on resolution failure", (t, done) => { const customResolver = ResolverFactory.createResolver({ fileSystem: nodeFileSystem, extensions: [".js"], @@ -590,24 +691,25 @@ describe("simple", () => { failed.push({ request, err }); }); customResolver.resolve({}, fixtures, "./does-not-exist", {}, (err) => { - expect(err).toBeTruthy(); - expect(failed).toHaveLength(1); - expect(failed[0].err).toBe(err); + assert.ok(err); + assert.strictEqual(failed.length, 1); + assert.strictEqual(failed[0].err, err); done(); }); }); - it("populates error.details when a resolve fails", (done) => { + it("populates error.details when a resolve fails", (t, done) => { resolver.resolve({}, fixtures, "./does-not-exist", {}, (err) => { - expect(err).toBeInstanceOf(Error); - expect( + assert.ok(err instanceof Error); + assert.notStrictEqual( /** @type {Error & { details?: string }} */ (err).details, - ).toBeDefined(); + undefined, + ); done(); }); }); - it("populates error.details when a resolve fails and log is present", (done) => { + it("populates error.details when a resolve fails and log is present", (t, done) => { const log = []; resolver.resolve( {}, @@ -615,11 +717,12 @@ describe("simple", () => { "./does-not-exist", { log: (m) => log.push(m) }, (err) => { - expect(err).toBeInstanceOf(Error); - expect( + assert.ok(err instanceof Error); + assert.notStrictEqual( /** @type {Error & { details?: string }} */ (err).details, - ).toBeDefined(); - expect(log.length).toBeGreaterThan(0); + undefined, + ); + assert.ok(log.length > 0); done(); }, ); diff --git a/test/smoke/browser-entry.cjs b/test/smoke/browser-entry.cjs index 0154f10b..8cbddc71 100644 --- a/test/smoke/browser-entry.cjs +++ b/test/smoke/browser-entry.cjs @@ -45,35 +45,35 @@ function createMemoryAsyncFs(fileMap) { }); /** - * @param {string} p path + * @param {string} pth path * @param {string} code error code * @returns {Error} an errno error */ - const fsError = (p, code) => { - const err = /** @type {NodeJS.ErrnoException} */ (new Error(`${code}: ${p}`)); + const fsError = (pth, code) => { + const err = /** @type {NodeJS.ErrnoException} */ (new Error(`${code}: ${pth}`)); err.code = code; - err.path = p; + err.path = pth; return err; }; - const statImpl = (p) => { - if (files.has(p)) return makeStats(true); - if (dirs.has(p)) return makeStats(false); - throw fsError(p, "ENOENT"); + const statImpl = (pth) => { + if (files.has(pth)) return makeStats(true); + if (dirs.has(pth)) return makeStats(false); + throw fsError(pth, "ENOENT"); }; - const readFileImpl = (p) => { - if (!files.has(p)) throw fsError(p, "ENOENT"); + const readFileImpl = (pth) => { + if (!files.has(pth)) throw fsError(pth, "ENOENT"); // Return Uint8Array (not a Node Buffer) to mirror a browser FS and // exercise the runtime-agnostic decode path in lib/util/fs.js. - return new TextEncoder().encode(/** @type {string} */ (files.get(p))); + return new TextEncoder().encode(/** @type {string} */ (files.get(pth))); }; - const readdirImpl = (p) => { - const prefix = p === "/" ? "/" : `${p}/`; + const readdirImpl = (pth) => { + const prefix = pth === "/" ? "/" : `${pth}/`; const names = new Set(); for (const entry of [...files.keys(), ...dirs]) { - if (entry.startsWith(prefix) && entry !== p) { + if (entry.startsWith(prefix) && entry !== pth) { const [seg] = entry.slice(prefix.length).split("/"); if (seg) names.add(seg); } @@ -81,9 +81,9 @@ function createMemoryAsyncFs(fileMap) { return [...names]; }; - const readlinkImpl = (p) => { + const readlinkImpl = (pth) => { // Nothing is a symlink in this FS. - throw fsError(p, "EINVAL"); + throw fsError(pth, "EINVAL"); }; // Wrap a synchronous implementation as an async, callback-style fs method @@ -110,7 +110,7 @@ function createMemoryAsyncFs(fileMap) { readFile: toAsync(readFileImpl), readdir: toAsync(readdirImpl), readlink: toAsync(readlinkImpl), - realpath: toAsync((p) => p), + realpath: toAsync((pth) => pth), }; } diff --git a/test/smoke/browser-playwright.cjs b/test/smoke/browser-playwright.cjs index 647f9c11..e26cd065 100644 --- a/test/smoke/browser-playwright.cjs +++ b/test/smoke/browser-playwright.cjs @@ -46,6 +46,11 @@ function bundle() { }); } +/** + * Bundle the entry, drive it in a headless Chromium page and surface the + * sandbox result through this process's exit code. + * @returns {Promise} resolves on success, rejects on smoke failure + */ async function main() { const code = await bundle(); diff --git a/test/smoke/browser-run.cjs b/test/smoke/browser-run.cjs index 458eb786..cce344d2 100644 --- a/test/smoke/browser-run.cjs +++ b/test/smoke/browser-run.cjs @@ -53,6 +53,11 @@ function bundle() { }); } +/** + * Bundle the entry, execute it in the web-globals VM sandbox and surface + * the sandbox result through this process's exit code. + * @returns {Promise} resolves on success, rejects on smoke failure + */ async function main() { const code = await bundle(); diff --git a/test/strip-json-comments.test.js b/test/strip-json-comments.test.js index 12098510..8e7857fd 100644 --- a/test/strip-json-comments.test.js +++ b/test/strip-json-comments.test.js @@ -1,80 +1,82 @@ "use strict"; -/* eslint-disable jsdoc/reject-any-type */ - +const assert = require("assert"); const stripJsonComments = require("../lib/util/strip-json-comments"); +const { describe, it } = require("./_runner"); + +/* eslint-disable jsdoc/reject-any-type */ describe("util/strip-json-comments", () => { it("throws when given a non-string", () => { - expect(() => stripJsonComments(/** @type {any} */ (42))).toThrow(TypeError); + assert.throws(() => stripJsonComments(/** @type {any} */ (42)), TypeError); }); it("removes single-line comments (default: replace with whitespace)", () => { const input = '{"a": 1} // comment'; const result = stripJsonComments(input); - expect(result).toHaveLength(input.length); - expect(result.trim()).toBe('{"a": 1}'); + assert.strictEqual(result.length, input.length); + assert.strictEqual(result.trim(), '{"a": 1}'); }); it("removes single-line comments without whitespace when whitespace:false", () => { const result = stripJsonComments('{"a": 1} // comment', { whitespace: false, }); - expect(result).toBe('{"a": 1} '); + assert.strictEqual(result, '{"a": 1} '); }); it("handles single-line comments terminated by \\r\\n", () => { const result = stripJsonComments('{"a": 1} // c\r\n"b"'); - expect(result).toBe('{"a": 1} \r\n"b"'); + assert.strictEqual(result, '{"a": 1} \r\n"b"'); }); it("handles single-line comments terminated by \\n", () => { const input = '{"a": 1} // c\n"b"'; const result = stripJsonComments(input); - expect(result).toHaveLength(input.length); - expect(result).toContain("\n"); - expect(result).toContain('"b"'); + assert.strictEqual(result.length, input.length); + assert.ok(result.includes("\n")); + assert.ok(result.includes('"b"')); }); it("removes multi-line comments", () => { const input = '{"a": 1} /* a\nb */ "c"'; const result = stripJsonComments(input); - expect(result).toHaveLength(input.length); - expect(result).toContain('"c"'); - expect(result).not.toMatch("/*"); + assert.strictEqual(result.length, input.length); + assert.ok(result.includes('"c"')); + assert.ok(!result.includes("/*")); }); it("does not remove comments inside strings", () => { const result = stripJsonComments('{"a": "// not a comment"}'); - expect(result).toBe('{"a": "// not a comment"}'); + assert.strictEqual(result, '{"a": "// not a comment"}'); }); it("treats escaped quotes correctly", () => { const result = stripJsonComments('{"a": "x\\"//y"} // c'); - expect(result).toBe('{"a": "x\\"//y"} '); + assert.strictEqual(result, '{"a": "x\\"//y"} '); }); it("strips trailing commas when trailingCommas:true", () => { const result = stripJsonComments('{"a": 1,}', { trailingCommas: true }); - expect(result).toBe('{"a": 1 }'); + assert.strictEqual(result, '{"a": 1 }'); }); it("keeps non-trailing commas when trailingCommas:true", () => { const result = stripJsonComments('{"a": 1, "b": 2}', { trailingCommas: true, }); - expect(result).toBe('{"a": 1, "b": 2}'); + assert.strictEqual(result, '{"a": 1, "b": 2}'); }); it("strips trailing commas before ]", () => { const result = stripJsonComments("[1, 2, 3,]", { trailingCommas: true }); - expect(result).toBe("[1, 2, 3 ]"); + assert.strictEqual(result, "[1, 2, 3 ]"); }); it("handles an unterminated multiline comment at end of input", () => { const result = stripJsonComments('{"a": 1} /* unterminated'); // Multiline comments without closing */ are not stripped - expect(result).toBe('{"a": 1} /* unterminated'); + assert.strictEqual(result, '{"a": 1} /* unterminated'); }); it("parses valid JSONC into valid JSON", () => { @@ -84,7 +86,7 @@ describe("util/strip-json-comments", () => { trailingCommas: true, whitespace: true, }); - expect(() => JSON.parse(cleaned)).not.toThrow(); - expect(JSON.parse(cleaned)).toEqual({ a: 1, b: [1, 2] }); + assert.doesNotThrow(() => JSON.parse(cleaned)); + assert.deepStrictEqual(JSON.parse(cleaned), { a: 1, b: [1, 2] }); }); }); diff --git a/test/symlink.test.js b/test/symlink.test.js index cba9a7ae..3a4c6fb2 100644 --- a/test/symlink.test.js +++ b/test/symlink.test.js @@ -1,9 +1,12 @@ "use strict"; +const assert = require("assert"); const fs = require("fs"); + const { platform } = require("os"); const path = require("path"); const resolve = require("../"); +const { afterEach, beforeEach, describe, it } = require("./_runner"); const tempPath = path.join(__dirname, "temp"); @@ -210,19 +213,23 @@ describe("symlink", () => { "with symlinked directory in context path and symlinked directory (chained)", ], ]) { - it(`should resolve symlink to itself ${pathToIt[2]}`, (done) => { + it(`should resolve symlink to itself ${pathToIt[2]}`, (t, done) => { resolve(pathToIt[0], pathToIt[1], (err, filename) => { if (err) return done(err); - expect(filename).toBeDefined(); - expect(typeof filename).toBe("string"); - expect(filename).toEqual( + assert.notStrictEqual(filename, undefined); + assert.strictEqual(typeof filename, "string"); + assert.deepStrictEqual( + filename, path.join(__dirname, "..", "lib", "index.js"), ); resolveWithoutSymlinks(pathToIt[0], pathToIt[1], (err, filename) => { if (err) return done(err); - expect(typeof filename).toBe("string"); - expect(filename).toEqual(path.resolve(pathToIt[0], pathToIt[1])); + assert.strictEqual(typeof filename, "string"); + assert.deepStrictEqual( + filename, + path.resolve(pathToIt[0], pathToIt[1]), + ); done(); }); }); @@ -230,18 +237,23 @@ describe("symlink", () => { it(`should resolve symlink to itself sync ${pathToIt[2]}`, () => { let filename = resolve.sync(pathToIt[0], pathToIt[1]); - expect(filename).toBeDefined(); - expect(typeof filename).toBe("string"); - expect(filename).toEqual(path.join(__dirname, "..", "lib", "index.js")); + assert.notStrictEqual(filename, undefined); + assert.strictEqual(typeof filename, "string"); + assert.deepStrictEqual( + filename, + path.join(__dirname, "..", "lib", "index.js"), + ); filename = resolveSyncWithoutSymlinks(pathToIt[0], pathToIt[1]); - expect(typeof filename).toBe("string"); - expect(filename).toEqual(path.resolve(pathToIt[0], pathToIt[1])); + assert.strictEqual(typeof filename, "string"); + assert.deepStrictEqual( + filename, + path.resolve(pathToIt[0], pathToIt[1]), + ); }); } } else { - // eslint-disable-next-line jest/expect-expect it("cannot test symlinks because we have no permission to create them", () => { // Nothing }); diff --git a/test/tsconfig-paths.test.js b/test/tsconfig-paths.test.js index 29eeb1d8..47726732 100644 --- a/test/tsconfig-paths.test.js +++ b/test/tsconfig-paths.test.js @@ -1,10 +1,13 @@ "use strict"; +const assert = require("assert"); const fs = require("fs"); + const path = require("path"); const { ResolverFactory } = require("../"); const CachedInputFileSystem = require("../lib/CachedInputFileSystem"); +const { describe, it } = require("./_runner"); const fileSystem = new CachedInputFileSystem(fs, 4000); @@ -52,7 +55,7 @@ const extendsUnscopedPkgDir = path.resolve( ); describe("TsconfigPathsPlugin", () => { - it("resolves exact mapped path '@components/*' via tsconfig option (example)", (done) => { + it("resolves exact mapped path '@components/*' via tsconfig option (example)", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx"], @@ -70,7 +73,8 @@ describe("TsconfigPathsPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(baseExampleDir, "src", "components", "button.ts"), ); done(); @@ -78,7 +82,7 @@ describe("TsconfigPathsPlugin", () => { ); }); - it("when multiple patterns match a module specifier, the pattern with the longest matching prefix before any * token is used:", (done) => { + it("when multiple patterns match a module specifier, the pattern with the longest matching prefix before any * token is used:", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx"], @@ -90,13 +94,15 @@ describe("TsconfigPathsPlugin", () => { resolver.resolve({}, baseExampleDir, "longest/bar", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(baseExampleDir, "src", "mapped", "longest", "three.ts"), ); resolver.resolve({}, baseExampleDir, "longest/bar", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(baseExampleDir, "src", "mapped", "longest", "three.ts"), ); done(); @@ -104,7 +110,7 @@ describe("TsconfigPathsPlugin", () => { }); }); - it("resolves exact mapped path 'foo' via tsconfig option (example)", (done) => { + it("resolves exact mapped path 'foo' via tsconfig option (example)", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx"], @@ -117,14 +123,15 @@ describe("TsconfigPathsPlugin", () => { resolver.resolve({}, baseExampleDir, "foo", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(baseExampleDir, "src", "mapped", "foo", "index.ts"), ); done(); }); }); - it("resolves wildcard mapped path 'bar/*' via tsconfig option (example)", (done) => { + it("resolves wildcard mapped path 'bar/*' via tsconfig option (example)", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx"], @@ -137,14 +144,15 @@ describe("TsconfigPathsPlugin", () => { resolver.resolve({}, baseExampleDir, "bar/file1", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(baseExampleDir, "src", "mapped", "bar", "file1.ts"), ); done(); }); }); - it("resolves wildcard mapped path '*/old-file' to specific file via tsconfig option (example)", (done) => { + it("resolves wildcard mapped path '*/old-file' to specific file via tsconfig option (example)", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx"], @@ -162,7 +170,8 @@ describe("TsconfigPathsPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(baseExampleDir, "src", "components", "new-file.ts"), ); done(); @@ -170,7 +179,7 @@ describe("TsconfigPathsPlugin", () => { ); }); - it("falls through when no mapping exists (example)", (done) => { + it("falls through when no mapping exists (example)", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx"], @@ -186,8 +195,8 @@ describe("TsconfigPathsPlugin", () => { "does-not-exist", {}, (err, result) => { - expect(err).toBeInstanceOf(Error); - expect(result).toBeUndefined(); + assert.ok(err instanceof Error); + assert.strictEqual(result, undefined); done(); }, ); @@ -203,15 +212,17 @@ describe("TsconfigPathsPlugin", () => { useSyncFileSystemCalls: true, }); - expect(resolver.resolveSync({}, baseExampleDir, "@components/button")).toBe( + assert.strictEqual( + resolver.resolveSync({}, baseExampleDir, "@components/button"), path.join(baseExampleDir, "src", "components", "button.ts"), ); - expect(resolver.resolveSync({}, baseExampleDir, "bar/file1")).toBe( + assert.strictEqual( + resolver.resolveSync({}, baseExampleDir, "bar/file1"), path.join(baseExampleDir, "src", "mapped", "bar", "file1.ts"), ); - expect(() => { + assert.throws(() => { resolver.resolveSync({}, baseExampleDir, "does-not-exist"); - }).toThrow(/Can't resolve 'does-not-exist'/); + }, /Can't resolve 'does-not-exist'/); }); it("resolveSync surfaces missing-tsconfig errors instead of fileSystem-not-sync", () => { @@ -221,12 +232,12 @@ describe("TsconfigPathsPlugin", () => { useSyncFileSystemCalls: true, }); - expect(() => { + assert.throws(() => { resolver.resolveSync(process.cwd(), "test"); - }).toThrow(/Can't resolve 'test'/); + }, /Can't resolve 'test'/); }); - it("resolves '@components/*' using extends from extendsExampleDir project", (done) => { + it("resolves '@components/*' using extends from extendsExampleDir project", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx"], @@ -242,7 +253,8 @@ describe("TsconfigPathsPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(extendsExampleDir, "src", "components", "button.ts"), ); done(); @@ -250,7 +262,7 @@ describe("TsconfigPathsPlugin", () => { ); }); - it("resolves '@utils/*' using extends from extendsExampleDir project", (done) => { + it("resolves '@utils/*' using extends from extendsExampleDir project", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx"], @@ -267,7 +279,8 @@ describe("TsconfigPathsPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(extendsExampleDir, "src", "utils", "date.ts"), ); done(); @@ -276,7 +289,7 @@ describe("TsconfigPathsPlugin", () => { }); describe("Path wildcard patterns", () => { - it("resolves 'foo/*' wildcard pattern", (done) => { + it("resolves 'foo/*' wildcard pattern", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx"], @@ -288,14 +301,15 @@ describe("TsconfigPathsPlugin", () => { resolver.resolve({}, baseExampleDir, "foo/file1", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result for foo")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(baseExampleDir, "src", "mapped", "bar", "file1.ts"), ); done(); }); }); - it("resolves '*' catch-all pattern to src/mapped/star/*", (done) => { + it("resolves '*' catch-all pattern to src/mapped/star/*", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx"], @@ -313,7 +327,8 @@ describe("TsconfigPathsPlugin", () => { (err, resultStar) => { if (err) return done(err); if (!resultStar) return done(new Error("No result for star/*")); - expect(resultStar).toEqual( + assert.deepStrictEqual( + resultStar, path.join( baseExampleDir, "src", @@ -328,7 +343,7 @@ describe("TsconfigPathsPlugin", () => { ); }); - it("resolves package with mainFields", (done) => { + it("resolves package with mainFields", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx"], @@ -348,7 +363,8 @@ describe("TsconfigPathsPlugin", () => { if (!result) { return done(new Error("No result for main-field-package")); } - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join( baseExampleDir, "src", @@ -363,7 +379,7 @@ describe("TsconfigPathsPlugin", () => { ); }); - it("resolves package with browser field", (done) => { + it("resolves package with browser field", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx"], @@ -383,7 +399,8 @@ describe("TsconfigPathsPlugin", () => { if (!result) { return done(new Error("No result for browser-field-package")); } - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join( baseExampleDir, "src", @@ -398,7 +415,7 @@ describe("TsconfigPathsPlugin", () => { ); }); - it("resolves package with default index.ts", (done) => { + it("resolves package with default index.ts", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx"], @@ -418,7 +435,8 @@ describe("TsconfigPathsPlugin", () => { if (!result) { return done(new Error("No result for no-main-field-package")); } - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join( baseExampleDir, "src", @@ -434,7 +452,7 @@ describe("TsconfigPathsPlugin", () => { }); }); - it("should resolve paths when extending from npm package (node_modules)", (done) => { + it("should resolve paths when extending from npm package (node_modules)", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx"], @@ -453,13 +471,13 @@ describe("TsconfigPathsPlugin", () => { if (err) return done(err); if (!result) return done(new Error("No result")); // Should resolve to utils or components based on the paths in react/tsconfig.json - expect(result).toMatch(/src[\\/](utils|components)[\\/]button\.ts$/); + assert.match(result, /src[\\/](utils|components)[\\/]button\.ts$/); done(); }, ); }); - it("should handle malformed tsconfig.json gracefully", (done) => { + it("should handle malformed tsconfig.json gracefully", (t, done) => { const malformedExampleDir = path.resolve( __dirname, "fixtures", @@ -482,8 +500,8 @@ describe("TsconfigPathsPlugin", () => { "@components/button", {}, (err, result) => { - expect(err).toBeInstanceOf(Error); - expect(result).toBeUndefined(); + assert.ok(err instanceof Error); + assert.strictEqual(result, undefined); done(); }, ); @@ -492,7 +510,7 @@ describe("TsconfigPathsPlugin", () => { // eslint-disable-next-line no-template-curly-in-string describe("${configDir} template variable support", () => { // eslint-disable-next-line no-template-curly-in-string - it("should substitute ${configDir} in path mappings", (done) => { + it("should substitute ${configDir} in path mappings", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx"], @@ -510,7 +528,8 @@ describe("TsconfigPathsPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(baseExampleDir, "src", "components", "button.ts"), ); done(); @@ -519,7 +538,7 @@ describe("TsconfigPathsPlugin", () => { }); // eslint-disable-next-line no-template-curly-in-string - it("should substitute ${configDir} in multiple path patterns", (done) => { + it("should substitute ${configDir} in multiple path patterns", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx"], @@ -532,7 +551,8 @@ describe("TsconfigPathsPlugin", () => { resolver.resolve({}, baseExampleDir, "@utils/date", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(baseExampleDir, "src", "utils", "date.ts"), ); @@ -540,7 +560,8 @@ describe("TsconfigPathsPlugin", () => { resolver.resolve({}, baseExampleDir, "foo", {}, (err2, result2) => { if (err2) return done(err2); if (!result2) return done(new Error("No result for foo")); - expect(result2).toEqual( + assert.deepStrictEqual( + result2, path.join(baseExampleDir, "src", "mapped", "foo", "index.ts"), ); done(); @@ -549,7 +570,7 @@ describe("TsconfigPathsPlugin", () => { }); // eslint-disable-next-line no-template-curly-in-string - it("should substitute ${configDir} in referenced projects", (done) => { + it("should substitute ${configDir} in referenced projects", (t, done) => { const appDir = path.join(referencesProjectDir, "packages", "app"); const resolver = ResolverFactory.createResolver({ fileSystem, @@ -566,13 +587,13 @@ describe("TsconfigPathsPlugin", () => { resolver.resolve({}, appDir, "@app/index", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.join(appDir, "src", "index.ts")); + assert.deepStrictEqual(result, path.join(appDir, "src", "index.ts")); done(); }); }); // eslint-disable-next-line no-template-curly-in-string - it("should substitute ${configDir} in extends field", (done) => { + it("should substitute ${configDir} in extends field", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx"], @@ -590,7 +611,8 @@ describe("TsconfigPathsPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(extendsExampleDir, "src", "components", "button.ts"), ); done(); @@ -598,7 +620,7 @@ describe("TsconfigPathsPlugin", () => { ); }); - it("should handle circular extends without hanging", (done) => { + it("should handle circular extends without hanging", (t, done) => { const aDir = path.join(extendsCircularDir, "a"); const resolver = ResolverFactory.createResolver({ fileSystem, @@ -612,13 +634,13 @@ describe("TsconfigPathsPlugin", () => { resolver.resolve({}, aDir, "@lib/foo", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.join(aDir, "src", "lib", "foo.ts")); + assert.deepStrictEqual(result, path.join(aDir, "src", "lib", "foo.ts")); done(); }); }); // eslint-disable-next-line no-template-curly-in-string - it("should substitute ${configDir} in references field", (done) => { + it("should substitute ${configDir} in references field", (t, done) => { const sharedDir = path.join(referencesProjectDir, "packages", "shared"); const resolver = ResolverFactory.createResolver({ fileSystem, @@ -635,7 +657,8 @@ describe("TsconfigPathsPlugin", () => { resolver.resolve({}, sharedDir, "@shared/helper", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(sharedDir, "src", "utils", "helper.ts"), ); done(); @@ -643,7 +666,7 @@ describe("TsconfigPathsPlugin", () => { }); }); - it("should override baseUrl from tsconfig with option", (done) => { + it("should override baseUrl from tsconfig with option", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx"], @@ -663,7 +686,8 @@ describe("TsconfigPathsPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(baseExampleDir, "src", "utils", "date.ts"), ); done(); @@ -671,7 +695,7 @@ describe("TsconfigPathsPlugin", () => { ); }); - it("should use baseUrl from tsconfig when not overridden", (done) => { + it("should use baseUrl from tsconfig when not overridden", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx"], @@ -692,7 +716,8 @@ describe("TsconfigPathsPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(baseExampleDir, "src", "utils", "date.ts"), ); done(); @@ -701,7 +726,7 @@ describe("TsconfigPathsPlugin", () => { }); describe("TypeScript Project References", () => { - it("should support tsconfig object format with configFile", (done) => { + it("should support tsconfig object format with configFile", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx"], @@ -721,7 +746,8 @@ describe("TsconfigPathsPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(baseExampleDir, "src", "components", "button.ts"), ); done(); @@ -729,7 +755,7 @@ describe("TsconfigPathsPlugin", () => { ); }); - it("should resolve own paths (without cross-project references)", (done) => { + it("should resolve own paths (without cross-project references)", (t, done) => { const appDir = path.join(referencesProjectDir, "packages", "app"); const resolver = ResolverFactory.createResolver({ fileSystem, @@ -746,17 +772,17 @@ describe("TsconfigPathsPlugin", () => { resolver.resolve({}, appDir, "@app/index", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.join(appDir, "src", "index.ts")); + assert.deepStrictEqual(result, path.join(appDir, "src", "index.ts")); // @shared/* from app context should fail (not in app's paths) resolver.resolve({}, appDir, "@shared/utils/helper", {}, (err2) => { - expect(err2).toBeInstanceOf(Error); + assert.ok(err2 instanceof Error); done(); }); }); }); - it("should resolve self-references within a referenced project", (done) => { + it("should resolve self-references within a referenced project", (t, done) => { const appDir = path.join(referencesProjectDir, "packages", "app"); const sharedDir = path.join(referencesProjectDir, "packages", "shared"); @@ -775,14 +801,15 @@ describe("TsconfigPathsPlugin", () => { resolver.resolve({}, sharedDir, "@shared/helper", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(sharedDir, "src", "utils", "helper.ts"), ); done(); }); }); - it("should support explicit references array", (done) => { + it("should support explicit references array", (t, done) => { const appDir = path.join(referencesProjectDir, "packages", "app"); const sharedSrcDir = path.join( referencesProjectDir, @@ -811,13 +838,16 @@ describe("TsconfigPathsPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.join(sharedSrcDir, "utils", "helper.ts")); + assert.deepStrictEqual( + result, + path.join(sharedSrcDir, "utils", "helper.ts"), + ); done(); }, ); }); - it("should not load references when references option is omitted", (done) => { + it("should not load references when references option is omitted", (t, done) => { const appDir = path.join(referencesProjectDir, "packages", "app"); const resolver = ResolverFactory.createResolver({ fileSystem, @@ -832,12 +862,12 @@ describe("TsconfigPathsPlugin", () => { // @shared/* should fail because references are not loaded resolver.resolve({}, appDir, "@shared/utils/helper", {}, (err) => { - expect(err).toBeInstanceOf(Error); + assert.ok(err instanceof Error); done(); }); }); - it("should handle nested references (when a referenced project has its own references)", (done) => { + it("should handle nested references (when a referenced project has its own references)", (t, done) => { const appDir = path.join(referencesProjectDir, "packages", "app"); const utilsSrcDir = path.join( referencesProjectDir, @@ -862,13 +892,16 @@ describe("TsconfigPathsPlugin", () => { resolver.resolve({}, utilsSrcDir, "@utils/date", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.join(utilsSrcDir, "core", "date.ts")); + assert.deepStrictEqual( + result, + path.join(utilsSrcDir, "core", "date.ts"), + ); done(); }); }); describe("modules resolution with references", () => { - it("should resolve modules from main project's baseUrl", (done) => { + it("should resolve modules from main project's baseUrl", (t, done) => { const appDir = path.join(referencesProjectDir, "packages", "app"); const resolver = ResolverFactory.createResolver({ fileSystem, @@ -890,7 +923,8 @@ describe("TsconfigPathsPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(appDir, "src", "components", "Button.ts"), ); done(); @@ -898,7 +932,7 @@ describe("TsconfigPathsPlugin", () => { ); }); - it("should resolve modules from referenced project's baseUrl (self-reference)", (done) => { + it("should resolve modules from referenced project's baseUrl (self-reference)", (t, done) => { const appDir = path.join(referencesProjectDir, "packages", "app"); const sharedSrcDir = path.join( referencesProjectDir, @@ -927,7 +961,8 @@ describe("TsconfigPathsPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(sharedSrcDir, "utils", "helper.ts"), ); done(); @@ -935,7 +970,7 @@ describe("TsconfigPathsPlugin", () => { ); }); - it("should resolve components from referenced project's baseUrl", (done) => { + it("should resolve components from referenced project's baseUrl", (t, done) => { const appDir = path.join(referencesProjectDir, "packages", "app"); const sharedSrcDir = path.join( referencesProjectDir, @@ -964,7 +999,8 @@ describe("TsconfigPathsPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(sharedSrcDir, "components", "Input.ts"), ); done(); @@ -972,7 +1008,7 @@ describe("TsconfigPathsPlugin", () => { ); }); - it("should use correct baseUrl based on request context", (done) => { + it("should use correct baseUrl based on request context", (t, done) => { const appDir = path.join(referencesProjectDir, "packages", "app"); const sharedDir = path.join(referencesProjectDir, "packages", "shared"); @@ -991,7 +1027,7 @@ describe("TsconfigPathsPlugin", () => { resolver.resolve({}, appDir, "src/index", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result from app")); - expect(result).toEqual(path.join(appDir, "src", "index.ts")); + assert.deepStrictEqual(result, path.join(appDir, "src", "index.ts")); // From shared context, 'utils/helper' should resolve to shared/src/utils/helper resolver.resolve( @@ -1002,7 +1038,8 @@ describe("TsconfigPathsPlugin", () => { (err2, result2) => { if (err2) return done(err2); if (!result2) return done(new Error("No result from shared")); - expect(result2).toEqual( + assert.deepStrictEqual( + result2, path.join(sharedDir, "src", "utils", "helper.ts"), ); done(); @@ -1011,7 +1048,7 @@ describe("TsconfigPathsPlugin", () => { }); }); - it("should support explicit references with modules resolution", (done) => { + it("should support explicit references with modules resolution", (t, done) => { const appDir = path.join(referencesProjectDir, "packages", "app"); const sharedSrcDir = path.join( referencesProjectDir, @@ -1040,7 +1077,8 @@ describe("TsconfigPathsPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(sharedSrcDir, "utils", "helper.ts"), ); done(); @@ -1067,7 +1105,7 @@ describe("TsconfigPathsPlugin", () => { ); const refDir = path.join(referencesPriorityDir, "ref"); - it("resolves @lib/foo from the main context to main's target", (done) => { + it("resolves @lib/foo from the main context to main's target", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx"], @@ -1087,7 +1125,8 @@ describe("TsconfigPathsPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(referencesPriorityDir, "main-lib", "foo.ts"), ); done(); @@ -1095,7 +1134,7 @@ describe("TsconfigPathsPlugin", () => { ); }); - it("resolves @lib/foo from the reference context to the reference's target", (done) => { + it("resolves @lib/foo from the reference context to the reference's target", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx"], @@ -1110,12 +1149,15 @@ describe("TsconfigPathsPlugin", () => { resolver.resolve({}, refDir, "@lib/foo", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.join(refDir, "ref-lib", "foo.ts")); + assert.deepStrictEqual( + result, + path.join(refDir, "ref-lib", "foo.ts"), + ); done(); }); }); - it("reference paths do not leak into a sibling/unrelated main lookup", (done) => { + it("reference paths do not leak into a sibling/unrelated main lookup", (t, done) => { // When references are loaded but the request is made from the // main context, the reference's alias target must not win over // the main's target — even if the reference's target also exists. @@ -1137,7 +1179,10 @@ describe("TsconfigPathsPlugin", () => { {}, (err, result) => { if (err) return done(err); - expect(result).not.toEqual(path.join(refDir, "ref-lib", "foo.ts")); + assert.notDeepStrictEqual( + result, + path.join(refDir, "ref-lib", "foo.ts"), + ); done(); }, ); @@ -1153,7 +1198,7 @@ describe("TsconfigPathsPlugin", () => { "extends-deep-baseurl", ); - it("should resolve paths whose baseUrl comes from a grandparent extends in a non-sibling directory", (done) => { + it("should resolve paths whose baseUrl comes from a grandparent extends in a non-sibling directory", (t, done) => { const appDir = path.join(deepBaseUrlDir, "packages", "app"); const resolver = ResolverFactory.createResolver({ fileSystem, @@ -1166,7 +1211,8 @@ describe("TsconfigPathsPlugin", () => { resolver.resolve({}, appDir, "@base/utils/format", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join( deepBaseUrlDir, "tsconfig-base", @@ -1188,7 +1234,7 @@ describe("TsconfigPathsPlugin", () => { "extends-pkg-entry", ); - it("should resolve paths inherited from a scoped npm package tsconfig (extends '@my-tsconfig/base')", (done) => { + it("should resolve paths inherited from a scoped npm package tsconfig (extends '@my-tsconfig/base')", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx"], @@ -1200,7 +1246,8 @@ describe("TsconfigPathsPlugin", () => { resolver.resolve({}, pkgEntryDir, "@pkg/util", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join( pkgEntryDir, "node_modules", @@ -1215,7 +1262,7 @@ describe("TsconfigPathsPlugin", () => { }); }); - it("should not error when tsconfig is true but tsconfig.json does not exist", (done) => { + it("should not error when tsconfig is true but tsconfig.json does not exist", (t, done) => { const noTsconfigDir = path.resolve( __dirname, "fixtures", @@ -1235,12 +1282,15 @@ describe("TsconfigPathsPlugin", () => { resolver.resolve({}, noTsconfigDir, "./src/index", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.join(noTsconfigDir, "src", "index.ts")); + assert.deepStrictEqual( + result, + path.join(noTsconfigDir, "src", "index.ts"), + ); done(); }); }); - it("should error when tsconfig is an explicit path but the file does not exist", (done) => { + it("should error when tsconfig is an explicit path but the file does not exist", (t, done) => { const noTsconfigDir = path.resolve( __dirname, "fixtures", @@ -1258,9 +1308,12 @@ describe("TsconfigPathsPlugin", () => { resolver.resolve({}, noTsconfigDir, "./src/index", {}, (err, result) => { try { - expect(err).toBeTruthy(); - expect(/** @type {NodeJS.ErrnoException} */ (err).code).toBe("ENOENT"); - expect(result).toBeUndefined(); + assert.ok(err); + assert.strictEqual( + /** @type {NodeJS.ErrnoException} */ (err).code, + "ENOENT", + ); + assert.strictEqual(result, undefined); done(); } catch (err_) { done(err_); @@ -1276,7 +1329,7 @@ describe("TsconfigPathsPlugin", () => { "upward-traversal", ); - it("should find tsconfig.json in parent directory when resolving from subdirectory", (done) => { + it("should find tsconfig.json in parent directory when resolving from subdirectory", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx"], @@ -1294,7 +1347,8 @@ describe("TsconfigPathsPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(upwardDir, "src", "utils", "helper.ts"), ); done(); @@ -1302,7 +1356,7 @@ describe("TsconfigPathsPlugin", () => { ); }); - it("should still fall through when no tsconfig.json exists anywhere up", (done) => { + it("should still fall through when no tsconfig.json exists anywhere up", (t, done) => { const noTsconfigDir = path.resolve( __dirname, "fixtures", @@ -1321,7 +1375,10 @@ describe("TsconfigPathsPlugin", () => { resolver.resolve({}, noTsconfigDir, "./src/index", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.join(noTsconfigDir, "src", "index.ts")); + assert.deepStrictEqual( + result, + path.join(noTsconfigDir, "src", "index.ts"), + ); done(); }); }); @@ -1335,7 +1392,7 @@ describe("TsconfigPathsPlugin", () => { "no-baseurl-upward", ); - it("should resolve node_modules package instead of matching a file at tsconfig root", (done) => { + it("should resolve node_modules package instead of matching a file at tsconfig root", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".js", ".json"], @@ -1357,7 +1414,8 @@ describe("TsconfigPathsPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join( noBaseUrlDir, "subdir", @@ -1380,7 +1438,7 @@ describe("TsconfigPathsPlugin", () => { "jsonc-comments", ); - it("should parse tsconfig.json with line comments (//)", (done) => { + it("should parse tsconfig.json with line comments (//)", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx"], @@ -1398,7 +1456,8 @@ describe("TsconfigPathsPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(jsoncExampleDir, "src", "components", "button.ts"), ); done(); @@ -1406,7 +1465,7 @@ describe("TsconfigPathsPlugin", () => { ); }); - it("should parse tsconfig.json with block comments (/* */)", (done) => { + it("should parse tsconfig.json with block comments (/* */)", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx"], @@ -1419,14 +1478,15 @@ describe("TsconfigPathsPlugin", () => { resolver.resolve({}, jsoncExampleDir, "bar/index", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(jsoncExampleDir, "src", "mapped", "bar", "index.ts"), ); done(); }); }); - it("should parse tsconfig.json with mixed comments", (done) => { + it("should parse tsconfig.json with mixed comments", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx"], @@ -1439,7 +1499,8 @@ describe("TsconfigPathsPlugin", () => { resolver.resolve({}, jsoncExampleDir, "foo", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(jsoncExampleDir, "src", "mapped", "foo", "index.ts"), ); done(); @@ -1448,7 +1509,7 @@ describe("TsconfigPathsPlugin", () => { }); describe("bug: circular project references should not cause infinite recursion", () => { - it("should handle circular references without hanging or crashing", (done) => { + it("should handle circular references without hanging or crashing", (t, done) => { const aDir = path.join(referencesCircularDir, "a"); const resolver = ResolverFactory.createResolver({ fileSystem, @@ -1465,12 +1526,12 @@ describe("TsconfigPathsPlugin", () => { resolver.resolve({}, aDir, "@a/index", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.join(aDir, "src", "index.ts")); + assert.deepStrictEqual(result, path.join(aDir, "src", "index.ts")); done(); }); }); - it("should resolve paths from a circular-referenced project", (done) => { + it("should resolve paths from a circular-referenced project", (t, done) => { const aDir = path.join(referencesCircularDir, "a"); const bDir = path.join(referencesCircularDir, "b"); const resolver = ResolverFactory.createResolver({ @@ -1488,7 +1549,7 @@ describe("TsconfigPathsPlugin", () => { resolver.resolve({}, bDir, "@b/index", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual(path.join(bDir, "src", "index.ts")); + assert.deepStrictEqual(result, path.join(bDir, "src", "index.ts")); done(); }); }); @@ -1502,7 +1563,7 @@ describe("TsconfigPathsPlugin", () => { "scoped-pkg-fallthrough", ); - it("should resolve '@helper' via the '@*' mapping when the mapped path exists", (done) => { + it("should resolve '@helper' via the '@*' mapping when the mapped path exists", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx", ".js"], @@ -1514,14 +1575,15 @@ describe("TsconfigPathsPlugin", () => { resolver.resolve({}, scopedPkgDir, "@helper", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join(scopedPkgDir, "src", "helper", "index.ts"), ); done(); }); }); - it("should fall through to node_modules for '@sentry/react' when '@*' mapping does not resolve", (done) => { + it("should fall through to node_modules for '@sentry/react' when '@*' mapping does not resolve", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx", ".js"], @@ -1533,7 +1595,8 @@ describe("TsconfigPathsPlugin", () => { resolver.resolve({}, scopedPkgDir, "@sentry/react", {}, (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join( scopedPkgDir, "node_modules", @@ -1548,7 +1611,7 @@ describe("TsconfigPathsPlugin", () => { }); describe("bug: unscoped npm package in extends field", () => { - it("should resolve paths inherited from an unscoped npm package tsconfig (extends 'my-base-config')", (done) => { + it("should resolve paths inherited from an unscoped npm package tsconfig (extends 'my-base-config')", (t, done) => { const resolver = ResolverFactory.createResolver({ fileSystem, extensions: [".ts", ".tsx"], @@ -1565,7 +1628,8 @@ describe("TsconfigPathsPlugin", () => { (err, result) => { if (err) return done(err); if (!result) return done(new Error("No result")); - expect(result).toEqual( + assert.deepStrictEqual( + result, path.join( extendsUnscopedPkgDir, "node_modules", diff --git a/test/uint8array-fs.test.js b/test/uint8array-fs.test.js index d0de5c68..65c45fea 100644 --- a/test/uint8array-fs.test.js +++ b/test/uint8array-fs.test.js @@ -1,6 +1,8 @@ "use strict"; +const assert = require("assert"); const ResolverFactory = require("../lib/ResolverFactory"); +const { describe, it } = require("./_runner"); // Regression test: a file system that returns Uint8Array (as a browser/Deno FS // would) instead of a Node Buffer must still have its package.json description @@ -40,19 +42,19 @@ describe("Uint8Array file system", () => { isSocket: () => false, }); - const enoent = (p) => { + const enoent = (pth) => { const err = /** @type {NodeJS.ErrnoException} */ ( - new Error(`ENOENT: ${p}`) + new Error(`ENOENT: ${pth}`) ); err.code = "ENOENT"; return err; }; const statSync = (arg) => { - const p = String(arg); - if (files.has(p)) return stat(true); - if (dirs.has(p)) return stat(false); - throw enoent(p); + const pth = String(arg); + if (files.has(pth)) return stat(true); + if (dirs.has(pth)) return stat(false); + throw enoent(pth); }; const fileSystem = { @@ -67,9 +69,9 @@ describe("Uint8Array file system", () => { readdirSync: () => [], // The crux of the test: return a Uint8Array, never a Node Buffer. readFileSync: (arg) => { - const p = String(arg); - if (!files.has(p)) throw enoent(p); - return new TextEncoder().encode(files.get(p)); + const pth = String(arg); + if (!files.has(pth)) throw enoent(pth); + return new TextEncoder().encode(files.get(pth)); }, }; @@ -82,13 +84,15 @@ describe("Uint8Array file system", () => { }); it("resolves a package main field read from a Uint8Array package.json", () => { - expect(resolver.resolveSync({}, "/app", "pkg")).toBe( + assert.strictEqual( + resolver.resolveSync({}, "/app", "pkg"), "/app/node_modules/pkg/lib/main.js", ); }); it("resolves an exports subpath read from a Uint8Array package.json", () => { - expect(resolver.resolveSync({}, "/app", "pkg/feature")).toBe( + assert.strictEqual( + resolver.resolveSync({}, "/app", "pkg/feature"), "/app/node_modules/pkg/lib/feature.js", ); }); diff --git a/test/unsafe-cache.test.js b/test/unsafe-cache.test.js index 63d6e421..295d9c39 100644 --- a/test/unsafe-cache.test.js +++ b/test/unsafe-cache.test.js @@ -1,7 +1,10 @@ "use strict"; +const assert = require("assert"); + const path = require("path"); const resolve = require("../"); +const { beforeEach, describe, it } = require("./_runner"); describe("unsafe-cache", () => { let cache; @@ -75,13 +78,13 @@ describe("unsafe-cache", () => { }); }); - it("should cache request", (done) => { + it("should cache request", (t, done) => { cachedResolve( path.join(__dirname, "fixtures"), "m2/b", (err, _result) => { if (err) return done(err); - expect(Object.keys(cache)).toHaveLength(1); + assert.strictEqual(Object.keys(cache).length, 1); for (const key of Object.keys(cache)) { cache[key] = { path: "yep", @@ -92,7 +95,7 @@ describe("unsafe-cache", () => { "m2/b", (err, result) => { if (err) return done(err); - expect(result).toBe("yep"); + assert.strictEqual(result, "yep"); done(); }, ); @@ -100,14 +103,14 @@ describe("unsafe-cache", () => { ); }); - it("should not return from cache if context does not match", (done) => { + it("should not return from cache if context does not match", (t, done) => { cachedResolve( context, path.join(__dirname, "fixtures"), "m2/b", (err, _result) => { if (err) return done(err); - expect(Object.keys(cache)).toHaveLength(1); + assert.strictEqual(Object.keys(cache).length, 1); for (const key of Object.keys(cache)) { cache[key] = { path: "yep", @@ -119,7 +122,7 @@ describe("unsafe-cache", () => { "m2/b", (err, result) => { if (err) return done(err); - expect(result).not.toBe("yep"); + assert.notStrictEqual(result, "yep"); done(); }, ); @@ -127,13 +130,13 @@ describe("unsafe-cache", () => { ); }); - it("should not return from cache if query does not match", (done) => { + it("should not return from cache if query does not match", (t, done) => { cachedResolve( path.join(__dirname, "fixtures"), "m2/b?query", (err, _result) => { if (err) return done(err); - expect(Object.keys(cache)).toHaveLength(1); + assert.strictEqual(Object.keys(cache).length, 1); for (const key of Object.keys(cache)) { cache[key] = { path: "yep", @@ -144,7 +147,7 @@ describe("unsafe-cache", () => { "m2/b?query2", (err, result) => { if (err) return done(err); - expect(result).not.toBe("yep"); + assert.notStrictEqual(result, "yep"); done(); }, ); @@ -162,14 +165,14 @@ describe("unsafe-cache", () => { }); }); - it("should cache request", (done) => { + it("should cache request", (t, done) => { cachedResolve( context, path.join(__dirname, "fixtures"), "m2/b", (err, _result) => { if (err) return done(err); - expect(Object.keys(cache)).toHaveLength(1); + assert.strictEqual(Object.keys(cache).length, 1); for (const key of Object.keys(cache)) { cache[key] = { path: "yep", @@ -181,7 +184,7 @@ describe("unsafe-cache", () => { "m2/b", (err, result) => { if (err) return done(err); - expect(result).toBe("yep"); + assert.strictEqual(result, "yep"); done(); }, ); @@ -189,14 +192,14 @@ describe("unsafe-cache", () => { ); }); - it("should return from cache even if context does not match", (done) => { + it("should return from cache even if context does not match", (t, done) => { cachedResolve( context, path.join(__dirname, "fixtures"), "m2/b", (err, _result) => { if (err) return done(err); - expect(Object.keys(cache)).toHaveLength(1); + assert.strictEqual(Object.keys(cache).length, 1); for (const key of Object.keys(cache)) { cache[key] = { path: "yep", @@ -208,7 +211,7 @@ describe("unsafe-cache", () => { "m2/b", (err, result) => { if (err) return done(err); - expect(result).toBe("yep"); + assert.strictEqual(result, "yep"); done(); }, ); @@ -226,33 +229,55 @@ describe("unsafe-cache", () => { }); it("should keep bare specifier cache keys tied to the lookup directory", () => { - expect(cachedResolve(deepContext, "react")).toBe(rootReactTarget); + assert.strictEqual(cachedResolve(deepContext, "react"), rootReactTarget); poisonCache("cache-hit"); - expect(cachedResolve(shallowContext, "react")).toBe(rootReactTarget); + assert.strictEqual( + cachedResolve(shallowContext, "react"), + rootReactTarget, + ); }); it("should reuse cached results for relative requests inside one package", () => { - expect(cachedResolve(deepContext, "../../shared")).toBe(rootSharedTarget); + assert.strictEqual( + cachedResolve(deepContext, "../../shared"), + rootSharedTarget, + ); poisonCache("cache-hit"); - expect(cachedResolve(shallowContext, "../shared")).toBe("cache-hit"); + assert.strictEqual( + cachedResolve(shallowContext, "../shared"), + "cache-hit", + ); }); it("should not reuse cached results across package boundaries", () => { - expect(cachedResolve(deepContext, "react")).toBe(rootReactTarget); + assert.strictEqual(cachedResolve(deepContext, "react"), rootReactTarget); poisonCache("cache-hit"); - expect(cachedResolve(nestedContext, "react")).toBe(nestedReactTarget); + assert.strictEqual( + cachedResolve(nestedContext, "react"), + nestedReactTarget, + ); }); it("should not reuse cached bare specifiers when a nested node_modules shadows the package root", () => { - expect(cachedResolve(shallowContext, "react")).toBe(rootReactTarget); + assert.strictEqual( + cachedResolve(shallowContext, "react"), + rootReactTarget, + ); poisonCache("cache-hit"); - expect(cachedResolve(shadowedContext, "react")).toBe(shadowedReactTarget); + assert.strictEqual( + cachedResolve(shadowedContext, "react"), + shadowedReactTarget, + ); }); it("should keep relative requests distinct from bare specifiers", () => { - expect(cachedResolve(deepContext, "../../shared")).toBe(rootSharedTarget); + assert.strictEqual( + cachedResolve(deepContext, "../../shared"), + rootSharedTarget, + ); poisonCache("cache-hit"); - expect(cachedResolve(shallowContext, "shared")).toBe( + assert.strictEqual( + cachedResolve(shallowContext, "shared"), rootSharedPackageTarget, ); }); @@ -261,7 +286,7 @@ describe("unsafe-cache", () => { describe("unsafe-cache more tests", () => { const fixtures = path.join(__dirname, "fixtures"); - it("passes through without caching when cachePredicate returns false", (done) => { + it("passes through without caching when cachePredicate returns false", (t, done) => { const cache = {}; const cachedResolve = resolve.create({ // @ts-expect-error for tests @@ -270,13 +295,13 @@ describe("unsafe-cache", () => { }); cachedResolve(fixtures, "./a.js", (err, result) => { if (err) return done(err); - expect(result).toEqual(path.join(fixtures, "a.js")); - expect(Object.keys(cache)).toHaveLength(0); + assert.deepStrictEqual(result, path.join(fixtures, "a.js")); + assert.strictEqual(Object.keys(cache).length, 0); done(); }); }); - it("returns a poisoned cache entry on a re-resolve (non-array branch)", (done) => { + it("returns a poisoned cache entry on a re-resolve (non-array branch)", (t, done) => { const cache = {}; const cachedResolve = resolve.create({ // @ts-expect-error for tests @@ -289,7 +314,7 @@ describe("unsafe-cache", () => { } cachedResolve(fixtures, "./a.js", (err2, result) => { if (err2) return done(err2); - expect(result).toBe("poisoned"); + assert.strictEqual(result, "poisoned"); done(); }); }); diff --git a/test/util-fs.test.js b/test/util-fs.test.js index 63ff34a7..d886a03f 100644 --- a/test/util-fs.test.js +++ b/test/util-fs.test.js @@ -1,11 +1,14 @@ "use strict"; +const assert = require("assert"); +const { decodeText, readJson } = require("../lib/util/fs"); +const { describe, it } = require("./_runner"); + /* eslint-disable jsdoc/reject-any-type */ // `readJson` is the JSONC loader used internally by TsconfigPathsPlugin. // The plugin always passes stripComments:true, so the readJson-fast path // and other branches have no integration callers and are tested directly. -const { decodeText, readJson } = require("../lib/util/fs"); /** * @param {any} fileSystem file system @@ -34,7 +37,7 @@ describe("util/fs readJson", () => { }, }); const result = await readJsonPromise(fileSystem, "/a/package.json"); - expect(result).toEqual(content); + assert.deepStrictEqual(result, content); }); it("rejects if readJson yields an error", async () => { @@ -46,9 +49,10 @@ describe("util/fs readJson", () => { callback(null, Buffer.from("{}")); }, }); - await expect( + await assert.rejects( readJsonPromise(fileSystem, "/a/package.json"), - ).rejects.toThrow("boom"); + (err) => err instanceof Error && err.message.includes("boom"), + ); }); it("falls back to readFile when stripComments is true", async () => { @@ -66,7 +70,7 @@ describe("util/fs readJson", () => { const result = await readJsonPromise(fileSystem, "/a/tsconfig.json", { stripComments: true, }); - expect(result).toEqual({ a: 1, b: [1, 2] }); + assert.deepStrictEqual(result, { a: 1, b: [1, 2] }); }); it("falls back to readFile when readJson is unavailable", async () => { @@ -76,7 +80,7 @@ describe("util/fs readJson", () => { }, }); const result = await readJsonPromise(fileSystem, "/a/package.json"); - expect(result).toEqual({ hello: "world" }); + assert.deepStrictEqual(result, { hello: "world" }); }); it("decodes a Uint8Array (non-Node file system) result", async () => { @@ -86,7 +90,7 @@ describe("util/fs readJson", () => { }, }); const result = await readJsonPromise(fileSystem, "/a/package.json"); - expect(result).toEqual({ hello: "world" }); + assert.deepStrictEqual(result, { hello: "world" }); }); it("decodes a Uint8Array result when stripping comments", async () => { @@ -103,7 +107,7 @@ describe("util/fs readJson", () => { const result = await readJsonPromise(fileSystem, "/a/tsconfig.json", { stripComments: true, }); - expect(result).toEqual({ a: 1, b: [1, 2] }); + assert.deepStrictEqual(result, { a: 1, b: [1, 2] }); }); it("rejects when readFile errors", async () => { @@ -112,9 +116,10 @@ describe("util/fs readJson", () => { callback(new Error("read-fail")); }, }); - await expect( + await assert.rejects( readJsonPromise(fileSystem, "/a/package.json"), - ).rejects.toThrow("read-fail"); + (err) => err instanceof Error && err.message.includes("read-fail"), + ); }); it("invokes the callback synchronously when the file system is synchronous", () => { @@ -135,8 +140,8 @@ describe("util/fs readJson", () => { sync = true; }, ); - expect(sync).toBe(true); - expect(result).toEqual({ sync: true }); + assert.strictEqual(sync, true); + assert.deepStrictEqual(result, { sync: true }); }); // Regression: a file system may return a string from readFile (more likely @@ -151,7 +156,7 @@ describe("util/fs readJson", () => { const result = await readJsonPromise(fileSystem, "/a/tsconfig.json", { stripComments: true, }); - expect(result).toEqual({ a: 1, b: [1, 2] }); + assert.deepStrictEqual(result, { a: 1, b: [1, 2] }); }); it("parses string content without stripComments", async () => { @@ -161,7 +166,7 @@ describe("util/fs readJson", () => { }, }); const result = await readJsonPromise(fileSystem, "/a/package.json"); - expect(result).toEqual({ hello: "world" }); + assert.deepStrictEqual(result, { hello: "world" }); }); it("serves repeated stripComments reads of the same buffer from cache", async () => { @@ -179,32 +184,35 @@ describe("util/fs readJson", () => { const b = await readJsonPromise(fileSystem, "/a/tsconfig.json", { stripComments: true, }); - expect(a).toEqual({ cached: true }); - expect(b).toBe(a); // same cached object instance for the same buffer - expect(reads).toBe(2); + assert.deepStrictEqual(a, { cached: true }); + assert.strictEqual(b, a); // same cached object instance for the same buffer + assert.strictEqual(reads, 2); }); }); describe("util/fs decodeText", () => { it("returns a string unchanged", () => { - expect(decodeText("日本語")).toBe("日本語"); + assert.strictEqual(decodeText("日本語"), "日本語"); }); it("decodes a Node Buffer as utf-8", () => { - expect(decodeText(Buffer.from("日本語", "utf8"))).toBe("日本語"); + assert.strictEqual(decodeText(Buffer.from("日本語", "utf8")), "日本語"); }); it("decodes a Uint8Array as utf-8", () => { - expect(decodeText(new TextEncoder().encode("日本語"))).toBe("日本語"); + assert.strictEqual( + decodeText(new TextEncoder().encode("日本語")), + "日本語", + ); }); it("decodes an empty Uint8Array to an empty string", () => { - expect(decodeText(new Uint8Array(0))).toBe(""); + assert.strictEqual(decodeText(new Uint8Array(0)), ""); }); it("decodes multi-byte characters across the buffer", () => { const text = "中文 — emoji 😀 — π"; - expect(decodeText(new TextEncoder().encode(text))).toBe(text); + assert.strictEqual(decodeText(new TextEncoder().encode(text)), text); }); it("keeps a leading BOM identically for Buffer and Uint8Array", () => { @@ -212,7 +220,7 @@ describe("util/fs decodeText", () => { const fromBuffer = decodeText(Buffer.from(text, "utf8")); const fromU8 = decodeText(new TextEncoder().encode(text)); // Both keep the BOM (matching Buffer.toString), so the two paths agree. - expect(fromBuffer).toBe(text); - expect(fromU8).toBe(fromBuffer); + assert.strictEqual(fromBuffer, text); + assert.strictEqual(fromU8, fromBuffer); }); }); diff --git a/test/yield.test.js b/test/yield.test.js index bb3e46cb..3d327604 100644 --- a/test/yield.test.js +++ b/test/yield.test.js @@ -1,10 +1,13 @@ "use strict"; +const assert = require("assert"); const fs = require("fs"); + const path = require("path"); const { ResolverFactory } = require("../"); const CachedInputFileSystem = require("../lib/CachedInputFileSystem"); +const { describe, it } = require("./_runner"); /** @typedef {import("../lib/Resolver").ResolveRequest} ResolveRequest */ /** @typedef {import("../lib/Resolver").ResolveContext} ResolveContext */ @@ -46,7 +49,7 @@ describe("should resolve all aliases", () => { fileSystem: nodeFileSystem, }); - it("should yield all b files", (done) => { + it("should yield all b files", (t, done) => { const paths = []; const yield_ = ({ path }) => paths.push(path); const fileDependencies = new Set(); @@ -61,10 +64,13 @@ describe("should resolve all aliases", () => { }; resolver.resolve({}, fixtures, "index/b", context, (err, result) => { - expect(err).toBeNull(); - expect(result).toBeUndefined(); - expect(paths).toEqual(makeFixturePaths(["/a/foo/b", "/a/foo-2/b"])); - expect(contextifyDependencies(fileDependencies)).toEqual([ + assert.strictEqual(err, null); + assert.strictEqual(result, undefined); + assert.deepStrictEqual( + paths, + makeFixturePaths(["/a/foo/b", "/a/foo-2/b"]), + ); + assert.deepStrictEqual(contextifyDependencies(fileDependencies), [ "", "/a", "/a/foo", @@ -72,7 +78,7 @@ describe("should resolve all aliases", () => { "/a/foo-2/b", "/a/foo/b", ]); - expect(contextifyDependencies(missingDependencies)).toEqual([ + assert.deepStrictEqual(contextifyDependencies(missingDependencies), [ "/a/foo-2/b", "/a/foo-2/b.js", "/a/foo-2/package.json", @@ -82,12 +88,12 @@ describe("should resolve all aliases", () => { "/a/package.json", "/package.json", ]); - expect([...contextDependencies].sort()).toEqual([]); + assert.deepStrictEqual([...contextDependencies].sort(), []); done(); }); }); - it("should yield all foo files", (done) => { + it("should yield all foo files", (t, done) => { const paths = []; const yield_ = ({ path }) => paths.push(path); const fileDependencies = new Set(); @@ -102,10 +108,10 @@ describe("should resolve all aliases", () => { }; modulesResolver.resolve({}, fixtures, "foo/a", context, (err, result) => { - expect(err).toBeNull(); - expect(result).toBeUndefined(); - expect(paths).toEqual(makeFixturePaths(["/a/foo/a", "/b/foo/a"])); - expect(contextifyDependencies(fileDependencies)).toEqual([ + assert.strictEqual(err, null); + assert.strictEqual(result, undefined); + assert.deepStrictEqual(paths, makeFixturePaths(["/a/foo/a", "/b/foo/a"])); + assert.deepStrictEqual(contextifyDependencies(fileDependencies), [ "", "/a", "/a/foo", @@ -114,7 +120,7 @@ describe("should resolve all aliases", () => { "/b/foo", "/b/foo/a", ]); - expect(contextifyDependencies(missingDependencies)).toEqual([ + assert.deepStrictEqual(contextifyDependencies(missingDependencies), [ "/a/foo/a", "/a/foo/a.js", "/a/foo/package.json", @@ -125,12 +131,12 @@ describe("should resolve all aliases", () => { "/b/package.json", "/package.json", ]); - expect([...contextDependencies].sort()).toEqual([]); + assert.deepStrictEqual([...contextDependencies].sort(), []); done(); }); }); - it("should yield c file", (done) => { + it("should yield c file", (t, done) => { const paths = []; const yield_ = ({ path }) => paths.push(path); /** @type {ResolveContext} */ @@ -139,14 +145,14 @@ describe("should resolve all aliases", () => { }; resolver.resolve({}, fixtures, "index/c", context, (err, result) => { - expect(err).toBeNull(); - expect(result).toBeUndefined(); - expect(paths).toEqual(makeFixturePaths(["/a/foo-2/c"])); + assert.strictEqual(err, null); + assert.strictEqual(result, undefined); + assert.deepStrictEqual(paths, makeFixturePaths(["/a/foo-2/c"])); done(); }); }); - it("should resolve false alias", (done) => { + it("should resolve false alias", (t, done) => { const paths = []; const yield_ = ({ path }) => paths.push(path); const fileDependencies = new Set(); @@ -161,20 +167,20 @@ describe("should resolve all aliases", () => { }; resolver.resolve({}, fixtures, "foo", context, (err, result) => { - expect(err).toBeNull(); - expect(result).toBeUndefined(); - expect(paths).toEqual([false]); - expect(contextifyDependencies(fileDependencies)).toEqual([]); - expect(contextifyDependencies(missingDependencies)).toEqual([ + assert.strictEqual(err, null); + assert.strictEqual(result, undefined); + assert.deepStrictEqual(paths, [false]); + assert.deepStrictEqual(contextifyDependencies(fileDependencies), []); + assert.deepStrictEqual(contextifyDependencies(missingDependencies), [ "/node_modules", "/package.json", ]); - expect([...contextDependencies].sort()).toEqual([]); + assert.deepStrictEqual([...contextDependencies].sort(), []); done(); }); }); - it("should return error if no resolve", (done) => { + it("should return error if no resolve", (t, done) => { const paths = []; const yield_ = ({ path }) => paths.push(path); const fileDependencies = new Set(); @@ -189,12 +195,12 @@ describe("should resolve all aliases", () => { }; resolver.resolve({}, fixtures, "index/unknown", context, (err, result) => { - expect(err).not.toBeNull(); - expect(err).toBeDefined(); - expect(result).toBeUndefined(); - expect(paths).toEqual([]); - expect(contextifyDependencies(fileDependencies)).toEqual([]); - expect(contextifyDependencies(missingDependencies)).toEqual([ + assert.notStrictEqual(err, null); + assert.notStrictEqual(err, undefined); + assert.strictEqual(result, undefined); + assert.deepStrictEqual(paths, []); + assert.deepStrictEqual(contextifyDependencies(fileDependencies), []); + assert.deepStrictEqual(contextifyDependencies(missingDependencies), [ "/a/foo-2/package.json", "/a/foo-2/unknown", "/a/foo-2/unknown.js", @@ -204,13 +210,13 @@ describe("should resolve all aliases", () => { "/a/package.json", "/package.json", ]); - expect([...contextDependencies].sort()).toEqual([]); + assert.deepStrictEqual([...contextDependencies].sort(), []); done(); }); }); describe("resolve alias field", () => { - it("should handle false in alias field", (done) => { + it("should handle false in alias field", (t, done) => { const resolver = ResolverFactory.createResolver({ extensions: [".js"], alias: { @@ -239,21 +245,21 @@ describe("should resolve all aliases", () => { resolver.resolve({}, fixtures, "index/a", context, (err, result) => { calls++; - expect(calls).toBe(1); - expect(err).toBeNull(); - expect(result).toBeUndefined(); - expect(paths).toEqual([false]); - expect(contextifyDependencies(fileDependencies)).toEqual([ + assert.strictEqual(calls, 1); + assert.strictEqual(err, null); + assert.strictEqual(result, undefined); + assert.deepStrictEqual(paths, [false]); + assert.deepStrictEqual(contextifyDependencies(fileDependencies), [ "/c/foo/package.json", ]); - expect(contextifyDependencies(missingDependencies)).toEqual([ + assert.deepStrictEqual(contextifyDependencies(missingDependencies), [ "/c/foo/a", "/c/foo/a.js", "/package.json", ]); - expect([...contextDependencies].sort()).toEqual([]); + assert.deepStrictEqual([...contextDependencies].sort(), []); - expect(beatifyLogs(logs)).toEqual([ + assert.deepStrictEqual(beatifyLogs(logs), [ "resolve 'index/a' in 'fixtures'", " Parsed request is a module", " using description file (relative path: ./test/fixtures/yield)", @@ -349,18 +355,18 @@ describe("should resolve all aliases", () => { resolver.resolve({}, fixtures, "index/a", context, (err, result) => { calls++; - expect(calls).toBe(1); - expect(err).toBeNull(); - expect(result).toBeUndefined(); - expect(paths).toEqual(makeFixturePaths(expectedResult)); - expect(contextifyDependencies(fileDependencies)).toEqual([ + assert.strictEqual(calls, 1); + assert.strictEqual(err, null); + assert.strictEqual(result, undefined); + assert.deepStrictEqual(paths, makeFixturePaths(expectedResult)); + assert.deepStrictEqual(contextifyDependencies(fileDependencies), [ "", "/a", "/a/foo", "/a/foo/a", "/c/foo/package.json", ]); - expect(contextifyDependencies(missingDependencies)).toEqual([ + assert.deepStrictEqual(contextifyDependencies(missingDependencies), [ "/a/foo/a", "/a/foo/a.js", "/a/foo/package.json", @@ -369,15 +375,14 @@ describe("should resolve all aliases", () => { "/c/foo/a.js", "/package.json", ]); - expect([...contextDependencies].sort()).toEqual([]); - expect(beatifyLogs(logs)).toEqual(expectedLogs); + assert.deepStrictEqual([...contextDependencies].sort(), []); + assert.deepStrictEqual(beatifyLogs(logs), expectedLogs); done(); }); } - // eslint-disable-next-line jest/expect-expect - it("default order", (done) => { + it("default order", (t, done) => { resolver = createResolver(["/c/foo", "/a/foo"]); run( done, @@ -392,8 +397,7 @@ describe("should resolve all aliases", () => { ); }); - // eslint-disable-next-line jest/expect-expect - it("reverse order", (done) => { + it("reverse order", (t, done) => { resolver = createResolver(["/a/foo", "/c/foo"]); run( done, @@ -417,7 +421,7 @@ describe("should resolve all aliases", () => { fileSystem: nodeFileSystem, }); - it("should correctly handle resolve in callback", (done) => { + it("should correctly handle resolve in callback", (t, done) => { const getResult = (request) => ({ ...request, path: "/a" }); const resolver = createResolver({ apply(resolver) { @@ -437,14 +441,14 @@ describe("should resolve all aliases", () => { }; resolver.resolve({}, fixtures, "unknown", context, (err, result) => { if (err) done(err); - expect(err).toBeNull(); - expect(result).toBeUndefined(); - expect(paths).toEqual(["/a"]); + assert.strictEqual(err, null); + assert.strictEqual(result, undefined); + assert.deepStrictEqual(paths, ["/a"]); done(); }); }); - it("should correctly handle error in callback", (done) => { + it("should correctly handle error in callback", (t, done) => { const resolver = createResolver({ apply(resolver) { resolver @@ -460,10 +464,10 @@ describe("should resolve all aliases", () => { }; resolver.resolve({}, fixtures, "unknown", context, (err, result) => { if (!err) return done(new Error("error expected")); - expect(err).not.toBeNull(); - expect(err.message).toBe("error"); - expect(result).toBeUndefined(); - expect(paths).toEqual([]); + assert.notStrictEqual(err, null); + assert.strictEqual(err.message, "error"); + assert.strictEqual(result, undefined); + assert.deepStrictEqual(paths, []); done(); }); }); @@ -471,7 +475,7 @@ describe("should resolve all aliases", () => { describe("unsafe cache", () => { // same case as in "should yield all b files" - it("should return result from cache", (done) => { + it("should return result from cache", (t, done) => { const cache = /** @type {Cache} */ ({}); const resolver = ResolverFactory.createResolver({ extensions: [".js"], @@ -496,13 +500,14 @@ describe("should resolve all aliases", () => { "index/b", { yield: (obj) => paths.push(obj.path) }, (err, result) => { - expect(err).toBeNull(); - expect(result).toBeUndefined(); - expect(paths).toEqual( + assert.strictEqual(err, null); + assert.strictEqual(result, undefined); + assert.deepStrictEqual( + paths, makeFixturePaths(["/a/foo/b", "/a/foo-2/b"]), ); // original + 2 aliases - expect(Object.keys(cache)).toHaveLength(3); + assert.strictEqual(Object.keys(cache).length, 3); const cacheId = /** @type {string} */ @@ -517,12 +522,13 @@ describe("should resolve all aliases", () => { return request === "index/b"; }) ); - expect(cacheId).toBeDefined(); - expect(Array.isArray(cache[cacheId])).toBe(true); - expect( + assert.notStrictEqual(cacheId, undefined); + assert.strictEqual(Array.isArray(cache[cacheId]), true); + assert.deepStrictEqual( /** @type {ResolveRequest[]} */ - (cache[cacheId]).map((o) => o.path), - ).toEqual(makeFixturePaths(["/a/foo/b", "/a/foo-2/b"])); + (cache[cacheId]).map((req) => req.path), + makeFixturePaths(["/a/foo/b", "/a/foo-2/b"]), + ); done(); }, ); @@ -531,7 +537,7 @@ describe("should resolve all aliases", () => { }); // same as "should handle false in alias field" - it("should return ignore result from cache", (done) => { + it("should return ignore result from cache", (t, done) => { const cache = /** @type {Cache} */ ({}); const resolver = ResolverFactory.createResolver({ extensions: [".js"], @@ -551,20 +557,21 @@ describe("should resolve all aliases", () => { "foo", { yield: (obj) => paths.push(obj.path) }, (err, result) => { - expect(err).toBeNull(); - expect(result).toBeUndefined(); - expect(paths).toEqual([false]); + assert.strictEqual(err, null); + assert.strictEqual(result, undefined); + assert.deepStrictEqual(paths, [false]); // original + 0 aliases - expect(Object.keys(cache)).toHaveLength(1); + assert.strictEqual(Object.keys(cache).length, 1); const [cacheId] = Object.keys(cache); - expect(cacheId).toBeDefined(); - expect(Array.isArray(cache[cacheId])).toBe(true); - expect( + assert.notStrictEqual(cacheId, undefined); + assert.strictEqual(Array.isArray(cache[cacheId]), true); + assert.deepStrictEqual( /** @type {ResolveRequest[]} */ - (cache[cacheId]).map((o) => o.path), - ).toEqual([false]); + (cache[cacheId]).map((req) => req.path), + [false], + ); done(); }, ); diff --git a/tsconfig.types.test.json b/tsconfig.types.test.json index 50d014a6..23541773 100644 --- a/tsconfig.types.test.json +++ b/tsconfig.types.test.json @@ -5,7 +5,7 @@ "noImplicitThis": true, "alwaysStrict": true, "strictNullChecks": true, - "types": ["node", "jest"] + "types": ["node"] }, "include": ["test/*.js"] }