From f9235c434e81b5245b8dbadd667671b3287ddb13 Mon Sep 17 00:00:00 2001 From: alexander-akait Date: Wed, 30 Jul 2025 16:20:56 +0300 Subject: [PATCH 1/2] chore: migrate to eslint version 9 --- .eslintignore | 6 - .eslintrc.js | 8 - .prettierrc.js | 1 - README.md | 27 +- babel.config.js | 4 +- commitlint.config.js | 8 +- eslint.config.mjs | 8 + jest.config.js | 4 +- lint-staged.config.js | 8 +- package-lock.json | 2985 ++++++++++++++++++++++---- package.json | 64 +- src/StylelintError.js | 6 +- src/getStylelint.js | 58 +- src/index.js | 70 +- src/linter.js | 345 +-- src/options.js | 61 +- src/utils.js | 92 +- src/worker.js | 38 +- test/context.test.js | 16 +- test/emit-error.test.js | 24 +- test/emit-warning.test.js | 24 +- test/empty.test.js | 10 +- test/error.test.js | 16 +- test/exclude.test.js | 16 +- test/fail-on-config.test.js | 12 +- test/fail-on-error.test.js | 16 +- test/fail-on-warning.test.js | 12 +- test/formatter.test.js | 22 +- test/lint-dirty-modules-only.test.js | 42 +- test/mock/stylelint/index.js | 8 +- test/multiple-instances.test.js | 28 +- test/ok.test.js | 6 +- test/output-report.test.js | 26 +- test/quiet.test.js | 12 +- test/stylelint-ignore.test.js | 8 +- test/stylelint-lint.test.js | 26 +- test/stylelint-options.test.js | 22 +- test/stylelint-path.test.js | 14 +- test/symbols.test.js | 8 +- test/threads.test.js | 45 +- test/utils.test.js | 84 +- test/utils/conf.js | 16 +- test/utils/pack.js | 4 +- test/warning.test.js | 8 +- test/watch.test.js | 74 +- types/StylelintError.d.ts | 2 +- types/getStylelint.d.ts | 22 +- types/index.d.ts | 30 +- types/linter.d.ts | 28 +- types/options.d.ts | 96 +- types/utils.d.ts | 67 +- types/worker.d.ts | 21 +- 52 files changed, 3478 insertions(+), 1180 deletions(-) delete mode 100644 .eslintignore delete mode 100644 .eslintrc.js delete mode 100644 .prettierrc.js create mode 100644 eslint.config.mjs diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index c307718..0000000 --- a/.eslintignore +++ /dev/null @@ -1,6 +0,0 @@ -/coverage -/dist -/node_modules -/test/fixtures -/test/output -/types/**/* diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index d216007..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = { - root: true, - extends: ['@webpack-contrib/eslint-config-webpack', 'prettier'], - rules: { - 'global-require': 'off', - 'import/no-dynamic-require': 'off', - }, -}; diff --git a/.prettierrc.js b/.prettierrc.js deleted file mode 100644 index 4f14003..0000000 --- a/.prettierrc.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = { singleQuote: true }; diff --git a/README.md b/README.md index e5ecf63..d19eb21 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ pnpm add -D stylelint Then add the plugin to your webpack configuration. For example: ```js -const StylelintPlugin = require('stylelint-webpack-plugin'); +const StylelintPlugin = require("stylelint-webpack-plugin"); module.exports = { // ... @@ -133,7 +133,7 @@ A string indicating the root of your files. - Type: ```ts -type exclude = string | Array; +type exclude = string | string[]; ``` - Default: `['node_modules', compiler.options.output.path]` @@ -145,7 +145,7 @@ Specify the files and/or directories to exclude. Must be relative to `options.co - Type: ```ts -type extensions = string | Array; +type extensions = string | string[]; ``` - Default: `['css', 'scss', 'sass']` @@ -157,7 +157,7 @@ Specify the extensions that should be checked. - Type: ```ts -type files = string | Array; +type files = string | string[]; ``` - Default: `null` @@ -181,9 +181,9 @@ If `true`, `stylelint` will fix as many errors as possible. The fixes are made t - Type: ```ts -type formatter = string | ( - results: Array -) => string +type formatter = + | string + | ((results: import("stylelint").LintResult[]) => string); ``` - Default: `'string'` @@ -304,10 +304,7 @@ type outputReport = | { filePath?: string | undefined; formatter?: - | ( - | string - | ((results: Array) => string) - ) + | (string | ((results: import("stylelint").LintResult[]) => string)) | undefined; }; ``` @@ -321,10 +318,10 @@ The `filePath` is relative to the webpack config: `output.path`. You can pass in a different formatter for the output file. If none is passed in the default/configured formatter will be used. ```js -{ - filePath: 'path/to/file'; - formatter: 'json'; -} +const outputReport = { + filePath: "path/to/file", + formatter: "json", +}; ``` ## Changelog diff --git a/babel.config.js b/babel.config.js index 85e58f2..b65dedb 100644 --- a/babel.config.js +++ b/babel.config.js @@ -7,10 +7,10 @@ module.exports = (api) => { return { presets: [ [ - '@babel/preset-env', + "@babel/preset-env", { targets: { - node: '18.12.0', + node: "18.12.0", }, }, ], diff --git a/commitlint.config.js b/commitlint.config.js index 0664f00..86a8e2d 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -1,8 +1,8 @@ module.exports = { - extends: ['@commitlint/config-conventional'], + extends: ["@commitlint/config-conventional"], rules: { - 'header-max-length': [0], - 'body-max-line-length': [0], - 'footer-max-line-length': [0], + "header-max-length": [0], + "body-max-line-length": [0], + "footer-max-line-length": [0], }, }; diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..c227975 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,8 @@ +import { defineConfig } from "eslint/config"; +import configs from "eslint-config-webpack/configs.js"; + +export default defineConfig([ + { + extends: [configs["recommended-dirty"]], + }, +]); diff --git a/jest.config.js b/jest.config.js index 025531f..af4f539 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,6 +1,6 @@ module.exports = { - collectCoverageFrom: ['src/**/*.js'], + collectCoverageFrom: ["src/**/*.js"], collectCoverage: true, - testEnvironment: 'node', + testEnvironment: "node", testTimeout: 60000, }; diff --git a/lint-staged.config.js b/lint-staged.config.js index 6669806..3010843 100644 --- a/lint-staged.config.js +++ b/lint-staged.config.js @@ -1,7 +1,7 @@ module.exports = { - '*': [ - 'prettier --cache --write --ignore-unknown', - 'cspell --cache --no-must-find-files', + "*": [ + "prettier --cache --write --ignore-unknown", + "cspell --cache --no-must-find-files", ], - '*.js': ['eslint --cache --fix'], + "*.js": ["eslint --cache --fix"], }; diff --git a/package-lock.json b/package-lock.json index 4ecd0b1..3f8f894 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,9 @@ "@babel/preset-env": "^7.24.7", "@commitlint/cli": "^19.3.0", "@commitlint/config-conventional": "^19.2.2", + "@eslint/js": "^9.32.0", + "@eslint/markdown": "^7.0.0", + "@stylistic/eslint-plugin": "^5.2.2", "@types/file-entry-cache": "^5.0.4", "@types/fs-extra": "^11.0.4", "@types/micromatch": "^4.0.9", @@ -35,9 +38,15 @@ "cspell": "^8.10.0", "del": "^7.1.0", "del-cli": "^5.1.0", - "eslint": "^8.57.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-import": "^2.29.1", + "eslint": "^9.32.0", + "eslint-config-prettier": "^10.1.8", + "eslint-config-webpack": "^4.4.2", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jest": "^29.0.1", + "eslint-plugin-jsdoc": "^51.4.1", + "eslint-plugin-n": "^17.21.0", + "eslint-plugin-prettier": "^5.5.3", + "eslint-plugin-unicorn": "^60.0.0", "file-loader": "^6.2.0", "fs-extra": "^11.2.0", "husky": "^9.1.3", @@ -49,6 +58,7 @@ "standard-version": "^9.5.0", "stylelint": "^16.6.1", "typescript": "^5.5.3", + "typescript-eslint": "^8.38.0", "webpack": "^5.92.1" }, "engines": { @@ -969,6 +979,16 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-classes/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", @@ -1800,6 +1820,16 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/types": { "version": "7.27.6", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", @@ -2814,6 +2844,23 @@ "tslib": "^2.4.0" } }, + "node_modules/@es-joy/jsdoccomment": { + "version": "0.52.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.52.0.tgz", + "integrity": "sha512-BXuN7BII+8AyNtn57euU2Yxo9yA/KUDNzrpXyi3pfqKmBhhysR6ZWOebFh3vyPoqA3/j1SOvGgucElMGwlXing==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.8", + "@typescript-eslint/types": "^8.34.1", + "comment-parser": "1.4.1", + "esquery": "^1.6.0", + "jsdoc-type-pratt-parser": "~4.1.0" + }, + "engines": { + "node": ">=20.11.0" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", @@ -2856,17 +2903,55 @@ "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", + "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", + "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -2874,7 +2959,7 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -2905,16 +2990,13 @@ "license": "Python-2.0" }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "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": { - "type-fest": "^0.20.2" - }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2940,43 +3022,102 @@ "dev": true, "license": "MIT" }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/@eslint/js": { + "version": "9.32.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.32.0.tgz", + "integrity": "sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==", "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://eslint.org/donate" } }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "node_modules/@eslint/markdown": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@eslint/markdown/-/markdown-7.1.0.tgz", + "integrity": "sha512-Y+X1B1j+/zupKDVJfkKc8uYMjQkGzfnd8lt7vK3y8x9Br6H5dBuhAfFrQ6ff7HAMm/1BwgecyEiRFkYCWPRxmA==", "dev": true, "license": "MIT", + "workspaces": [ + "examples/*" + ], + "dependencies": { + "@eslint/core": "^0.15.1", + "@eslint/plugin-kit": "^0.3.4", + "github-slugger": "^2.0.0", + "mdast-util-from-markdown": "^2.0.2", + "mdast-util-frontmatter": "^2.0.1", + "mdast-util-gfm": "^3.1.0", + "micromark-extension-frontmatter": "^2.0.0", + "micromark-extension-gfm": "^3.0.0" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", + "node_modules/@eslint/plugin-kit": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz", + "integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@eslint/core": "^0.15.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "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==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" }, "engines": { - "node": ">=10.10.0" + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@humanwhocodes/module-importer": { @@ -2993,13 +3134,19 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, - "license": "BSD-3-Clause" + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, "node_modules/@hutson/parse-repository-url": { "version": "3.0.2", @@ -4185,6 +4332,40 @@ "@sinonjs/commons": "^3.0.1" } }, + "node_modules/@stylistic/eslint-plugin": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.2.2.tgz", + "integrity": "sha512-bE2DUjruqXlHYP3Q2Gpqiuj2bHq7/88FnuaS0FjeGGLCy+X6a07bGVuwtiOYnPSLHR6jmx5Bwdv+j7l8H+G97A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/types": "^8.37.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" + } + }, + "node_modules/@stylistic/eslint-plugin/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": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@tybys/wasm-util": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", @@ -4258,6 +4439,16 @@ "@types/node": "*" } }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/eslint": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", @@ -4355,6 +4546,16 @@ "@types/node": "*" } }, + "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/micromatch": { "version": "4.0.9", "resolved": "https://registry.npmjs.org/@types/micromatch/-/micromatch-4.0.9.tgz", @@ -4372,6 +4573,13 @@ "dev": true, "license": "MIT" }, + "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": "20.19.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.0.tgz", @@ -4402,6 +4610,13 @@ "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/webpack": { "version": "5.28.5", "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-5.28.5.tgz", @@ -4429,94 +4644,378 @@ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "license": "MIT" }, - "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==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.38.0.tgz", + "integrity": "sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==", "dev": true, - "license": "ISC" + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.38.0", + "@typescript-eslint/type-utils": "8.38.0", + "@typescript-eslint/utils": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.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.38.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } }, - "node_modules/@unrs/resolver-binding-android-arm-eabi": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.9.0.tgz", - "integrity": "sha512-h1T2c2Di49ekF2TE8ZCoJkb+jwETKUIPDJ/nO3tJBKlLFPu+fyd93f0rGP/BvArKx2k2HlRM4kqkNarj3dvZlg==", - "cpu": [ - "arm" - ], + "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", - "optional": true, - "os": [ - "android" - ] + "engines": { + "node": ">= 4" + } }, - "node_modules/@unrs/resolver-binding-android-arm64": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.9.0.tgz", - "integrity": "sha512-sG1NHtgXtX8owEkJ11yn34vt0Xqzi3k9TJ8zppDmyG8GZV4kVWw44FHwKwHeEFl07uKPeC4ZoyuQaGh5ruJYPA==", - "cpu": [ - "arm64" - ], + "node_modules/@typescript-eslint/parser": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.38.0.tgz", + "integrity": "sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ] + "dependencies": { + "@typescript-eslint/scope-manager": "8.38.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/typescript-estree": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0", + "debug": "^4.3.4" + }, + "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", + "typescript": ">=4.8.4 <5.9.0" + } }, - "node_modules/@unrs/resolver-binding-darwin-arm64": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.9.0.tgz", - "integrity": "sha512-nJ9z47kfFnCxN1z/oYZS7HSNsFh43y2asePzTEZpEvK7kGyuShSl3RRXnm/1QaqFL+iP+BjMwuB+DYUymOkA5A==", - "cpu": [ - "arm64" - ], + "node_modules/@typescript-eslint/project-service": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz", + "integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.38.0", + "@typescript-eslint/types": "^8.38.0", + "debug": "^4.3.4" + }, + "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 <5.9.0" + } }, - "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.9.0.tgz", - "integrity": "sha512-TK+UA1TTa0qS53rjWn7cVlEKVGz2B6JYe0C++TdQjvWYIyx83ruwh0wd4LRxYBM5HeuAzXcylA9BH2trARXJTw==", - "cpu": [ - "x64" - ], + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz", + "integrity": "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] + "dependencies": { + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } }, - "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.9.0.tgz", - "integrity": "sha512-6uZwzMRFcD7CcCd0vz3Hp+9qIL2jseE/bx3ZjaLwn8t714nYGwiE84WpaMCYjU+IQET8Vu/+BNAGtYD7BG/0yA==", - "cpu": [ - "x64" - ], + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz", + "integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] + "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 <5.9.0" + } }, - "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.9.0.tgz", - "integrity": "sha512-bPUBksQfrgcfv2+mm+AZinaKq8LCFvt5PThYqRotqSuuZK1TVKkhbVMS/jvSRfYl7jr3AoZLYbDkItxgqMKRkg==", - "cpu": [ - "arm" - ], + "node_modules/@typescript-eslint/type-utils": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.38.0.tgz", + "integrity": "sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ + "dependencies": { + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/typescript-estree": "8.38.0", + "@typescript-eslint/utils": "8.38.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.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", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz", + "integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==", + "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.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz", + "integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.38.0", + "@typescript-eslint/tsconfig-utils": "8.38.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/visitor-keys": "8.38.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.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 <5.9.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz", + "integrity": "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.38.0", + "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/typescript-estree": "8.38.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", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz", + "integrity": "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.38.0", + "eslint-visitor-keys": "^4.2.1" + }, + "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": "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": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "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.9.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.9.0.tgz", + "integrity": "sha512-h1T2c2Di49ekF2TE8ZCoJkb+jwETKUIPDJ/nO3tJBKlLFPu+fyd93f0rGP/BvArKx2k2HlRM4kqkNarj3dvZlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.9.0.tgz", + "integrity": "sha512-sG1NHtgXtX8owEkJ11yn34vt0Xqzi3k9TJ8zppDmyG8GZV4kVWw44FHwKwHeEFl07uKPeC4ZoyuQaGh5ruJYPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.9.0.tgz", + "integrity": "sha512-nJ9z47kfFnCxN1z/oYZS7HSNsFh43y2asePzTEZpEvK7kGyuShSl3RRXnm/1QaqFL+iP+BjMwuB+DYUymOkA5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.9.0.tgz", + "integrity": "sha512-TK+UA1TTa0qS53rjWn7cVlEKVGz2B6JYe0C++TdQjvWYIyx83ruwh0wd4LRxYBM5HeuAzXcylA9BH2trARXJTw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.9.0.tgz", + "integrity": "sha512-6uZwzMRFcD7CcCd0vz3Hp+9qIL2jseE/bx3ZjaLwn8t714nYGwiE84WpaMCYjU+IQET8Vu/+BNAGtYD7BG/0yA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.9.0.tgz", + "integrity": "sha512-bPUBksQfrgcfv2+mm+AZinaKq8LCFvt5PThYqRotqSuuZK1TVKkhbVMS/jvSRfYl7jr3AoZLYbDkItxgqMKRkg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ "linux" ] }, @@ -5051,6 +5550,16 @@ "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": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -5552,9 +6061,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", - "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", + "version": "4.25.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", + "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", "dev": true, "funding": [ { @@ -5572,8 +6081,8 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001718", - "electron-to-chromium": "^1.5.160", + "caniuse-lite": "^1.0.30001726", + "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, @@ -5626,6 +6135,19 @@ "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/cacheable": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.10.0.tgz", @@ -5736,9 +6258,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001723", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001723.tgz", - "integrity": "sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw==", + "version": "1.0.30001731", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001731.tgz", + "integrity": "sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==", "dev": true, "funding": [ { @@ -5756,6 +6278,17 @@ ], "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.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", @@ -5785,6 +6318,13 @@ "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", @@ -5795,6 +6335,17 @@ "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/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -5831,9 +6382,9 @@ } }, "node_modules/ci-info": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz", - "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", + "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", "dev": true, "funding": [ { @@ -5853,6 +6404,29 @@ "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/clean-stack": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", @@ -6109,6 +6683,16 @@ "node": ">= 6" } }, + "node_modules/comment-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/compare-func": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", @@ -7395,13 +7979,13 @@ "license": "MIT" }, "node_modules/core-js-compat": { - "version": "3.43.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.43.0.tgz", - "integrity": "sha512-2GML2ZsCc5LR7hZYz4AXmjQw8zuy2T//2QntwdnpuYI7jteT6GVYJL7F6C2C57R7gSYrcqVW3lAALefdbhBLDA==", + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.44.0.tgz", + "integrity": "sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.25.0" + "browserslist": "^4.25.1" }, "funding": { "type": "opencollective", @@ -7900,14 +8484,28 @@ "node": ">=0.10.0" } }, - "node_modules/dedent": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", - "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", + "node_modules/decode-named-character-reference": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", "dev": true, "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dedent": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", + "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" }, "peerDependenciesMeta": { "babel-plugin-macros": { @@ -8357,6 +8955,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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": "6.1.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", @@ -8377,6 +8985,20 @@ "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", @@ -8389,19 +9011,6 @@ "node": ">=8" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -8518,9 +9127,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.167", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.167.tgz", - "integrity": "sha512-LxcRvnYO5ez2bMOFpbuuVuAI5QNeY1ncVytE/KXaL6ZNfzX1yPlAO0nSOyIHx2fVAuUprMqPs/TdVhUFZy7SIQ==", + "version": "1.5.192", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.192.tgz", + "integrity": "sha512-rP8Ez0w7UNw/9j5eSXCe10o1g/8B1P5SM90PCCMVkIRQn2R0LEHWz4Eh9RnxkniuDe1W0cTSOB3MLlkTGDcuCg==", "dev": true, "license": "ISC" }, @@ -8781,75 +9390,191 @@ } }, "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "version": "9.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.32.0.tgz", + "integrity": "sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.0", + "@eslint/core": "^0.15.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.32.0", + "@eslint/plugin-kit": "^0.3.4", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "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": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "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": "MIT", + "dependencies": { + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-compat-utils/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "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": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, "peerDependencies": { "eslint": ">=7.0.0" } }, + "node_modules/eslint-config-webpack": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/eslint-config-webpack/-/eslint-config-webpack-4.5.1.tgz", + "integrity": "sha512-Qiq0PSjx7P1ncI9PCTvfW8c76OqkXAFr91TQGa+u1FAMHXMur3in8hwL7fXYPi2oF8ytI1Zuoc2TmDzX0ZO4tA==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-indent": "^7.0.1", + "jsonc-eslint-parser": "^2.4.0", + "semver": "^7.7.2", + "sort-package-json": "^3.4.0" + }, + "engines": { + "node": ">= 20.9.0" + }, + "peerDependencies": { + "@eslint/js": ">= 9.28.0", + "@eslint/markdown": ">= 7.1.0", + "@stylistic/eslint-plugin": ">= 4.4.1", + "eslint": ">= 9.28.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-import": ">= 2.31.0", + "eslint-plugin-jest": ">= 28.12.0", + "eslint-plugin-jsdoc": ">= 50.7.1", + "eslint-plugin-n": ">= 17.19.0", + "eslint-plugin-prettier": ">= 5.5.3", + "eslint-plugin-react": ">= 7.37.5", + "eslint-plugin-unicorn": ">= 60.0.0", + "globals": ">= 16.2.0", + "prettier": ">= 3.5.3", + "typescript": ">= 5.0.0", + "typescript-eslint": ">= 8.34.0" + }, + "peerDependenciesMeta": { + "@eslint/markdown": { + "optional": true + }, + "eslint-plugin-jest": { + "optional": true + }, + "eslint-plugin-jsdoc": { + "optional": true + }, + "eslint-plugin-n": { + "optional": true + }, + "eslint-plugin-react": { + "optional": true + }, + "typescript": { + "optional": true + }, + "typescript-eslint": { + "optional": true + } + } + }, + "node_modules/eslint-config-webpack/node_modules/detect-indent": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.1.tgz", + "integrity": "sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/eslint-config-webpack/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "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", @@ -8873,9 +9598,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", - "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", "dev": true, "license": "MIT", "dependencies": { @@ -8900,31 +9625,53 @@ "ms": "^2.1.1" } }, + "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": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": ">=8" + } + }, "node_modules/eslint-plugin-import": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", - "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "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.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", + "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.0", + "eslint-module-utils": "^2.12.1", "hasown": "^2.0.2", - "is-core-module": "^2.15.1", + "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.0", + "object.values": "^1.2.1", "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", + "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0" }, "engines": { @@ -8957,134 +9704,351 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "node_modules/eslint-plugin-jest": { + "version": "29.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.0.1.tgz", + "integrity": "sha512-EE44T0OSMCeXhDrrdsbKAhprobKkPtJTbQz5yEktysNpHeDZTAL1SfDTNKmcFfJkY6yrQLtTKZALrD3j/Gpmiw==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "@typescript-eslint/utils": "^8.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^20.12.0 || ^22.0.0 || >=24.0.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "jest": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } } }, - "node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "node_modules/eslint-plugin-jsdoc": { + "version": "51.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-51.4.1.tgz", + "integrity": "sha512-y4CA9OkachG8v5nAtrwvcvjIbdcKgSyS6U//IfQr4FZFFyeBFwZFf/tfSsMr46mWDJgidZjBTqoCRlXywfFBMg==", "dev": true, - "license": "Apache-2.0", + "license": "BSD-3-Clause", + "dependencies": { + "@es-joy/jsdoccomment": "~0.52.0", + "are-docs-informative": "^0.0.2", + "comment-parser": "1.4.1", + "debug": "^4.4.1", + "escape-string-regexp": "^4.0.0", + "espree": "^10.4.0", + "esquery": "^1.6.0", + "parse-imports-exports": "^0.2.4", + "semver": "^7.7.2", + "spdx-expression-parse": "^4.0.0" + }, "engines": { - "node": ">=4" + "node": ">=20.11.0" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/eslint-plugin-jsdoc/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", "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" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "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==", + "node_modules/eslint-plugin-n": { + "version": "17.21.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.21.3.tgz", + "integrity": "sha512-MtxYjDZhMQgsWRm/4xYLL0i2EhusWT7itDxlJ80l1NND2AL2Vi5Mvneqv/ikG9+zpran0VsVRXTEHrpLmUZRNw==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "@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", + "ts-declaration-location": "^1.0.6" }, "engines": { - "node": ">=8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": ">=8.23.0" } }, - "node_modules/eslint/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==", + "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": "Python-2.0" + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "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/eslint-plugin-n/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/eslint/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==", + "node_modules/eslint-plugin-prettier": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.3.tgz", + "integrity": "sha512-NAdMYww51ehKfDyDhv59/eIItUVzU0Io9H2E8nHNGKEeeqlnci+1gCvrHib6EmZdf6GxF+LCV5K7UC65Ezvw7w==", "dev": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.11.7" }, "engines": { - "node": ">=7.0.0" + "node": "^14.18.0 || >=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 + } } }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "node_modules/eslint-plugin-unicorn": { + "version": "60.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-60.0.0.tgz", + "integrity": "sha512-QUzTefvP8stfSXsqKQ+vBQSEsXIlAiCduS/V1Em+FKgL9c21U/IIm20/e3MFy1jyCf14tHAhqC1sX8OTy6VUCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "@eslint-community/eslint-utils": "^4.7.0", + "@eslint/plugin-kit": "^0.3.3", + "change-case": "^5.4.4", + "ci-info": "^4.3.0", + "clean-regexp": "^1.0.0", + "core-js-compat": "^3.44.0", + "esquery": "^1.6.0", + "find-up-simple": "^1.0.1", + "globals": "^16.3.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.12.0", + "semver": "^7.7.2", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": "^20.10.0 || >=21.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" + }, + "peerDependencies": { + "eslint": ">=9.29.0" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/strip-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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/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": ">=8" + }, + "funding": { + "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==", + "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/eslint/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/eslint/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/eslint/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "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": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "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", "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/eslint/node_modules/find-up": { @@ -9105,18 +10069,17 @@ } }, "node_modules/eslint/node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "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": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/eslint/node_modules/glob-parent": { @@ -9132,45 +10095,6 @@ "node": ">=10.13.0" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -9220,45 +10144,32 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^4.2.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "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": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -9399,6 +10310,13 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "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": "5.2.2", "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz", @@ -9474,6 +10392,20 @@ "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", + "dependencies": { + "format": "^0.2.0" + }, + "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", @@ -9642,6 +10574,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/flat-cache": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz", @@ -9709,6 +10654,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "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, + "engines": { + "node": ">=0.4.x" + } + }, "node_modules/fs-extra": { "version": "11.3.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", @@ -10147,6 +11101,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-tsconfig": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/git-hooks-list": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/git-hooks-list/-/git-hooks-list-4.1.1.tgz", + "integrity": "sha512-cmP497iLq54AZnv4YRAEMnEyQ1eIn4tGKbmswqwmFV4GBnAqE8NLtWxxdXa++AalfgL5EBH4IxTPyquEuGY/jA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/fisker/git-hooks-list?sponsor=1" + } + }, "node_modules/git-raw-commits": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz", @@ -10484,6 +11461,13 @@ "dev": true, "license": "ISC" }, + "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", @@ -10590,13 +11574,16 @@ } }, "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz", + "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { @@ -10652,6 +11639,13 @@ "dev": true, "license": "MIT" }, + "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", @@ -11132,10 +12126,26 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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/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": { + "builtin-modules": "^5.0.0" + }, + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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": { @@ -13410,6 +14420,16 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", + "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -13477,6 +14497,69 @@ "node": ">=6" } }, + "node_modules/jsonc-eslint-parser": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.0.tgz", + "integrity": "sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.5.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -14081,6 +15164,17 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -14138,6 +15232,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -14154,54 +15259,907 @@ "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", "dev": true, "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/meow": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", + "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/mdn-data": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", - "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", "dev": true, - "license": "CC0-1.0" + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", "dev": true, - "engines": { - "node": ">= 0.10.0" + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/meow": { - "version": "12.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", - "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", - "engines": { - "node": ">=16.10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT" }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" }, "node_modules/micromatch": { "version": "4.0.8", @@ -14890,6 +16848,16 @@ "node": ">=8" } }, + "node_modules/parse-imports-exports": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz", + "integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "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", @@ -14909,6 +16877,13 @@ "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", + "integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==", + "dev": true, + "license": "MIT" + }, "node_modules/path-exists": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", @@ -14987,9 +16962,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { @@ -15111,6 +17086,16 @@ "node": ">=8" } }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -15258,6 +17243,19 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/pretty-format": { "version": "30.0.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.0.tgz", @@ -15612,6 +17610,16 @@ "node": ">=4" } }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "dev": true, + "license": "MIT", + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", @@ -15757,6 +17765,16 @@ "node": ">=8" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/restore-cursor": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", @@ -16183,6 +18201,84 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/sort-object-keys": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sort-object-keys/-/sort-object-keys-1.1.3.tgz", + "integrity": "sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sort-package-json": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-3.4.0.tgz", + "integrity": "sha512-97oFRRMM2/Js4oEA9LJhjyMlde+2ewpZQf53pgue27UkbEXfHJnDzHlUxQ/DWUkzqmp7DFwJp8D+wi/TYeQhpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-indent": "^7.0.1", + "detect-newline": "^4.0.1", + "git-hooks-list": "^4.0.0", + "is-plain-obj": "^4.1.0", + "semver": "^7.7.1", + "sort-object-keys": "^1.1.3", + "tinyglobby": "^0.2.12" + }, + "bin": { + "sort-package-json": "cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/sort-package-json/node_modules/detect-indent": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.1.tgz", + "integrity": "sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.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==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sort-package-json/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": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sort-package-json/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -17337,13 +19433,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" - }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -17414,6 +19503,42 @@ "node": ">=8" } }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-declaration-location": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/ts-declaration-location/-/ts-declaration-location-1.0.7.tgz", + "integrity": "sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==", + "dev": true, + "funding": [ + { + "type": "ko-fi", + "url": "https://ko-fi.com/rebeccastevens" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/ts-declaration-location" + } + ], + "license": "BSD-3-Clause", + "dependencies": { + "picomatch": "^4.0.2" + }, + "peerDependencies": { + "typescript": ">=4.0.0" + } + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -17593,6 +19718,30 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.38.0.tgz", + "integrity": "sha512-FsZlrYK6bPDGoLeZRuvx2v6qrM03I0U0SnfCLPs/XCCPCFD80xU9Pg09H/K+XFa68uJuZo7l/Xhs+eDRg2l3hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.38.0", + "@typescript-eslint/parser": "8.38.0", + "@typescript-eslint/typescript-estree": "8.38.0", + "@typescript-eslint/utils": "8.38.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", + "typescript": ">=4.8.4 <5.9.0" + } + }, "node_modules/uglify-js": { "version": "3.19.3", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", @@ -17689,6 +19838,65 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", @@ -18357,6 +20565,17 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } } diff --git a/package.json b/package.json index 1e0526c..e9e2a96 100644 --- a/package.json +++ b/package.json @@ -2,20 +2,28 @@ "name": "stylelint-webpack-plugin", "version": "5.0.1", "description": "A Stylelint plugin for webpack", - "license": "MIT", - "repository": "webpack-contrib/stylelint-webpack-plugin", - "author": "Ricardo Gobbo de Souza ", + "keywords": [ + "stylelint", + "lint", + "linter", + "plugin", + "webpack" + ], "homepage": "https://github.com/webpack-contrib/stylelint-webpack-plugin", "bugs": "https://github.com/webpack-contrib/stylelint-webpack-plugin/issues", + "repository": "webpack-contrib/stylelint-webpack-plugin", "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, + "license": "MIT", + "author": "Ricardo Gobbo de Souza ", "main": "dist/index.js", "types": "types/index.d.ts", - "engines": { - "node": ">= 18.12.0" - }, + "files": [ + "dist", + "types" + ], "scripts": { "start": "npm run build -- -w", "clean": "del-cli dist types", @@ -26,13 +34,13 @@ "commitlint": "commitlint --from=master", "security": "npm audit", "lint:prettier": "prettier -w --list-different .", - "lint:js": "eslint --cache .", + "lint:code": "eslint --cache .", "lint:spelling": "cspell \"**/*.*\"", "lint:types": "tsc --pretty --noEmit", "lint": "npm-run-all -l -p \"lint:**\"", - "fix:js": "npm run lint:js -- --fix", + "fix:code": "npm run lint:code -- --fix", "fix:prettier": "npm run lint:prettier -- --write", - "fix": "npm-run-all -l fix:js fix:prettier", + "fix": "npm-run-all -l fix:code fix:prettier", "test:only": "cross-env NODE_OPTIONS=--experimental-vm-modules NODE_ENV=test jest --testTimeout=60000", "test:watch": "npm run test:only -- --watch", "test:coverage": "npm run test:only -- --collectCoverageFrom=\"src/**/*.js\" --coverage", @@ -41,14 +49,6 @@ "prepare": "husky && npm run build", "release": "standard-version" }, - "files": [ - "dist", - "types" - ], - "peerDependencies": { - "stylelint": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", - "webpack": "^5.0.0" - }, "dependencies": { "globby": "^11.1.0", "jest-worker": "^29.7.0", @@ -62,6 +62,9 @@ "@babel/preset-env": "^7.24.7", "@commitlint/cli": "^19.3.0", "@commitlint/config-conventional": "^19.2.2", + "@eslint/js": "^9.32.0", + "@eslint/markdown": "^7.0.0", + "@stylistic/eslint-plugin": "^5.2.2", "@types/file-entry-cache": "^5.0.4", "@types/fs-extra": "^11.0.4", "@types/micromatch": "^4.0.9", @@ -76,9 +79,15 @@ "cspell": "^8.10.0", "del": "^7.1.0", "del-cli": "^5.1.0", - "eslint": "^8.57.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-import": "^2.29.1", + "eslint": "^9.32.0", + "eslint-config-prettier": "^10.1.8", + "eslint-config-webpack": "^4.4.2", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jest": "^29.0.1", + "eslint-plugin-jsdoc": "^51.4.1", + "eslint-plugin-n": "^17.21.0", + "eslint-plugin-prettier": "^5.5.3", + "eslint-plugin-unicorn": "^60.0.0", "file-loader": "^6.2.0", "fs-extra": "^11.2.0", "husky": "^9.1.3", @@ -90,13 +99,14 @@ "standard-version": "^9.5.0", "stylelint": "^16.6.1", "typescript": "^5.5.3", + "typescript-eslint": "^8.38.0", "webpack": "^5.92.1" }, - "keywords": [ - "stylelint", - "lint", - "linter", - "plugin", - "webpack" - ] + "peerDependencies": { + "stylelint": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", + "webpack": "^5.0.0" + }, + "engines": { + "node": ">= 18.12.0" + } } diff --git a/src/StylelintError.js b/src/StylelintError.js index b6a92c0..027e529 100644 --- a/src/StylelintError.js +++ b/src/StylelintError.js @@ -1,11 +1,11 @@ class StylelintError extends Error { /** - * @param {string=} messages + * @param {string=} messages messages */ constructor(messages) { super(`[stylelint] ${messages}`); - this.name = 'StylelintError'; - this.stack = ''; + this.name = "StylelintError"; + this.stack = ""; } } diff --git a/src/getStylelint.js b/src/getStylelint.js index e9f5963..5e2a2fc 100644 --- a/src/getStylelint.js +++ b/src/getStylelint.js @@ -1,13 +1,12 @@ -const { cpus } = require('os'); +const { cpus } = require("node:os"); -const { Worker: JestWorker } = require('jest-worker'); +const { Worker: JestWorker } = require("jest-worker"); -// @ts-ignore -const { setup, lintFiles } = require('./worker'); -const { jsonStringifyReplacerSortKeys } = require('./utils'); -const { getStylelintOptions } = require('./options'); +const { getStylelintOptions } = require("./options"); +const { jsonStringifyReplacerSortKeys } = require("./utils"); +const { lintFiles, setup } = require("./worker"); -/** @type {{[key: string]: any}} */ +/** @type {{ [key: string]: Linter }} */ const cache = {}; /** @typedef {{lint: (options: LinterOptions) => Promise, formatters: { [k: string]: Formatter }}} Stylelint */ @@ -16,6 +15,7 @@ const cache = {}; /** @typedef {import('stylelint').LinterResult} LinterResult */ /** @typedef {import('stylelint').Formatter} Formatter */ /** @typedef {import('stylelint').FormatterType} FormatterType */ +/** @typedef {import('stylelint').RuleMeta} RuleMeta */ /** @typedef {import('./options').Options} Options */ /** @typedef {() => Promise} AsyncTask */ /** @typedef {(files: string|string[]) => Promise} LintTask */ @@ -23,8 +23,8 @@ const cache = {}; /** @typedef {JestWorker & {lintFiles: LintTask}} Worker */ /** - * @param {Options} options - * @returns {Linter} + * @param {Options} options linter options + * @returns {Linter} linter */ function loadStylelint(options) { const stylelintOptions = getStylelintOptions(options); @@ -39,14 +39,23 @@ function loadStylelint(options) { } /** - * @param {string|undefined} key - * @param {number} poolSize - * @param {Options} options - * @returns {Linter} + * @param {string | undefined} key a cache key + * @param {Options} options options + * @returns {string} a stringified cache key + */ +function getCacheKey(key, options) { + return JSON.stringify({ key, options }, jsonStringifyReplacerSortKeys); +} + +/** + * @param {string|undefined} key a cache key + * @param {number} poolSize number of workers + * @param {Options} options options + * @returns {Linter} linter */ function loadStylelintThreaded(key, poolSize, options) { const cacheKey = getCacheKey(key, options); - const source = require.resolve('./worker'); + const source = require.resolve("./worker"); const workerOptions = { enableWorkerThreads: true, numWorkers: poolSize, @@ -55,7 +64,9 @@ function loadStylelintThreaded(key, poolSize, options) { const local = loadStylelint(options); - let worker = /** @type {Worker?} */ (new JestWorker(source, workerOptions)); + let worker = + /** @type {Worker | null} */ + (new JestWorker(source, workerOptions)); /** @type {Linter} */ const context = { @@ -79,13 +90,13 @@ function loadStylelintThreaded(key, poolSize, options) { } /** - * @param {string|undefined} key - * @param {Options} options - * @returns {Linter} + * @param {string|undefined} key a cache key + * @param {Options} options options + * @returns {Linter} linter */ function getStylelint(key, { threads, ...options }) { const max = - typeof threads !== 'number' ? (threads ? cpus().length - 1 : 1) : threads; + typeof threads !== "number" ? (threads ? cpus().length - 1 : 1) : threads; const cacheKey = getCacheKey(key, { threads, ...options }); if (!cache[cacheKey]) { @@ -97,13 +108,4 @@ function getStylelint(key, { threads, ...options }) { return cache[cacheKey]; } -/** - * @param {string|undefined} key - * @param {Options} options - * @returns {string} - */ -function getCacheKey(key, options) { - return JSON.stringify({ key, options }, jsonStringifyReplacerSortKeys); -} - module.exports = getStylelint; diff --git a/src/index.js b/src/index.js index 37b1890..123f8bf 100644 --- a/src/index.js +++ b/src/index.js @@ -1,23 +1,25 @@ -const { isAbsolute, join } = require('path'); +const { isAbsolute, join } = require("node:path"); -const globby = require('globby'); -const { isMatch } = require('micromatch'); +const globby = require("globby"); +const { isMatch } = require("micromatch"); -const { getOptions } = require('./options'); -const linter = require('./linter'); -const { arrify, parseFiles, parseFoldersToGlobs } = require('./utils'); +const linter = require("./linter"); +const { getOptions } = require("./options"); +const { arrify, parseFiles, parseFoldersToGlobs } = require("./utils"); /** @typedef {import('webpack').Compiler} Compiler */ /** @typedef {import('webpack').Module} Module */ /** @typedef {import('./options').Options} Options */ -/** @typedef {Partial<{timestamp:number} | number>} FileSystemInfoEntry */ +/** @typedef {Partial<{ timestamp:number } | number>} FileSystemInfoEntry */ +// eslint-disable-next-line jsdoc/no-restricted-syntax +/** @typedef {any} EXPECTED_ANY */ -const STYLELINT_PLUGIN = 'StylelintWebpackPlugin'; +const STYLELINT_PLUGIN = "StylelintWebpackPlugin"; let counter = 0; class StylelintWebpackPlugin { /** - * @param {Options} options + * @param {Options=} options options */ constructor(options = {}) { this.key = STYLELINT_PLUGIN; @@ -28,7 +30,7 @@ class StylelintWebpackPlugin { } /** - * @param {Compiler} compiler + * @param {Compiler} compiler compiler * @returns {void} */ apply(compiler) { @@ -38,7 +40,7 @@ class StylelintWebpackPlugin { const context = this.getContext(compiler); const excludeDefault = [ - '**/node_modules/**', + "**/node_modules/**", String(compiler.options.output.path), ]; @@ -47,7 +49,7 @@ class StylelintWebpackPlugin { context, exclude: parseFiles(this.options.exclude || excludeDefault, context), extensions: arrify(this.options.extensions), - files: parseFiles(this.options.files || '', context), + files: parseFiles(this.options.files || "", context), }; const wanted = parseFoldersToGlobs(options.files, options.extensions); @@ -56,35 +58,34 @@ class StylelintWebpackPlugin { // If `lintDirtyModulesOnly` is disabled, // execute the linter on the build if (!this.options.lintDirtyModulesOnly) { - compiler.hooks.run.tapPromise(this.key, (c) => - this.run(c, options, wanted, exclude), + compiler.hooks.run.tapPromise(this.key, (compiler) => + this.run(compiler, options, wanted, exclude), ); } let isFirstRun = this.options.lintDirtyModulesOnly; - compiler.hooks.watchRun.tapPromise(this.key, (c) => { + compiler.hooks.watchRun.tapPromise(this.key, (compiler) => { if (isFirstRun) { isFirstRun = false; return Promise.resolve(); } - return this.run(c, options, wanted, exclude); + return this.run(compiler, options, wanted, exclude); }); } /** - * @param {Compiler} compiler - * @param {Options} options - * @param {string[]} wanted - * @param {string[]} exclude + * @param {Compiler} compiler compiler + * @param {Options} options options + * @param {string[]} wanted wanted files + * @param {string[]} exclude exclude files */ async run(compiler, options, wanted, exclude) { // Do not re-hook /* istanbul ignore if */ if ( - // @ts-ignore - compiler.hooks.thisCompilation.taps.find(({ name }) => name === this.key) + compiler.hooks.thisCompilation.taps.some(({ name }) => name === this.key) ) { return; } @@ -101,16 +102,15 @@ class StylelintWebpackPlugin { try { ({ lint, report, threads } = linter(this.key, options, compilation)); - } catch (e) { - compilation.errors.push(e); + } catch (err) { + compilation.errors.push(err); return; } compilation.hooks.finishModules.tapPromise(this.key, async () => { /** @type {string[]} */ - // @ts-ignore const files = compiler.modifiedFiles - ? Array.from(compiler.modifiedFiles).filter( + ? [...compiler.modifiedFiles].filter( (file) => isMatch(file, wanted, { dot: true }) && !isMatch(file, exclude, { dot: true }), @@ -126,25 +126,21 @@ class StylelintWebpackPlugin { } }); - // await and interpret results - compilation.hooks.additionalAssets.tapPromise(this.key, processResults); - + /** + * @returns {Promise} + */ async function processResults() { const { errors, warnings, generateReportAsset } = await report(); if (warnings && !options.failOnWarning) { - // @ts-ignore compilation.warnings.push(warnings); } else if (warnings && options.failOnWarning) { - // @ts-ignore compilation.errors.push(warnings); } if (errors && options.failOnError) { - // @ts-ignore compilation.errors.push(errors); } else if (errors && !options.failOnError) { - // @ts-ignore compilation.warnings.push(errors); } @@ -152,13 +148,15 @@ class StylelintWebpackPlugin { await generateReportAsset(compilation); } } + + // await and interpret results + compilation.hooks.additionalAssets.tapPromise(this.key, processResults); }); } /** - * - * @param {Compiler} compiler - * @returns {string} + * @param {Compiler} compiler compiler + * @returns {string} context */ getContext(compiler) { if (!this.options.context) { diff --git a/src/linter.js b/src/linter.js index 6c8c1b0..7b58215 100644 --- a/src/linter.js +++ b/src/linter.js @@ -1,8 +1,8 @@ -const { dirname, isAbsolute, join } = require('path'); +const { dirname, isAbsolute, join } = require("node:path"); -const StylelintError = require('./StylelintError'); -const getStylelint = require('./getStylelint'); -const { arrify } = require('./utils'); +const StylelintError = require("./StylelintError"); +const getStylelint = require("./getStylelint"); +const { arrify } = require("./utils"); /** @typedef {import('webpack').Compiler} Compiler */ /** @typedef {import('webpack').Compilation} Compilation */ @@ -11,6 +11,7 @@ const { arrify } = require('./utils'); /** @typedef {import('./getStylelint').LinterResult} LinterResult */ /** @typedef {import('./getStylelint').Formatter} Formatter */ /** @typedef {import('./getStylelint').FormatterType} FormatterType */ +/** @typedef {import('./getStylelint').RuleMeta} RuleMeta */ /** @typedef {import('./options').Options} Options */ /** @typedef {(compilation: Compilation) => Promise} GenerateReport */ /** @typedef {{errors?: StylelintError, warnings?: StylelintError, generateReportAsset?: GenerateReport}} Report */ @@ -22,16 +23,151 @@ const { arrify } = require('./utils'); const resultStorage = new WeakMap(); /** - * @param {string|undefined} key - * @param {Options} options - * @param {Compilation} compilation - * @returns {{lint: Linter, report: Reporter, threads: number}} + * @param {Compilation} compilation compilation + * @returns {LintResultMap} lint result map + */ +function getResultStorage({ compiler }) { + let storage = resultStorage.get(compiler); + if (!storage) { + resultStorage.set(compiler, (storage = {})); + } + return storage; +} + +/** + * @param {LintResult[]} results results + * @returns {LintResult[]} filtered results without ignored + */ +function removeIgnoredWarnings(results) { + return results.filter((result) => !result.ignored); +} + +/** + * @param {Promise[]} results results + * @returns {Promise} flatten results + */ +async function flatten(results) { + /** + * @param {LintResult[]} acc acc + * @param {LintResult[]} list list + * @returns {LintResult[]} result + */ + const flat = (acc, list) => [...acc, ...list]; + return (await Promise.all(results)).reduce(flat, []); +} + +/** + * @param {Stylelint} stylelint stylelint + * @param {FormatterType=} formatter formatter + * @returns {Promise | Formatter} resolved formatter + */ +function loadFormatter(stylelint, formatter) { + if (typeof formatter === "function") { + return formatter; + } + + if (typeof formatter === "string") { + try { + return stylelint.formatters[formatter]; + } catch { + // Load the default formatter. + } + } + + return stylelint.formatters.string; +} + +/* istanbul ignore next */ +/** + * @param {LintResult[]} lintResults lint results + * @returns {{ [ruleName: string]: Partial }} a rule meta + */ +function getRuleMetadata(lintResults) { + const [lintResult] = lintResults; + + if (lintResult === undefined) return {}; + + if (lintResult._postcssResult === undefined) return {}; + + return lintResult._postcssResult.stylelint.ruleMetadata; +} + +/** + * @param {Formatter} formatter formatter + * @param {{ errors: LintResult[]; warnings: LintResult[]; }} results results + * @param {LinterResult} returnValue return value + * @returns {{ errors?: StylelintError, warnings?: StylelintError }} formatted result + */ +function formatResults(formatter, results, returnValue) { + let errors; + let warnings; + if (results.warnings.length > 0) { + warnings = new StylelintError(formatter(results.warnings, returnValue)); + } + + if (results.errors.length > 0) { + errors = new StylelintError(formatter(results.errors, returnValue)); + } + + return { + errors, + warnings, + }; +} + +/** + * @param {Options} options options + * @param {LintResult[]} results results + * @returns {{ errors: LintResult[], warnings: LintResult[] }} parsed results + */ +function parseResults(options, results) { + /** @type {LintResult[]} */ + const errors = []; + + /** @type {LintResult[]} */ + const warnings = []; + + for (const file of results) { + const fileErrors = file.warnings.filter( + (message) => options.emitError && message.severity === "error", + ); + + if (fileErrors.length > 0) { + errors.push({ + ...file, + warnings: fileErrors, + }); + } + + const fileWarnings = file.warnings.filter( + (message) => options.emitWarning && message.severity === "warning", + ); + + if (fileWarnings.length > 0) { + warnings.push({ + ...file, + warnings: fileWarnings, + }); + } + } + + return { + errors, + warnings, + }; +} + +/** + * @param {string | undefined} key a cache key + * @param {Options} options options + * @param {Compilation} compilation compilation + * @returns {{ lint: Linter, report: Reporter, threads: number }} the linter with additional functions */ function linter(key, options, compilation) { /** @type {Stylelint} */ let stylelint; - /** @type {(files: string|string[]) => Promise} */ + /** @type {(files: string | string[]) => Promise} */ let lintFiles; /** @type {() => Promise} */ @@ -47,37 +183,33 @@ function linter(key, options, compilation) { try { ({ stylelint, lintFiles, cleanup, threads } = getStylelint(key, options)); - } catch (e) { - throw new StylelintError(e.message); + } catch (err) { + throw new StylelintError(err.message); } - return { - lint, - report, - threads, - }; - /** - * @param {string | string[]} files + * @param {string | string[]} files files */ function lint(files) { for (const file of arrify(files)) { delete crossRunResultStorage[file]; } rawResults.push( - lintFiles(files).catch((e) => { - // @ts-ignore - compilation.errors.push(new StylelintError(e.message)); + lintFiles(files).catch((err) => { + compilation.errors.push(new StylelintError(err.message)); return []; }), ); } + /** + * @returns {Promise} report + */ async function report() { // Filter out ignored files. let results = removeIgnoredWarnings( // Get the current results, resetting the rawResults to empty - await flatten(rawResults.splice(0, rawResults.length)), + await flatten(rawResults.splice(0)), ); await cleanup(); @@ -96,12 +228,12 @@ function linter(key, options, compilation) { const formatter = await loadFormatter(stylelint, options.formatter); /** @type {LinterResult} */ + // @ts-expect-error need better types const returnValue = { - // @ts-ignore - cwd: options.cwd, + cwd: /** @type {string} */ (options.cwd), errored: false, results: [], - output: '', + output: "", reportedDisables: [], ruleMetadata: getRuleMetadata(results), }; @@ -112,38 +244,35 @@ function linter(key, options, compilation) { returnValue, ); - return { - errors, - warnings, - generateReportAsset, - }; - /** - * @param {Compilation} compilation + * @param {Compilation} compilation compilation * @returns {Promise} */ async function generateReportAsset({ compiler }) { const { outputReport } = options; /** - * @param {string} name - * @param {string | Buffer} content + * @param {string} name name + * @param {string | Buffer} content content + * @returns {Promise} */ const save = (name, content) => - /** @type {Promise} */ ( + /** @type {Promise} */ + ( new Promise((finish, bail) => { if (!compiler.outputFileSystem) return; const { mkdir, writeFile } = compiler.outputFileSystem; // ensure directory exists - // @ts-ignore - the types for `outputFileSystem` are missing the 3 arg overload mkdir(dirname(name), { recursive: true }, (err) => { /* istanbul ignore if */ - if (err) bail(err); - else + if (err) { + bail(err); + } else { writeFile(name, content, (err2) => { /* istanbul ignore if */ if (err2) bail(err2); else finish(); }); + } }); }) ); @@ -166,143 +295,19 @@ function linter(key, options, compilation) { await save(filePath, String(content)); } - } -} -/** - * @param {Formatter} formatter - * @param {{ errors: LintResult[]; warnings: LintResult[]; }} results - * @param {LinterResult} returnValue - * @returns {{errors?: StylelintError, warnings?: StylelintError}} - */ -function formatResults(formatter, results, returnValue) { - let errors; - let warnings; - if (results.warnings.length > 0) { - warnings = new StylelintError(formatter(results.warnings, returnValue)); - } - - if (results.errors.length > 0) { - errors = new StylelintError(formatter(results.errors, returnValue)); + return { + errors, + warnings, + generateReportAsset, + }; } return { - errors, - warnings, - }; -} - -/** - * @param {Options} options - * @param {LintResult[]} results - * @returns {{errors: LintResult[], warnings: LintResult[]}} - */ -function parseResults(options, results) { - /** @type {LintResult[]} */ - const errors = []; - - /** @type {LintResult[]} */ - const warnings = []; - - results.forEach((file) => { - const fileErrors = file.warnings.filter( - (message) => options.emitError && message.severity === 'error', - ); - - if (fileErrors.length > 0) { - errors.push({ - ...file, - warnings: fileErrors, - }); - } - - const fileWarnings = file.warnings.filter( - (message) => options.emitWarning && message.severity === 'warning', - ); - - if (fileWarnings.length > 0) { - warnings.push({ - ...file, - warnings: fileWarnings, - }); - } - }); - - return { - errors, - warnings, + lint, + report, + threads, }; } -/** - * @param {Stylelint} stylelint - * @param {FormatterType=} formatter - * @returns {Promise|Formatter} - */ -function loadFormatter(stylelint, formatter) { - if (typeof formatter === 'function') { - return formatter; - } - - if (typeof formatter === 'string') { - try { - return stylelint.formatters[formatter]; - } catch (_) { - // Load the default formatter. - } - } - - return stylelint.formatters.string; -} - -/** - * @param {LintResult[]} results - * @returns {LintResult[]} - */ -function removeIgnoredWarnings(results) { - return results.filter((result) => !result.ignored); -} - -/** - * @param {Promise[]} results - * @returns {Promise} - */ -async function flatten(results) { - /** - * @param {LintResult[]} acc - * @param {LintResult[]} list - */ - const flat = (acc, list) => [...acc, ...list]; - return (await Promise.all(results)).reduce(flat, []); -} - -/** - * @param {Compilation} compilation - * @returns {LintResultMap} - */ -function getResultStorage({ compiler }) { - let storage = resultStorage.get(compiler); - if (!storage) { - resultStorage.set(compiler, (storage = {})); - } - return storage; -} - -/** - * @param {LintResult[]} lintResults - */ -/* istanbul ignore next */ -function getRuleMetadata(lintResults) { - const [lintResult] = lintResults; - - // eslint-disable-next-line no-undefined - if (lintResult === undefined) return {}; - - // eslint-disable-next-line no-underscore-dangle, no-undefined - if (lintResult._postcssResult === undefined) return {}; - - // eslint-disable-next-line no-underscore-dangle - return lintResult._postcssResult.stylelint.ruleMetadata; -} - module.exports = linter; diff --git a/src/options.js b/src/options.js index 73c707b..7e6313f 100644 --- a/src/options.js +++ b/src/options.js @@ -1,46 +1,46 @@ -const { validate } = require('schema-utils'); +const { validate } = require("schema-utils"); -const schema = require('./options.json'); +const schema = require("./options.json"); /** @typedef {import('./getStylelint').LinterOptions} StylelintOptions */ /** @typedef {import('./getStylelint').FormatterType} FormatterType */ /** - * @typedef {Object} OutputReport - * @property {string=} filePath - * @property {FormatterType=} formatter + * @typedef {object} OutputReport + * @property {string=} filePath file path + * @property {FormatterType=} formatter formatter */ /** - * @typedef {Object} PluginOptions - * @property {string} context - * @property {boolean} emitError - * @property {boolean} emitWarning - * @property {string|string[]=} exclude - * @property {string|string[]} extensions - * @property {boolean} failOnError - * @property {boolean} failOnWarning - * @property {string|string[]} files - * @property {FormatterType} formatter - * @property {boolean} lintDirtyModulesOnly - * @property {boolean} quiet - * @property {string} stylelintPath - * @property {OutputReport} outputReport - * @property {number|boolean=} threads + * @typedef {object} PluginOptions + * @property {string} context a string indicating the root of your files + * @property {boolean} emitError the errors found will always be emitted + * @property {boolean} emitWarning the warnings found will always be emitted + * @property {string | string[]=} exclude specify the files and/or directories to exclude + * @property {string | string[]} extensions specify the extensions that should be checked + * @property {boolean} failOnError will cause the module build to fail if there are any errors + * @property {boolean} failOnWarning will cause the module build to fail if there are any warning + * @property {string | string[]} files specify directories, files, or globs + * @property {FormatterType} formatter specify the formatter you would like to use to format your results + * @property {boolean} lintDirtyModulesOnly lint only changed files, skip linting on start + * @property {boolean} quiet will process and report errors only and ignore warnings + * @property {string} stylelintPath path to `stylelint` instance that will be used for linting + * @property {OutputReport} outputReport writes the output of the errors to a file - for example, a `json` file for use for reporting + * @property {number | boolean=} threads number of worker threads */ /** @typedef {Partial} Options */ /** - * @param {Options} pluginOptions - * @returns {Partial} + * @param {Options} pluginOptions plugin options + * @returns {Partial} partial plugin options */ function getOptions(pluginOptions) { const options = { cache: true, cacheLocation: - 'node_modules/.cache/stylelint-webpack-plugin/.stylelintcache', - extensions: ['css', 'scss', 'sass'], + "node_modules/.cache/stylelint-webpack-plugin/.stylelintcache", + extensions: ["css", "scss", "sass"], emitError: true, emitWarning: true, failOnError: true, @@ -48,18 +48,18 @@ function getOptions(pluginOptions) { ...(pluginOptions.quiet ? { emitError: true, emitWarning: false } : {}), }; - // @ts-ignore + // @ts-expect-error need better types validate(schema, options, { - name: 'Stylelint Webpack Plugin', - baseDataPath: 'options', + name: "Stylelint Webpack Plugin", + baseDataPath: "options", }); return options; } /** - * @param {Options} pluginOptions - * @returns {Partial} + * @param {Options} pluginOptions plugin options + * @returns {Partial} stylelint options */ function getStylelintOptions(pluginOptions) { const stylelintOptions = { ...pluginOptions }; @@ -68,9 +68,8 @@ function getStylelintOptions(pluginOptions) { const { files, formatter, ...stylelintOnlyOptions } = schema.properties; // No need to guard the for-in because schema.properties has hardcoded keys. - // eslint-disable-next-line guard-for-in for (const option in stylelintOnlyOptions) { - // @ts-ignore + // @ts-expect-error need better types delete stylelintOptions[option]; } diff --git a/src/utils.js b/src/utils.js index 1b9b0cc..8b79ced 100644 --- a/src/utils.js +++ b/src/utils.js @@ -1,55 +1,55 @@ -const { resolve } = require('path'); -const { statSync } = require('fs'); +/** @typedef {import('./index').EXPECTED_ANY} EXPECTED_ANY */ -const normalizePath = require('normalize-path'); +const { statSync } = require("node:fs"); +const { resolve } = require("node:path"); + +const normalizePath = require("normalize-path"); /** * @template T - * @param {T} value - * @return { - T extends (null | undefined) - ? [] - : T extends string - ? [string] - : T extends readonly unknown[] - ? T - : T extends Iterable - ? T[] - : [T] - } + * @typedef {T extends (null | undefined) + * ? [] + * : T extends string + * ? [string] + * : T extends readonly unknown[] + * ? T + * : T extends Iterable + * ? T[] + * : [T]} ArrifyResult */ + /* istanbul ignore next */ +/** + * @template T + * @param {T} value value + * @returns {ArrifyResult} array of values + */ function arrify(value) { - // eslint-disable-next-line no-undefined if (value === null || value === undefined) { - // @ts-ignore - return []; + return /** @type {ArrifyResult} */ ([]); } if (Array.isArray(value)) { - // @ts-ignore - return value; + return /** @type {ArrifyResult} */ (value); } - if (typeof value === 'string') { - // @ts-ignore - return [value]; + if (typeof value === "string") { + return /** @type {ArrifyResult} */ ([value]); } - // @ts-ignore - if (typeof value[Symbol.iterator] === 'function') { - // @ts-ignore + // @ts-expect-error need better types + if (typeof value[Symbol.iterator] === "function") { + // @ts-expect-error need better types return [...value]; } - // @ts-ignore - return [value]; + return /** @type {ArrifyResult} */ ([value]); } /** - * @param {string|string[]} files - * @param {string} context - * @returns {string[]} + * @param {string | string[]} files files + * @param {string} context context + * @returns {string[]} normlized paths */ function parseFiles(files, context) { return arrify(files).map((/** @type {string} */ file) => @@ -58,16 +58,16 @@ function parseFiles(files, context) { } /** - * @param {string|string[]} patterns - * @param {string|string[]} extensions - * @returns {string[]} + * @param {string | string[]} patterns patterns + * @param {string | string[]} extensions extensions + * @returns {string[]} globs */ function parseFoldersToGlobs(patterns, extensions = []) { const extensionsList = arrify(extensions); - const [prefix, postfix] = extensionsList.length > 1 ? ['{', '}'] : ['', '']; + const [prefix, postfix] = extensionsList.length > 1 ? ["{", "}"] : ["", ""]; const extensionsGlob = extensionsList - .map((/** @type {string} */ extension) => extension.replace(/^\./u, '')) - .join(','); + .map((/** @type {string} */ extension) => extension.replace(/^\./u, "")) + .join(","); return arrify(patterns).map((/** @type {string} */ pattern) => { try { @@ -78,11 +78,11 @@ function parseFoldersToGlobs(patterns, extensions = []) { return pattern.replace( /[/\\]*?$/u, `/**${ - extensionsGlob ? `/*.${prefix + extensionsGlob + postfix}` : '' + extensionsGlob ? `/*.${prefix + extensionsGlob + postfix}` : "" }`, ); } - } catch (_) { + } catch { // Return the pattern as is on error. } return pattern; @@ -90,29 +90,29 @@ function parseFoldersToGlobs(patterns, extensions = []) { } /** - * * @param {string} _ key, but unused - * @param {any} value + * @param {EXPECTED_ANY} value value + * @returns {{ [x: string]: EXPECTED_ANY }} result */ const jsonStringifyReplacerSortKeys = (_, value) => { /** - * @param {{ [x: string]: any; }} sorted - * @param {string | number} key + * @param {{ [x: string]: EXPECTED_ANY }} sorted sorted + * @param {string | number} key key + * @returns {{ [x: string]: EXPECTED_ANY }} result */ const insert = (sorted, key) => { - // eslint-disable-next-line no-param-reassign sorted[key] = value[key]; return sorted; }; - return value instanceof Object && !(value instanceof Array) + return value instanceof Object && !Array.isArray(value) ? Object.keys(value).sort().reduce(insert, {}) : value; }; module.exports = { arrify, + jsonStringifyReplacerSortKeys, parseFiles, parseFoldersToGlobs, - jsonStringifyReplacerSortKeys, }; diff --git a/src/worker.js b/src/worker.js index 398b811..8480d08 100644 --- a/src/worker.js +++ b/src/worker.js @@ -1,12 +1,8 @@ /** @typedef {import('./getStylelint').Stylelint} Stylelint */ /** @typedef {import('./getStylelint').LinterOptions} StylelintOptions */ +/** @typedef {import('./getStylelint').LintResult} LintResult */ /** @typedef {import('./options').Options} Options */ -Object.assign(module.exports, { - lintFiles, - setup, -}); - /** @type {Stylelint} */ let stylelint; @@ -14,18 +10,20 @@ let stylelint; let linterOptions; /** - * @param {Options} options - * @param {Partial} stylelintOptions + * @param {Options} options the worker options + * @param {Partial} stylelintOptions the stylelint options + * @returns {Stylelint} stylelint instance */ function setup(options, stylelintOptions) { - stylelint = require(options.stylelintPath || 'stylelint'); + stylelint = require(options.stylelintPath || "stylelint"); linterOptions = stylelintOptions; return stylelint; } /** - * @param {string | string[]} files + * @param {string | string[]} files files + * @returns {Promise} results */ async function lintFiles(files) { const { results } = await stylelint.lint({ @@ -35,14 +33,16 @@ async function lintFiles(files) { }); // Reset result to work with worker - return results.map((result) => { - return { - source: result.source, - errored: result.errored, - ignored: result.ignored, - warnings: result.warnings, - deprecations: result.deprecations, - invalidOptionWarnings: result.invalidOptionWarnings, - }; - }); + return results.map((result) => ({ + source: result.source, + errored: result.errored, + ignored: result.ignored, + warnings: result.warnings, + deprecations: result.deprecations, + invalidOptionWarnings: result.invalidOptionWarnings, + parseErrors: result.parseErrors, + })); } + +module.exports.lintFiles = lintFiles; +module.exports.setup = setup; diff --git a/test/context.test.js b/test/context.test.js index aa1a6f6..fceb5b3 100644 --- a/test/context.test.js +++ b/test/context.test.js @@ -1,19 +1,19 @@ -import { join } from 'path'; +import { join } from "node:path"; -import pack from './utils/pack'; +import pack from "./utils/pack"; -describe('context', () => { - it('absolute', async () => { - const compiler = pack('good', { - context: join(__dirname, 'fixtures/good'), +describe("context", () => { + it("absolute", async () => { + const compiler = pack("good", { + context: join(__dirname, "fixtures/good"), }); const stats = await compiler.runAsync(); expect(stats.hasWarnings()).toBe(false); expect(stats.hasErrors()).toBe(false); }); - it('relative', async () => { - const compiler = pack('good', { context: '../good/' }); + it("relative", async () => { + const compiler = pack("good", { context: "../good/" }); const stats = await compiler.runAsync(); expect(stats.hasWarnings()).toBe(false); expect(stats.hasErrors()).toBe(false); diff --git a/test/emit-error.test.js b/test/emit-error.test.js index 4ea8d27..a40204a 100644 --- a/test/emit-error.test.js +++ b/test/emit-error.test.js @@ -1,26 +1,26 @@ -import pack from './utils/pack'; +import pack from "./utils/pack"; -describe('emit error', () => { - it('should not emit errors if emitError is false', async () => { - const compiler = pack('error', { emitError: false }); +describe("emit error", () => { + it("should not emit errors if emitError is false", async () => { + const compiler = pack("error", { emitError: false }); const stats = await compiler.runAsync(); expect(stats.hasErrors()).toBe(false); }); - it('should emit errors if emitError is undefined', async () => { - const compiler = pack('error'); + it("should emit errors if emitError is undefined", async () => { + const compiler = pack("error"); const stats = await compiler.runAsync(); expect(stats.hasErrors()).toBe(true); }); - it('should emit errors if emitError is true', async () => { - const compiler = pack('error', { emitError: true }); + it("should emit errors if emitError is true", async () => { + const compiler = pack("error", { emitError: true }); const stats = await compiler.runAsync(); expect(stats.hasErrors()).toBe(true); }); - it('should emit errors, but not warnings if emitError is true and emitWarning is false', async () => { - const compiler = pack('full-of-problems', { + it("should emit errors, but not warnings if emitError is true and emitWarning is false", async () => { + const compiler = pack("full-of-problems", { emitError: true, emitWarning: false, }); @@ -30,8 +30,8 @@ describe('emit error', () => { expect(stats.hasErrors()).toBe(true); }); - it('should emit errors and warnings if emitError is true and emitWarning is undefined', async () => { - const compiler = pack('full-of-problems', { emitError: true }); + it("should emit errors and warnings if emitError is true and emitWarning is undefined", async () => { + const compiler = pack("full-of-problems", { emitError: true }); const stats = await compiler.runAsync(); expect(stats.hasWarnings()).toBe(true); expect(stats.hasErrors()).toBe(true); diff --git a/test/emit-warning.test.js b/test/emit-warning.test.js index dfbb07f..3b156be 100644 --- a/test/emit-warning.test.js +++ b/test/emit-warning.test.js @@ -1,26 +1,26 @@ -import pack from './utils/pack'; +import pack from "./utils/pack"; -describe('emit warning', () => { - it('should not emit warnings if emitWarning is false', async () => { - const compiler = pack('warning', { emitWarning: false }); +describe("emit warning", () => { + it("should not emit warnings if emitWarning is false", async () => { + const compiler = pack("warning", { emitWarning: false }); const stats = await compiler.runAsync(); expect(stats.hasWarnings()).toBe(false); }); - it('should emit warnings if emitWarning is undefined', async () => { - const compiler = pack('warning'); + it("should emit warnings if emitWarning is undefined", async () => { + const compiler = pack("warning"); const stats = await compiler.runAsync(); expect(stats.hasWarnings()).toBe(true); }); - it('should emit warnings if emitWarning is true', async () => { - const compiler = pack('warning', { emitWarning: true }); + it("should emit warnings if emitWarning is true", async () => { + const compiler = pack("warning", { emitWarning: true }); const stats = await compiler.runAsync(); expect(stats.hasWarnings()).toBe(true); }); - it('should emit warnings, but not warnings if emitWarning is true and emitError is false', async () => { - const compiler = pack('full-of-problems', { + it("should emit warnings, but not warnings if emitWarning is true and emitError is false", async () => { + const compiler = pack("full-of-problems", { emitWarning: true, emitError: false, }); @@ -29,8 +29,8 @@ describe('emit warning', () => { expect(stats.hasErrors()).toBe(false); }); - it('should emit warnings and errors if emitWarning is true and emitError is undefined', async () => { - const compiler = pack('full-of-problems', { emitWarning: true }); + it("should emit warnings and errors if emitWarning is true and emitError is undefined", async () => { + const compiler = pack("full-of-problems", { emitWarning: true }); const stats = await compiler.runAsync(); expect(stats.hasWarnings()).toBe(true); expect(stats.hasErrors()).toBe(true); diff --git a/test/empty.test.js b/test/empty.test.js index 7f22800..e8e822d 100644 --- a/test/empty.test.js +++ b/test/empty.test.js @@ -1,11 +1,11 @@ -import StylelintWebpackPlugin from '../src'; +import StylelintWebpackPlugin from "../src"; -import pack from './utils/pack'; +import pack from "./utils/pack"; -describe('empty', () => { - it('no error when no files matching', async () => { +describe("empty", () => { + it("no error when no files matching", async () => { const compiler = pack( - 'empty', + "empty", {}, { plugins: [new StylelintWebpackPlugin()], diff --git a/test/error.test.js b/test/error.test.js index 3fcbf69..6c01fbe 100644 --- a/test/error.test.js +++ b/test/error.test.js @@ -1,23 +1,23 @@ -import pack from './utils/pack'; +import pack from "./utils/pack"; -describe('error', () => { +describe("error", () => { afterEach(() => { jest.restoreAllMocks(); }); - it('should return error if file is bad', async () => { - const compiler = pack('error'); + it("should return error if file is bad", async () => { + const compiler = pack("error"); const stats = await compiler.runAsync(); expect(stats.hasWarnings()).toBe(false); expect(stats.hasErrors()).toBe(true); }); - it('should propagate stylelint exceptions as errors', async () => { - jest.mock('stylelint', () => { - throw new Error('Oh no!'); + it("should propagate stylelint exceptions as errors", async () => { + jest.mock("stylelint", () => { + throw new Error("Oh no!"); }); - const compiler = pack('good'); + const compiler = pack("good"); const stats = await compiler.runAsync(); expect(stats.hasWarnings()).toBe(false); expect(stats.hasErrors()).toBe(true); diff --git a/test/exclude.test.js b/test/exclude.test.js index 02ded52..56ce18c 100644 --- a/test/exclude.test.js +++ b/test/exclude.test.js @@ -1,22 +1,22 @@ -import pack from './utils/pack'; +import pack from "./utils/pack"; -describe('exclude', () => { - it('should exclude with globs', async () => { - const compiler = pack('exclude', { exclude: ['*test*'] }); +describe("exclude", () => { + it("should exclude with globs", async () => { + const compiler = pack("exclude", { exclude: ["*test*"] }); const stats = await compiler.runAsync(); expect(stats.hasWarnings()).toBe(false); expect(stats.hasErrors()).toBe(false); }); - it('should exclude files', async () => { - const compiler = pack('exclude', { exclude: ['test.scss'] }); + it("should exclude files", async () => { + const compiler = pack("exclude", { exclude: ["test.scss"] }); const stats = await compiler.runAsync(); expect(stats.hasWarnings()).toBe(false); expect(stats.hasErrors()).toBe(false); }); - it('should exclude folders', async () => { - const compiler = pack('exclude-folder', { exclude: ['folder'] }); + it("should exclude folders", async () => { + const compiler = pack("exclude-folder", { exclude: ["folder"] }); const stats = await compiler.runAsync(); expect(stats.hasWarnings()).toBe(false); expect(stats.hasErrors()).toBe(false); diff --git a/test/fail-on-config.test.js b/test/fail-on-config.test.js index e683d02..0394c8a 100644 --- a/test/fail-on-config.test.js +++ b/test/fail-on-config.test.js @@ -1,11 +1,11 @@ -import { join } from 'path'; +import { join } from "node:path"; -import pack from './utils/pack'; +import pack from "./utils/pack"; -describe('fail on config', () => { - it('fails when .stylelintrc is not a proper format', async () => { - const configFile = join(__dirname, '.badstylelintrc'); - const compiler = pack('error', { configFile }); +describe("fail on config", () => { + it("fails when .stylelintrc is not a proper format", async () => { + const configFile = join(__dirname, ".badstylelintrc"); + const compiler = pack("error", { configFile }); const stats = await compiler.runAsync(); const { errors } = stats.compilation; expect(stats.hasWarnings()).toBe(false); diff --git a/test/fail-on-error.test.js b/test/fail-on-error.test.js index f02b081..e4d6549 100644 --- a/test/fail-on-error.test.js +++ b/test/fail-on-error.test.js @@ -1,21 +1,21 @@ -import pack from './utils/pack'; +import pack from "./utils/pack"; -describe('fail on error', () => { - it('should emits errors', async () => { - const compiler = pack('error', { failOnError: true }); +describe("fail on error", () => { + it("should emits errors", async () => { + const compiler = pack("error", { failOnError: true }); const stats = await compiler.runAsync(); expect(stats.hasErrors()).toBe(true); }); - it('should emit warnings when disabled', async () => { - const compiler = pack('error', { failOnError: false }); + it("should emit warnings when disabled", async () => { + const compiler = pack("error", { failOnError: false }); const stats = await compiler.runAsync(); expect(stats.hasErrors()).toBe(false); expect(stats.hasWarnings()).toBe(true); }); - it('should correctly indentifies a success', async () => { - const compiler = pack('good', { failOnError: true }); + it("should correctly indentifies a success", async () => { + const compiler = pack("good", { failOnError: true }); const stats = await compiler.runAsync(); expect(stats.hasErrors()).toBe(false); }); diff --git a/test/fail-on-warning.test.js b/test/fail-on-warning.test.js index 9a489ea..0ab7b3c 100644 --- a/test/fail-on-warning.test.js +++ b/test/fail-on-warning.test.js @@ -1,14 +1,14 @@ -import pack from './utils/pack'; +import pack from "./utils/pack"; -describe('fail on warning', () => { - it('should emits errors', async () => { - const compiler = pack('warning', { failOnWarning: true }); +describe("fail on warning", () => { + it("should emits errors", async () => { + const compiler = pack("warning", { failOnWarning: true }); const stats = await compiler.runAsync(); expect(stats.hasErrors()).toBe(true); }); - it('should correctly indentifies a success', async () => { - const compiler = pack('good', { failOnWarning: true }); + it("should correctly indentifies a success", async () => { + const compiler = pack("good", { failOnWarning: true }); const stats = await compiler.runAsync(); expect(stats.hasErrors()).toBe(false); }); diff --git a/test/formatter.test.js b/test/formatter.test.js index ee75c21..7088d79 100644 --- a/test/formatter.test.js +++ b/test/formatter.test.js @@ -1,34 +1,34 @@ -import { formatters } from 'stylelint'; +import { formatters } from "stylelint"; -import pack from './utils/pack'; +import pack from "./utils/pack"; -describe('formatter', () => { - it('should use default formatter', async () => { - const compiler = pack('error'); +describe("formatter", () => { + it("should use default formatter", async () => { + const compiler = pack("error"); const stats = await compiler.runAsync(); expect(stats.hasWarnings()).toBe(false); expect(stats.hasErrors()).toBe(true); expect(stats.compilation.errors[0].message).toBeTruthy(); }); - it('should use default formatter when invalid', async () => { - const compiler = pack('error', { formatter: 'invalid' }); + it("should use default formatter when invalid", async () => { + const compiler = pack("error", { formatter: "invalid" }); const stats = await compiler.runAsync(); expect(stats.hasWarnings()).toBe(false); expect(stats.hasErrors()).toBe(true); expect(stats.compilation.errors[0].message).toBeTruthy(); }); - it('should use string formatter', async () => { - const compiler = pack('error', { formatter: 'json' }); + it("should use string formatter", async () => { + const compiler = pack("error", { formatter: "json" }); const stats = await compiler.runAsync(); expect(stats.hasWarnings()).toBe(false); expect(stats.hasErrors()).toBe(true); expect(stats.compilation.errors[0].message).toBeTruthy(); }); - it('should use function formatter', async () => { - const compiler = pack('error', { formatter: await formatters.verbose }); + it("should use function formatter", async () => { + const compiler = pack("error", { formatter: await formatters.verbose }); const stats = await compiler.runAsync(); expect(stats.hasWarnings()).toBe(false); expect(stats.hasErrors()).toBe(true); diff --git a/test/lint-dirty-modules-only.test.js b/test/lint-dirty-modules-only.test.js index 5e51cf2..a379d92 100644 --- a/test/lint-dirty-modules-only.test.js +++ b/test/lint-dirty-modules-only.test.js @@ -1,13 +1,14 @@ -import { join } from 'path'; +import { join } from "node:path"; -import { writeFileSync, removeSync } from 'fs-extra'; +import { removeSync, writeFileSync } from "fs-extra"; -import pack from './utils/pack'; +import pack from "./utils/pack"; -const target = join(__dirname, 'fixtures/lint-dirty-modules-only/test.scss'); +const target = join(__dirname, "fixtures/lint-dirty-modules-only/test.scss"); -describe('lint dirty modules only', () => { +describe("lint dirty modules only", () => { let watch; + afterEach(() => { if (watch) { watch.close(); @@ -15,34 +16,35 @@ describe('lint dirty modules only', () => { removeSync(target); }); - it('skips linting on initial run', (done) => { - writeFileSync(target, 'body { }\n'); + it("skips linting on initial run", (done) => { + writeFileSync(target, "body { }\n"); + // eslint-disable-next-line no-use-before-define let next = firstPass; - const compiler = pack('lint-dirty-modules-only', { + const compiler = pack("lint-dirty-modules-only", { lintDirtyModulesOnly: true, }); watch = compiler.watch({}, (err, stats) => next(err, stats)); - function firstPass(err, stats) { - expect(err).toBeNull(); - expect(stats.hasWarnings()).toBe(false); - expect(stats.hasErrors()).toBe(false); - - next = secondPass; - - writeFileSync(target, '#stuff { background: black; }\n'); - } - function secondPass(err, stats) { expect(err).toBeNull(); expect(stats.hasWarnings()).toBe(false); expect(stats.hasErrors()).toBe(true); const { errors } = stats.compilation; - expect(errors.length).toBe(1); + expect(errors).toHaveLength(1); const [{ message }] = errors; - expect(message).toEqual(expect.stringMatching('color-named')); + expect(message).toEqual(expect.stringMatching("color-named")); done(); } + + function firstPass(err, stats) { + expect(err).toBeNull(); + expect(stats.hasWarnings()).toBe(false); + expect(stats.hasErrors()).toBe(false); + + next = secondPass; + + writeFileSync(target, "#stuff { background: black; }\n"); + } }); }); diff --git a/test/mock/stylelint/index.js b/test/mock/stylelint/index.js index f5b72dc..041f3b5 100644 --- a/test/mock/stylelint/index.js +++ b/test/mock/stylelint/index.js @@ -9,15 +9,15 @@ module.exports = { return { results: [ { - source: '', + source: "", errored: true, warnings: [ { line: 1, column: 11, - rule: 'fake-error', - severity: 'error', - text: 'Fake error', + rule: "fake-error", + severity: "error", + text: "Fake error", }, ], }, diff --git a/test/multiple-instances.test.js b/test/multiple-instances.test.js index 36755d9..389b123 100644 --- a/test/multiple-instances.test.js +++ b/test/multiple-instances.test.js @@ -1,16 +1,16 @@ -import StylelintPlugin from '../src'; +import StylelintPlugin from "../src"; -import pack from './utils/pack'; +import pack from "./utils/pack"; -describe('multiple instances', () => { +describe("multiple instances", () => { it("should don't fail", async () => { const compiler = pack( - 'multiple', + "multiple", {}, { plugins: [ - new StylelintPlugin({ exclude: 'error.scss' }), - new StylelintPlugin({ exclude: 'error.scss' }), + new StylelintPlugin({ exclude: "error.scss" }), + new StylelintPlugin({ exclude: "error.scss" }), ], }, ); @@ -20,14 +20,14 @@ describe('multiple instances', () => { expect(stats.hasErrors()).toBe(false); }); - it('should fail on first instance', async () => { + it("should fail on first instance", async () => { const compiler = pack( - 'multiple', + "multiple", {}, { plugins: [ - new StylelintPlugin({ exclude: 'good.scss' }), - new StylelintPlugin({ exclude: 'error.scss' }), + new StylelintPlugin({ exclude: "good.scss" }), + new StylelintPlugin({ exclude: "error.scss" }), ], }, ); @@ -37,14 +37,14 @@ describe('multiple instances', () => { expect(stats.hasErrors()).toBe(true); }); - it('should fail on second instance', async () => { + it("should fail on second instance", async () => { const compiler = pack( - 'multiple', + "multiple", {}, { plugins: [ - new StylelintPlugin({ exclude: 'error.scss' }), - new StylelintPlugin({ exclude: 'good.scss' }), + new StylelintPlugin({ exclude: "error.scss" }), + new StylelintPlugin({ exclude: "good.scss" }), ], }, ); diff --git a/test/ok.test.js b/test/ok.test.js index fc558e8..94d0eea 100644 --- a/test/ok.test.js +++ b/test/ok.test.js @@ -1,8 +1,8 @@ -import pack from './utils/pack'; +import pack from "./utils/pack"; -describe('ok', () => { +describe("ok", () => { it("should don't throw error if file is ok", async () => { - const compiler = pack('good'); + const compiler = pack("good"); const stats = await compiler.runAsync(); expect(stats.hasWarnings()).toBe(false); expect(stats.hasErrors()).toBe(false); diff --git a/test/output-report.test.js b/test/output-report.test.js index 3531df5..048b1fb 100644 --- a/test/output-report.test.js +++ b/test/output-report.test.js @@ -1,13 +1,13 @@ -import { join } from 'path'; +import { join } from "node:path"; -import { existsSync, readFileSync } from 'fs-extra'; +import { existsSync, readFileSync } from "fs-extra"; -import pack from './utils/pack'; +import pack from "./utils/pack"; -describe('output report', () => { - it('should output report a default formatter', async () => { - const filePath = 'report.txt'; - const compiler = pack('error', { +describe("output report", () => { + it("should output report a default formatter", async () => { + const filePath = "report.txt"; + const compiler = pack("error", { outputReport: { filePath }, }); const stats = await compiler.runAsync(); @@ -16,20 +16,20 @@ describe('output report', () => { expect(existsSync(join(compiler.outputPath, filePath))).toBe(true); }); - it('should output report with a custom formatter', async () => { - const filePath = join(__dirname, 'output', 'report.json'); - const compiler = pack('error', { + it("should output report with a custom formatter", async () => { + const filePath = join(__dirname, "output", "report.json"); + const compiler = pack("error", { outputReport: { filePath, - formatter: 'json', + formatter: "json", }, }); const stats = await compiler.runAsync(); expect(stats.hasWarnings()).toBe(false); expect(stats.hasErrors()).toBe(true); expect(existsSync(filePath)).toBe(true); - expect(JSON.parse(readFileSync(filePath, 'utf8'))).toMatchObject([ - { source: expect.stringContaining('test.scss') }, + expect(JSON.parse(readFileSync(filePath, "utf8"))).toMatchObject([ + { source: expect.stringContaining("test.scss") }, ]); }); }); diff --git a/test/quiet.test.js b/test/quiet.test.js index a9ace80..5f1e158 100644 --- a/test/quiet.test.js +++ b/test/quiet.test.js @@ -1,15 +1,15 @@ -import pack from './utils/pack'; +import pack from "./utils/pack"; -describe('quiet', () => { - it('should not emit warnings if quiet is set', async () => { - const compiler = pack('warning', { quiet: true }); +describe("quiet", () => { + it("should not emit warnings if quiet is set", async () => { + const compiler = pack("warning", { quiet: true }); const stats = await compiler.runAsync(); expect(stats.hasWarnings()).toBe(false); expect(stats.hasErrors()).toBe(false); }); - it('should emit errors, but not emit warnings if quiet is set', async () => { - const compiler = pack('full-of-problems', { quiet: true }); + it("should emit errors, but not emit warnings if quiet is set", async () => { + const compiler = pack("full-of-problems", { quiet: true }); const stats = await compiler.runAsync(); expect(stats.hasWarnings()).toBe(false); expect(stats.hasErrors()).toBe(true); diff --git a/test/stylelint-ignore.test.js b/test/stylelint-ignore.test.js index 4436d54..eedf46a 100644 --- a/test/stylelint-ignore.test.js +++ b/test/stylelint-ignore.test.js @@ -1,8 +1,8 @@ -import pack from './utils/pack'; +import pack from "./utils/pack"; -describe('stylelint ignore', () => { - it('should ignore file', async () => { - const compiler = pack('stylelint-ignore'); +describe("stylelint ignore", () => { + it("should ignore file", async () => { + const compiler = pack("stylelint-ignore"); const stats = await compiler.runAsync(); expect(stats.hasWarnings()).toBe(false); expect(stats.hasErrors()).toBe(false); diff --git a/test/stylelint-lint.test.js b/test/stylelint-lint.test.js index b05c6b7..043e095 100644 --- a/test/stylelint-lint.test.js +++ b/test/stylelint-lint.test.js @@ -1,39 +1,37 @@ -import pack from './utils/pack'; +import pack from "./utils/pack"; -describe('stylelint lint', () => { +describe("stylelint lint", () => { const mockLintFiles = jest.fn().mockReturnValue({ results: [], }); beforeAll(() => { - jest.mock('stylelint', () => { - return { - lint: mockLintFiles, - }; - }); + jest.mock("stylelint", () => ({ + lint: mockLintFiles, + })); }); beforeEach(() => { mockLintFiles.mockClear(); }); - it('should lint one file', async () => { - const compiler = pack('lint-one', { configFile: null }); + it("should lint one file", async () => { + const compiler = pack("lint-one", { configFile: null }); const stats = await compiler.runAsync(); expect(stats.hasErrors()).toBe(false); - const files = [expect.stringMatching('test.scss')]; + const files = [expect.stringMatching("test.scss")]; expect(mockLintFiles).toHaveBeenCalledWith({ cache: false, cacheLocation: - 'node_modules/.cache/stylelint-webpack-plugin/.stylelintcache', + "node_modules/.cache/stylelint-webpack-plugin/.stylelintcache", configFile: null, files, quietDeprecationWarnings: true, }); }); - it('should lint two files', async () => { - const compiler = pack('lint-two', { configFile: null }); + it("should lint two files", async () => { + const compiler = pack("lint-two", { configFile: null }); const stats = await compiler.runAsync(); expect(stats.hasErrors()).toBe(false); const files = [ @@ -43,7 +41,7 @@ describe('stylelint lint', () => { expect(mockLintFiles).toHaveBeenCalledWith({ cache: false, cacheLocation: - 'node_modules/.cache/stylelint-webpack-plugin/.stylelintcache', + "node_modules/.cache/stylelint-webpack-plugin/.stylelintcache", configFile: null, files, quietDeprecationWarnings: true, diff --git a/test/stylelint-options.test.js b/test/stylelint-options.test.js index 1df0a71..bc9d5e4 100644 --- a/test/stylelint-options.test.js +++ b/test/stylelint-options.test.js @@ -1,21 +1,21 @@ -import { getStylelintOptions } from '../src/options'; +import { getStylelintOptions } from "../src/options"; -describe('eslint options', () => { - it('should filter plugin options', () => { +describe("eslint options", () => { + it("should filter plugin options", () => { const options = { - formatter: 'json', + formatter: "json", emitError: false, }; expect(getStylelintOptions(options)).toStrictEqual({ - formatter: 'json', + formatter: "json", }); }); - it('should keep the stylelint options', () => { + it("should keep the stylelint options", () => { const options = { - stylelintPath: 'some/place/where/stylelint/lives', - formatter: 'json', - files: ['file.scss'], + stylelintPath: "some/place/where/stylelint/lives", + formatter: "json", + files: ["file.scss"], emitError: false, emitWarning: false, failOnError: true, @@ -24,8 +24,8 @@ describe('eslint options', () => { outputReport: true, }; expect(getStylelintOptions(options)).toStrictEqual({ - formatter: 'json', - files: ['file.scss'], + formatter: "json", + files: ["file.scss"], }); }); }); diff --git a/test/stylelint-path.test.js b/test/stylelint-path.test.js index ba39ed7..1ab416b 100644 --- a/test/stylelint-path.test.js +++ b/test/stylelint-path.test.js @@ -1,14 +1,14 @@ -import { join } from 'path'; +import { join } from "node:path"; -import pack from './utils/pack'; +import pack from "./utils/pack"; -describe('stylelint path', () => { - it('should use another instance of stylelint via stylelintPath config', async () => { - const stylelintPath = join(__dirname, 'mock/stylelint'); - const compiler = pack('stylelint-path', { stylelintPath }); +describe("stylelint path", () => { + it("should use another instance of stylelint via stylelintPath config", async () => { + const stylelintPath = join(__dirname, "mock/stylelint"); + const compiler = pack("stylelint-path", { stylelintPath }); const stats = await compiler.runAsync(); expect(stats.hasWarnings()).toBe(false); expect(stats.hasErrors()).toBe(true); - expect(stats.compilation.errors[0].message).toContain('Fake error'); + expect(stats.compilation.errors[0].message).toContain("Fake error"); }); }); diff --git a/test/symbols.test.js b/test/symbols.test.js index 6378a3d..7655fe5 100644 --- a/test/symbols.test.js +++ b/test/symbols.test.js @@ -1,8 +1,8 @@ -import pack from './utils/pack'; +import pack from "./utils/pack"; -describe('symbols', () => { - it('should return error', async () => { - const compiler = pack('[symbols]'); +describe("symbols", () => { + it("should return error", async () => { + const compiler = pack("[symbols]"); const stats = await compiler.runAsync(); expect(stats.hasWarnings()).toBe(false); expect(stats.hasErrors()).toBe(true); diff --git a/test/threads.test.js b/test/threads.test.js index bb677ce..d553ffb 100644 --- a/test/threads.test.js +++ b/test/threads.test.js @@ -1,23 +1,23 @@ -import { join } from 'path'; +import { join } from "node:path"; -// @ts-ignore -import normalizePath from 'normalize-path'; +// @ts-expect-error no types +import normalizePath from "normalize-path"; -import getStylelint from '../src/getStylelint'; +import getStylelint from "../src/getStylelint"; -import pack from './utils/pack'; +import pack from "./utils/pack"; -describe('Threading', () => { +describe("Threading", () => { it("should don't throw error if file is ok with threads", async () => { - const compiler = pack('good', { threads: 2 }); + const compiler = pack("good", { threads: 2 }); const stats = await compiler.runAsync(); expect(stats.hasWarnings()).toBe(false); expect(stats.hasErrors()).toBe(false); }); - test('Threaded interface should look like non-threaded interface', async () => { - const single = getStylelint('single', {}); - const threaded = getStylelint('threaded', { threads: 2 }); + it("threaded interface should look like non-threaded interface", async () => { + const single = getStylelint("single", {}); + const threaded = getStylelint("threaded", { threads: 2 }); for (const key of Object.keys(single)) { expect(typeof single[key]).toEqual(typeof threaded[key]); } @@ -29,15 +29,15 @@ describe('Threading', () => { threaded.cleanup(); }); - test('Threaded should lint files', async () => { - const threaded = getStylelint('bar', { threads: true }); + it("threaded should lint files", async () => { + const threaded = getStylelint("bar", { threads: true }); try { const [good, bad] = await Promise.all([ threaded.lintFiles( - normalizePath(join(__dirname, 'fixtures/good/test.scss')), + normalizePath(join(__dirname, "fixtures/good/test.scss")), ), threaded.lintFiles( - normalizePath(join(__dirname, 'fixtures/error/test.scss')), + normalizePath(join(__dirname, "fixtures/error/test.scss")), ), ]); expect(good[0].errored).toBe(false); @@ -47,29 +47,28 @@ describe('Threading', () => { } }); - describe('worker coverage', () => { + describe("worker coverage", () => { beforeEach(() => { jest.resetModules(); }); - test('worker can start', async () => { - const { setup, lintFiles } = require('../src/worker'); + it("worker can start", async () => { + const { lintFiles, setup } = require("../src/worker"); + const mockThread = { parentPort: { on: jest.fn() }, workerData: {} }; const mockLintFiles = jest.fn().mockReturnValue({ results: [], }); - jest.mock('worker_threads', () => mockThread); - jest.mock('stylelint', () => { - return { lint: mockLintFiles }; - }); + jest.mock("worker_threads", () => mockThread); + jest.mock("stylelint", () => ({ lint: mockLintFiles })); setup({}); - await lintFiles('foo'); + await lintFiles("foo"); expect(mockLintFiles).toHaveBeenCalledWith({ - files: 'foo', + files: "foo", quietDeprecationWarnings: true, }); }); diff --git a/test/utils.test.js b/test/utils.test.js index 5a7b30b..b783002 100644 --- a/test/utils.test.js +++ b/test/utils.test.js @@ -1,53 +1,52 @@ -import { parseFoldersToGlobs, parseFiles } from '../src/utils'; +import { parseFiles, parseFoldersToGlobs } from "../src/utils"; -jest.mock('fs', () => { - return { - statSync(pattern) { - return { - isDirectory() { - return pattern.indexOf('/path/') === 0; - }, - }; - }, - }; -}); +jest.mock("fs", () => ({ + statSync(pattern) { + return { + isDirectory() { + return pattern.indexOf("/path/") === 0; + }, + }; + }, +})); -test('parseFiles should return relative files from context', () => { - expect( - parseFiles( - ['**/*', '../package-a/src/**/', '../package-b/src/**/'], - 'main/src', - ), - ).toEqual( - expect.arrayContaining([ - expect.stringContaining('main/src/**/*'), - expect.stringContaining('main/package-a/src/**'), - expect.stringContaining('main/package-b/src/**'), - ]), - ); -}); +describe("utils test", () => { + it("parseFiles should return relative files from context", () => { + expect( + parseFiles( + ["**/*", "../package-a/src/**/", "../package-b/src/**/"], + "main/src", + ), + ).toEqual( + expect.arrayContaining([ + expect.stringContaining("main/src/**/*"), + expect.stringContaining("main/package-a/src/**"), + expect.stringContaining("main/package-b/src/**"), + ]), + ); + }); -test('parseFoldersToGlobs should return globs for folders', () => { - const withoutSlash = '/path/to/code'; - const withSlash = `${withoutSlash}/`; + it("parseFoldersToGlobs should return globs for folders", () => { + const withoutSlash = "/path/to/code"; + const withSlash = `${withoutSlash}/`; - expect(parseFoldersToGlobs(withoutSlash, 'css')).toMatchInlineSnapshot(` + expect(parseFoldersToGlobs(withoutSlash, "css")).toMatchInlineSnapshot(` [ "/path/to/code/**/*.css", ] `); - expect(parseFoldersToGlobs(withSlash, 'scss')).toMatchInlineSnapshot(` + expect(parseFoldersToGlobs(withSlash, "scss")).toMatchInlineSnapshot(` [ "/path/to/code/**/*.scss", ] `); - expect( - parseFoldersToGlobs( - [withoutSlash, withSlash, '/some/file.scss'], - ['scss', 'css', 'sass'], - ), - ).toMatchInlineSnapshot(` + expect( + parseFoldersToGlobs( + [withoutSlash, withSlash, "/some/file.scss"], + ["scss", "css", "sass"], + ), + ).toMatchInlineSnapshot(` [ "/path/to/code/**/*.{scss,css,sass}", "/path/to/code/**/*.{scss,css,sass}", @@ -55,23 +54,24 @@ test('parseFoldersToGlobs should return globs for folders', () => { ] `); - expect(parseFoldersToGlobs(withoutSlash)).toMatchInlineSnapshot(` + expect(parseFoldersToGlobs(withoutSlash)).toMatchInlineSnapshot(` [ "/path/to/code/**", ] `); - expect(parseFoldersToGlobs(withSlash)).toMatchInlineSnapshot(` + expect(parseFoldersToGlobs(withSlash)).toMatchInlineSnapshot(` [ "/path/to/code/**", ] `); -}); + }); -test('parseFoldersToGlobs should return unmodified globs for globs (ignoring extensions)', () => { - expect(parseFoldersToGlobs('**.notcss', 'css')).toMatchInlineSnapshot(` + it("parseFoldersToGlobs should return unmodified globs for globs (ignoring extensions)", () => { + expect(parseFoldersToGlobs("**.notcss", "css")).toMatchInlineSnapshot(` [ "**.notcss", ] `); + }); }); diff --git a/test/utils/conf.js b/test/utils/conf.js index 3b735fb..25b68b0 100644 --- a/test/utils/conf.js +++ b/test/utils/conf.js @@ -1,21 +1,21 @@ -import { join } from 'path'; +import { join } from "node:path"; -import StylelintPlugin from '../../src/index'; +import StylelintPlugin from "../../src/index"; export default (context, pluginConf = {}, webpackConf = {}) => { - const testDir = join(__dirname, '..'); + const testDir = join(__dirname, ".."); return { - context: join(testDir, 'fixtures', context), - mode: 'development', - entry: './index', + context: join(testDir, "fixtures", context), + mode: "development", + entry: "./index", output: { - path: join(testDir, 'output'), + path: join(testDir, "output"), }, plugins: [ new StylelintPlugin({ cache: false, - configFile: join(testDir, '.stylelintrc'), + configFile: join(testDir, ".stylelintrc"), ...pluginConf, }), ], diff --git a/test/utils/pack.js b/test/utils/pack.js index be2a568..cfadb22 100644 --- a/test/utils/pack.js +++ b/test/utils/pack.js @@ -1,6 +1,6 @@ -import webpack from 'webpack'; +import webpack from "webpack"; -import conf from './conf'; +import conf from "./conf"; export default (context, pluginConf = {}, webpackConf = {}) => { const compiler = webpack(conf(context, pluginConf, webpackConf)); diff --git a/test/warning.test.js b/test/warning.test.js index 4573b95..9d97b00 100644 --- a/test/warning.test.js +++ b/test/warning.test.js @@ -1,8 +1,8 @@ -import pack from './utils/pack'; +import pack from "./utils/pack"; -describe('warning', () => { - it('should emit warnings', async () => { - const compiler = pack('warning'); +describe("warning", () => { + it("should emit warnings", async () => { + const compiler = pack("warning"); const stats = await compiler.runAsync(); expect(stats.hasWarnings()).toBe(true); expect(stats.hasErrors()).toBe(false); diff --git a/test/watch.test.js b/test/watch.test.js index 55a534c..2a69ee2 100644 --- a/test/watch.test.js +++ b/test/watch.test.js @@ -1,14 +1,15 @@ -import { join } from 'path'; +import { join } from "node:path"; -import { writeFileSync, removeSync } from 'fs-extra'; +import { removeSync, writeFileSync } from "fs-extra"; -import pack from './utils/pack'; +import pack from "./utils/pack"; -const target = join(__dirname, 'fixtures', 'watch', 'entry.scss'); -const target2 = join(__dirname, 'fixtures', 'watch', 'leaf.scss'); +const target = join(__dirname, "fixtures", "watch", "entry.scss"); +const target2 = join(__dirname, "fixtures", "watch", "leaf.scss"); -describe('watch', () => { +describe("watch", () => { let watch; + afterEach(() => { if (watch) { watch.close(); @@ -17,8 +18,8 @@ describe('watch', () => { removeSync(target2); }); - it('should watch', (done) => { - const compiler = pack('good'); + it("should watch", (done) => { + const compiler = pack("good"); watch = compiler.watch({}, (err, stats) => { expect(err).toBeNull(); @@ -28,27 +29,34 @@ describe('watch', () => { }); }); - it('should watch with unique messages', (done) => { - writeFileSync(target, '#foo { background: black; }\n'); - writeFileSync(target2, ''); + it("should watch with unique messages", (done) => { + writeFileSync(target, "#foo { background: black; }\n"); + writeFileSync(target2, ""); + // eslint-disable-next-line no-use-before-define let next = firstPass; - const compiler = pack('watch'); + const compiler = pack("watch"); watch = compiler.watch({}, (err, stats) => next(err, stats)); - function firstPass(err, stats) { + function finish(err, stats) { + expect(err).toBeNull(); + expect(stats.hasWarnings()).toBe(false); + expect(stats.hasErrors()).toBe(false); + done(); + } + + function thirdPass(err, stats) { expect(err).toBeNull(); expect(stats.hasWarnings()).toBe(false); expect(stats.hasErrors()).toBe(true); const { errors } = stats.compilation; - expect(errors.length).toBe(1); + expect(errors).toHaveLength(1); const [{ message }] = errors; - expect(message).toEqual(expect.stringMatching('entry.scss')); - expect(message).not.toEqual(expect.stringMatching('leaf.scss')); + expect(message).toEqual(expect.stringMatching("entry.scss")); + expect(message).not.toEqual(expect.stringMatching("leaf.scss")); - next = secondPass; - writeFileSync(target2, '#bar { background: black; }\n'); - writeFileSync(target, '#foo { background: black; }\n'); + next = finish; + writeFileSync(target, "#bar { background: #000000; }\n"); } function secondPass(err, stats) { @@ -56,34 +64,28 @@ describe('watch', () => { expect(stats.hasWarnings()).toBe(false); expect(stats.hasErrors()).toBe(true); const { errors } = stats.compilation; - expect(errors.length).toBe(1); + expect(errors).toHaveLength(1); const [{ message }] = errors; - expect(message).toEqual(expect.stringMatching('entry.scss')); - expect(message).toEqual(expect.stringMatching('leaf.scss')); + expect(message).toEqual(expect.stringMatching("entry.scss")); + expect(message).toEqual(expect.stringMatching("leaf.scss")); next = thirdPass; - writeFileSync(target2, '#bar { background: #000000; }\n'); + writeFileSync(target2, "#bar { background: #000000; }\n"); } - function thirdPass(err, stats) { + function firstPass(err, stats) { expect(err).toBeNull(); expect(stats.hasWarnings()).toBe(false); expect(stats.hasErrors()).toBe(true); const { errors } = stats.compilation; - expect(errors.length).toBe(1); + expect(errors).toHaveLength(1); const [{ message }] = errors; - expect(message).toEqual(expect.stringMatching('entry.scss')); - expect(message).not.toEqual(expect.stringMatching('leaf.scss')); - - next = finish; - writeFileSync(target, '#bar { background: #000000; }\n'); - } + expect(message).toEqual(expect.stringMatching("entry.scss")); + expect(message).not.toEqual(expect.stringMatching("leaf.scss")); - function finish(err, stats) { - expect(err).toBeNull(); - expect(stats.hasWarnings()).toBe(false); - expect(stats.hasErrors()).toBe(false); - done(); + next = secondPass; + writeFileSync(target2, "#bar { background: black; }\n"); + writeFileSync(target, "#foo { background: black; }\n"); } }); }); diff --git a/types/StylelintError.d.ts b/types/StylelintError.d.ts index 5e0339f..0590016 100644 --- a/types/StylelintError.d.ts +++ b/types/StylelintError.d.ts @@ -1,7 +1,7 @@ export = StylelintError; declare class StylelintError extends Error { /** - * @param {string=} messages + * @param {string=} messages messages */ constructor(messages?: string | undefined); stack: string; diff --git a/types/getStylelint.d.ts b/types/getStylelint.d.ts index 136b966..4eb02cc 100644 --- a/types/getStylelint.d.ts +++ b/types/getStylelint.d.ts @@ -1,8 +1,8 @@ export = getStylelint; /** - * @param {string|undefined} key - * @param {Options} options - * @returns {Linter} + * @param {string|undefined} key a cache key + * @param {Options} options options + * @returns {Linter} linter */ declare function getStylelint( key: string | undefined, @@ -16,6 +16,7 @@ declare namespace getStylelint { LinterResult, Formatter, FormatterType, + RuleMeta, Options, AsyncTask, LintTask, @@ -29,12 +30,13 @@ type Stylelint = { [k: string]: Formatter; }; }; -type LintResult = import('stylelint').LintResult; -type LinterOptions = import('stylelint').LinterOptions; -type LinterResult = import('stylelint').LinterResult; -type Formatter = import('stylelint').Formatter; -type FormatterType = import('stylelint').FormatterType; -type Options = import('./options').Options; +type LintResult = import("stylelint").LintResult; +type LinterOptions = import("stylelint").LinterOptions; +type LinterResult = import("stylelint").LinterResult; +type Formatter = import("stylelint").Formatter; +type FormatterType = import("stylelint").FormatterType; +type RuleMeta = import("stylelint").RuleMeta; +type Options = import("./options").Options; type AsyncTask = () => Promise; type LintTask = (files: string | string[]) => Promise; type Linter = { @@ -46,4 +48,4 @@ type Linter = { type Worker = JestWorker & { lintFiles: LintTask; }; -import { Worker as JestWorker } from 'jest-worker'; +import { Worker as JestWorker } from "jest-worker"; diff --git a/types/index.d.ts b/types/index.d.ts index 24b792c..8509c47 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -1,16 +1,16 @@ export = StylelintWebpackPlugin; declare class StylelintWebpackPlugin { /** - * @param {Options} options + * @param {Options=} options options */ - constructor(options?: Options); + constructor(options?: Options | undefined); key: string; - options: Partial; + options: Partial; /** - * @param {Compiler} compiler - * @param {Options} options - * @param {string[]} wanted - * @param {string[]} exclude + * @param {Compiler} compiler compiler + * @param {Options} options options + * @param {string[]} wanted wanted files + * @param {string[]} exclude exclude files */ run( compiler: Compiler, @@ -21,26 +21,26 @@ declare class StylelintWebpackPlugin { startTime: number; prevTimestamps: Map; /** - * @param {Compiler} compiler + * @param {Compiler} compiler compiler * @returns {void} */ apply(compiler: Compiler): void; /** - * - * @param {Compiler} compiler - * @returns {string} + * @param {Compiler} compiler compiler + * @returns {string} context */ getContext(compiler: Compiler): string; } declare namespace StylelintWebpackPlugin { - export { Compiler, Module, Options, FileSystemInfoEntry }; + export { Compiler, Module, Options, FileSystemInfoEntry, EXPECTED_ANY }; } -type Compiler = import('webpack').Compiler; -type Module = import('webpack').Module; -type Options = import('./options').Options; +type Compiler = import("webpack").Compiler; +type Module = import("webpack").Module; +type Options = import("./options").Options; type FileSystemInfoEntry = Partial< | { timestamp: number; } | number >; +type EXPECTED_ANY = any; diff --git a/types/linter.d.ts b/types/linter.d.ts index fefd6fa..8ee757b 100644 --- a/types/linter.d.ts +++ b/types/linter.d.ts @@ -1,9 +1,9 @@ export = linter; /** - * @param {string|undefined} key - * @param {Options} options - * @param {Compilation} compilation - * @returns {{lint: Linter, report: Reporter, threads: number}} + * @param {string | undefined} key a cache key + * @param {Options} options options + * @param {Compilation} compilation compilation + * @returns {{ lint: Linter, report: Reporter, threads: number }} the linter with additional functions */ declare function linter( key: string | undefined, @@ -23,6 +23,7 @@ declare namespace linter { LinterResult, Formatter, FormatterType, + RuleMeta, Options, GenerateReport, Report, @@ -31,14 +32,15 @@ declare namespace linter { LintResultMap, }; } -type Compiler = import('webpack').Compiler; -type Compilation = import('webpack').Compilation; -type Stylelint = import('./getStylelint').Stylelint; -type LintResult = import('./getStylelint').LintResult; -type LinterResult = import('./getStylelint').LinterResult; -type Formatter = import('./getStylelint').Formatter; -type FormatterType = import('./getStylelint').FormatterType; -type Options = import('./options').Options; +type Compiler = import("webpack").Compiler; +type Compilation = import("webpack").Compilation; +type Stylelint = import("./getStylelint").Stylelint; +type LintResult = import("./getStylelint").LintResult; +type LinterResult = import("./getStylelint").LinterResult; +type Formatter = import("./getStylelint").Formatter; +type FormatterType = import("./getStylelint").FormatterType; +type RuleMeta = import("./getStylelint").RuleMeta; +type Options = import("./options").Options; type GenerateReport = (compilation: Compilation) => Promise; type Report = { errors?: StylelintError; @@ -50,4 +52,4 @@ type Linter = (files: string | string[]) => void; type LintResultMap = { [files: string]: LintResult; }; -import StylelintError = require('./StylelintError'); +import StylelintError = require("./StylelintError"); diff --git a/types/options.d.ts b/types/options.d.ts index 129417c..4e9a1df 100644 --- a/types/options.d.ts +++ b/types/options.d.ts @@ -1,59 +1,107 @@ -export type StylelintOptions = import('./getStylelint').LinterOptions; -export type FormatterType = import('./getStylelint').FormatterType; +export type StylelintOptions = import("./getStylelint").LinterOptions; +export type FormatterType = import("./getStylelint").FormatterType; export type OutputReport = { + /** + * file path + */ filePath?: string | undefined; + /** + * formatter + */ formatter?: FormatterType | undefined; }; export type PluginOptions = { + /** + * a string indicating the root of your files + */ context: string; + /** + * the errors found will always be emitted + */ emitError: boolean; + /** + * the warnings found will always be emitted + */ emitWarning: boolean; + /** + * specify the files and/or directories to exclude + */ exclude?: (string | string[]) | undefined; + /** + * specify the extensions that should be checked + */ extensions: string | string[]; + /** + * will cause the module build to fail if there are any errors + */ failOnError: boolean; + /** + * will cause the module build to fail if there are any warning + */ failOnWarning: boolean; + /** + * specify directories, files, or globs + */ files: string | string[]; + /** + * specify the formatter you would like to use to format your results + */ formatter: FormatterType; + /** + * lint only changed files, skip linting on start + */ lintDirtyModulesOnly: boolean; + /** + * will process and report errors only and ignore warnings + */ quiet: boolean; + /** + * path to `stylelint` instance that will be used for linting + */ stylelintPath: string; + /** + * writes the output of the errors to a file - for example, a `json` file for use for reporting + */ outputReport: OutputReport; + /** + * number of worker threads + */ threads?: (number | boolean) | undefined; }; export type Options = Partial; /** @typedef {import('./getStylelint').LinterOptions} StylelintOptions */ /** @typedef {import('./getStylelint').FormatterType} FormatterType */ /** - * @typedef {Object} OutputReport - * @property {string=} filePath - * @property {FormatterType=} formatter + * @typedef {object} OutputReport + * @property {string=} filePath file path + * @property {FormatterType=} formatter formatter */ /** - * @typedef {Object} PluginOptions - * @property {string} context - * @property {boolean} emitError - * @property {boolean} emitWarning - * @property {string|string[]=} exclude - * @property {string|string[]} extensions - * @property {boolean} failOnError - * @property {boolean} failOnWarning - * @property {string|string[]} files - * @property {FormatterType} formatter - * @property {boolean} lintDirtyModulesOnly - * @property {boolean} quiet - * @property {string} stylelintPath - * @property {OutputReport} outputReport - * @property {number|boolean=} threads + * @typedef {object} PluginOptions + * @property {string} context a string indicating the root of your files + * @property {boolean} emitError the errors found will always be emitted + * @property {boolean} emitWarning the warnings found will always be emitted + * @property {string | string[]=} exclude specify the files and/or directories to exclude + * @property {string | string[]} extensions specify the extensions that should be checked + * @property {boolean} failOnError will cause the module build to fail if there are any errors + * @property {boolean} failOnWarning will cause the module build to fail if there are any warning + * @property {string | string[]} files specify directories, files, or globs + * @property {FormatterType} formatter specify the formatter you would like to use to format your results + * @property {boolean} lintDirtyModulesOnly lint only changed files, skip linting on start + * @property {boolean} quiet will process and report errors only and ignore warnings + * @property {string} stylelintPath path to `stylelint` instance that will be used for linting + * @property {OutputReport} outputReport writes the output of the errors to a file - for example, a `json` file for use for reporting + * @property {number | boolean=} threads number of worker threads */ /** @typedef {Partial} Options */ /** - * @param {Options} pluginOptions - * @returns {Partial} + * @param {Options} pluginOptions plugin options + * @returns {Partial} partial plugin options */ export function getOptions(pluginOptions: Options): Partial; /** - * @param {Options} pluginOptions - * @returns {Partial} + * @param {Options} pluginOptions plugin options + * @returns {Partial} stylelint options */ export function getStylelintOptions( pluginOptions: Options, diff --git a/types/utils.d.ts b/types/utils.d.ts index 3c14a87..609d5e4 100644 --- a/types/utils.d.ts +++ b/types/utils.d.ts @@ -1,21 +1,4 @@ -/** - * @template T - * @param {T} value - * @return { - T extends (null | undefined) - ? [] - : T extends string - ? [string] - : T extends readonly unknown[] - ? T - : T extends Iterable - ? T[] - : [T] - } - */ -export function arrify( - value: T, -): T extends null | undefined +export type ArrifyResult = T extends null | undefined ? [] : T extends string ? [string] @@ -24,24 +7,48 @@ export function arrify( : T extends Iterable ? T_1[] : [T]; +export type EXPECTED_ANY = import("./index").EXPECTED_ANY; +/** + * @template T + * @typedef {T extends (null | undefined) + * ? [] + * : T extends string + * ? [string] + * : T extends readonly unknown[] + * ? T + * : T extends Iterable + * ? T[] + * : [T]} ArrifyResult + */ /** - * @param {string|string[]} files - * @param {string} context - * @returns {string[]} + * @template T + * @param {T} value value + * @returns {ArrifyResult} array of values + */ +export function arrify(value: T): ArrifyResult; +/** + * @param {string} _ key, but unused + * @param {EXPECTED_ANY} value value + * @returns {{ [x: string]: EXPECTED_ANY }} result + */ +export function jsonStringifyReplacerSortKeys( + _: string, + value: EXPECTED_ANY, +): { + [x: string]: EXPECTED_ANY; +}; +/** + * @param {string | string[]} files files + * @param {string} context context + * @returns {string[]} normlized paths */ export function parseFiles(files: string | string[], context: string): string[]; /** - * @param {string|string[]} patterns - * @param {string|string[]} extensions - * @returns {string[]} + * @param {string | string[]} patterns patterns + * @param {string | string[]} extensions extensions + * @returns {string[]} globs */ export function parseFoldersToGlobs( patterns: string | string[], extensions?: string | string[], ): string[]; -/** - * - * @param {string} _ key, but unused - * @param {any} value - */ -export function jsonStringifyReplacerSortKeys(_: string, value: any): any; diff --git a/types/worker.d.ts b/types/worker.d.ts index e711d8d..970fe8a 100644 --- a/types/worker.d.ts +++ b/types/worker.d.ts @@ -1,3 +1,18 @@ -export type Stylelint = import('./getStylelint').Stylelint; -export type StylelintOptions = import('./getStylelint').LinterOptions; -export type Options = import('./options').Options; +export type Stylelint = import("./getStylelint").Stylelint; +export type StylelintOptions = import("./getStylelint").LinterOptions; +export type LintResult = import("./getStylelint").LintResult; +export type Options = import("./options").Options; +/** + * @param {string | string[]} files files + * @returns {Promise} results + */ +export function lintFiles(files: string | string[]): Promise; +/** + * @param {Options} options the worker options + * @param {Partial} stylelintOptions the stylelint options + * @returns {Stylelint} stylelint instance + */ +export function setup( + options: Options, + stylelintOptions: Partial, +): Stylelint; From ff092f939b0560c5fafe95622bf31da2e5e0bed0 Mon Sep 17 00:00:00 2001 From: alexander-akait Date: Wed, 30 Jul 2025 16:27:32 +0300 Subject: [PATCH 2/2] chore: fix lint --- src/index.js | 2 -- src/utils.js | 5 +++-- types/index.d.ts | 3 +-- types/utils.d.ts | 4 ++-- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/index.js b/src/index.js index 123f8bf..c18640d 100644 --- a/src/index.js +++ b/src/index.js @@ -11,8 +11,6 @@ const { arrify, parseFiles, parseFoldersToGlobs } = require("./utils"); /** @typedef {import('webpack').Module} Module */ /** @typedef {import('./options').Options} Options */ /** @typedef {Partial<{ timestamp:number } | number>} FileSystemInfoEntry */ -// eslint-disable-next-line jsdoc/no-restricted-syntax -/** @typedef {any} EXPECTED_ANY */ const STYLELINT_PLUGIN = "StylelintWebpackPlugin"; let counter = 0; diff --git a/src/utils.js b/src/utils.js index 8b79ced..88727ca 100644 --- a/src/utils.js +++ b/src/utils.js @@ -1,4 +1,5 @@ -/** @typedef {import('./index').EXPECTED_ANY} EXPECTED_ANY */ +// eslint-disable-next-line jsdoc/no-restricted-syntax +/** @typedef {any} EXPECTED_ANY */ const { statSync } = require("node:fs"); const { resolve } = require("node:path"); @@ -49,7 +50,7 @@ function arrify(value) { /** * @param {string | string[]} files files * @param {string} context context - * @returns {string[]} normlized paths + * @returns {string[]} normalized paths */ function parseFiles(files, context) { return arrify(files).map((/** @type {string} */ file) => diff --git a/types/index.d.ts b/types/index.d.ts index 8509c47..525f965 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -32,7 +32,7 @@ declare class StylelintWebpackPlugin { getContext(compiler: Compiler): string; } declare namespace StylelintWebpackPlugin { - export { Compiler, Module, Options, FileSystemInfoEntry, EXPECTED_ANY }; + export { Compiler, Module, Options, FileSystemInfoEntry }; } type Compiler = import("webpack").Compiler; type Module = import("webpack").Module; @@ -43,4 +43,3 @@ type FileSystemInfoEntry = Partial< } | number >; -type EXPECTED_ANY = any; diff --git a/types/utils.d.ts b/types/utils.d.ts index 609d5e4..082d8cc 100644 --- a/types/utils.d.ts +++ b/types/utils.d.ts @@ -7,7 +7,7 @@ export type ArrifyResult = T extends null | undefined : T extends Iterable ? T_1[] : [T]; -export type EXPECTED_ANY = import("./index").EXPECTED_ANY; +export type EXPECTED_ANY = any; /** * @template T * @typedef {T extends (null | undefined) @@ -40,7 +40,7 @@ export function jsonStringifyReplacerSortKeys( /** * @param {string | string[]} files files * @param {string} context context - * @returns {string[]} normlized paths + * @returns {string[]} normalized paths */ export function parseFiles(files: string | string[], context: string): string[]; /**