├── .tool-versions ├── .prettierignore ├── tests ├── e2e │ ├── fixtures │ │ └── app │ │ │ ├── .eslintrc.json │ │ │ ├── packages │ │ │ ├── a │ │ │ │ ├── package.json │ │ │ │ └── test.js │ │ │ └── b │ │ │ │ └── package.json │ │ │ ├── eslint.config.mjs │ │ │ └── package.json │ ├── test.js │ └── snapshot.js ├── setup.js ├── ruleTester.js ├── mocks.js └── rules │ ├── require-dependency.js │ ├── no-relative-imports.js │ ├── no-absolute-imports.js │ └── no-cross-imports.js ├── .gitignore ├── lib ├── index.d.ts ├── rules │ ├── no-relative-imports.js │ ├── no-absolute-imports.js │ ├── require-dependency.js │ └── no-cross-imports.js ├── index.js └── utils.js ├── docs ├── rules │ ├── no-absolute-imports.md │ ├── no-relative-imports.md │ ├── require-dependency.md │ └── no-cross-imports.md └── deprecating-scopes.md ├── .github └── workflows │ └── ci.yml ├── LICENSE ├── eslint.config.mjs ├── package.json ├── README.md ├── CHANGELOG.md └── pnpm-lock.yaml /.tool-versions: -------------------------------------------------------------------------------- 1 | nodejs 24.12.0 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | pnpm-lock.yaml 2 | -------------------------------------------------------------------------------- /tests/e2e/fixtures/app/.eslintrc.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /tests/e2e/fixtures/app/packages/a/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@app/a", 3 | "private": true 4 | } 5 | -------------------------------------------------------------------------------- /tests/e2e/fixtures/app/packages/b/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@app/b", 3 | "private": true 4 | } 5 | -------------------------------------------------------------------------------- /tests/e2e/fixtures/app/eslint.config.mjs: -------------------------------------------------------------------------------- 1 | export default { linterOptions: { reportUnusedDisableDirectives: true } }; 2 | -------------------------------------------------------------------------------- /tests/e2e/fixtures/app/packages/a/test.js: -------------------------------------------------------------------------------- 1 | require("@app/b"); 2 | require("../b"); 3 | require("@app/a"); 4 | require("../a"); 5 | -------------------------------------------------------------------------------- /tests/setup.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const sinon = require("sinon"); 4 | 5 | sinon.stub(require("find-workspaces"), "findWorkspaces"); 6 | -------------------------------------------------------------------------------- /tests/e2e/fixtures/app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@fixture/app", 3 | "private": true, 4 | "workspaces": [ 5 | "packages/*" 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .idea 3 | .DS_Store 4 | .nyc_output 5 | *.swp 6 | npm-debug.log* 7 | yarn-debug.log* 8 | yarn-error.log* 9 | coverage 10 | -------------------------------------------------------------------------------- /lib/index.d.ts: -------------------------------------------------------------------------------- 1 | import type { ESLint, Linter } from "eslint"; 2 | 3 | declare const plugin: ESLint.Plugin & { 4 | configs: { 5 | recommended: ESLint.ConfigData; 6 | all: ESLint.ConfigData; 7 | "flat/recommended": Linter.Config; 8 | "flat/all": Linter.Config; 9 | }; 10 | }; 11 | 12 | export = plugin; 13 | -------------------------------------------------------------------------------- /tests/ruleTester.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { RuleTester } = require("eslint"); 4 | 5 | RuleTester.setDefaultConfig({}); 6 | 7 | module.exports.ruleTester = new RuleTester(); 8 | 9 | module.exports.ruleTesterWithSettings = new RuleTester({ 10 | settings: { workspaces: { search: { startDir: "/test", stopDir: "/" } } }, 11 | }); 12 | -------------------------------------------------------------------------------- /docs/rules/no-absolute-imports.md: -------------------------------------------------------------------------------- 1 | # workspaces/no-absolute-imports 2 | 3 | Disallows the use of absolute imports of files that are within the current package. This rule only affects files that are inside a package. 4 | 5 | **Fixable:** This rule is automatically fixable using the `--fix` command line option. 6 | 7 | ## Example 8 | 9 | These examples have the following project structure: 10 | 11 | ``` 12 | project 13 | └───packages 14 | └─── A 15 | └─── B 16 | ``` 17 | 18 | Examples of **incorrect** code for this rule: 19 | 20 | ```js 21 | // inside "project/packages/A/index.js" 22 | import foo from "@project/A/foo"; 23 | ``` 24 | 25 | Examples of **correct** code for this rule: 26 | 27 | ```js 28 | // inside "project/packages/A/index.js" 29 | import foo from "./foo"; 30 | import bar from "@project/B/bar"; 31 | 32 | // inside "project/index.js" 33 | import foo from ".@project/A/foo"; 34 | ``` 35 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | on: 3 | push: 4 | branches: ["main"] 5 | pull_request: 6 | branches: ["**"] 7 | jobs: 8 | test: 9 | runs-on: ${{ matrix.os }} 10 | strategy: 11 | matrix: 12 | os: [ubuntu-latest, windows-latest] 13 | node-version: [20.19.6, 22.21.1, 24.12.0] 14 | steps: 15 | - name: Set git to use LF 16 | run: | 17 | git config --global core.autocrlf false 18 | git config --global core.eol lf 19 | - uses: actions/checkout@v6 20 | - uses: pnpm/action-setup@v4 21 | - uses: actions/setup-node@v6 22 | with: 23 | node-version: ${{ matrix.node-version }} 24 | cache: "pnpm" 25 | - run: pnpm install 26 | - run: pnpm format:check 27 | - run: pnpm lint 28 | - run: pnpm test 29 | - uses: coverallsapp/github-action@v2 30 | with: 31 | github-token: ${{ secrets.GITHUB_TOKEN }} 32 | -------------------------------------------------------------------------------- /docs/rules/no-relative-imports.md: -------------------------------------------------------------------------------- 1 | # workspaces/no-relative-imports 2 | 3 | Disallows the use of relative imports of files that are outside of the current package. This rule only affects files that are inside a package. 4 | 5 | **Fixable:** This rule is automatically fixable using the `--fix` command line option. 6 | 7 | ## Example 8 | 9 | These examples have the following project structure: 10 | 11 | ``` 12 | project 13 | └───packages 14 | └─── A 15 | └─── B 16 | ``` 17 | 18 | Examples of **incorrect** code for this rule: 19 | 20 | ```js 21 | // inside "project/packages/A/index.js" 22 | import foo from "../B/foo"; 23 | ``` 24 | 25 | Examples of **correct** code for this rule: 26 | 27 | ```js 28 | // inside "project/packages/A/index.js" 29 | import foo from "@project/B/foo"; 30 | 31 | // inside "project/packages/B/index.js" 32 | import foo from "./foo"; 33 | 34 | // inside "project/index.js" 35 | import foo from "./packages/B/foo"; 36 | ``` 37 | -------------------------------------------------------------------------------- /docs/rules/require-dependency.md: -------------------------------------------------------------------------------- 1 | # workspaces/require-dependency 2 | 3 | Disallow importing from packages that are not listed in the dependencies, devDependencies, peerDependencies or optionalDependencies of the package that is being imported to. This rule only affects files that are inside a package. 4 | 5 | ## Example 6 | 7 | These examples have the following project structure: 8 | 9 | ``` 10 | project 11 | └───packages 12 | └─── A 13 | └─── B 14 | └─── C 15 | ``` 16 | 17 | Examples of **incorrect** code for this rule: 18 | 19 | ```js 20 | // inside "project/packages/A/index.js" 21 | import foo from "@project/B/foo"; 22 | import bar from "../B/bar"; 23 | ``` 24 | 25 | Examples of **correct** code for this rule: 26 | 27 | ```js 28 | // "project/packages/A/package.json" containing: 29 | // { 30 | // "dependencies": { "@project/B": "1.0.0" }, 31 | // "devDependencies": { "@project/C": "1.0.0" } 32 | // } 33 | 34 | // inside "project/packages/A/index.js" 35 | import foo from "@project/B/foo"; 36 | import bar from "../B/bar"; 37 | import baz from "@project/C/baz"; 38 | ``` 39 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Joshua Jacobowitz 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import js from "@eslint/js"; 2 | import node from "eslint-plugin-n"; 3 | import eslintPlugin from "eslint-plugin-eslint-plugin"; 4 | import prettier from "eslint-config-prettier"; 5 | import globals from "globals"; 6 | 7 | export default [ 8 | { ignores: ["tests/e2e/fixtures"] }, 9 | js.configs.recommended, 10 | node.configs["flat/recommended"], 11 | eslintPlugin.configs["flat/all"], 12 | { 13 | linterOptions: { reportUnusedDisableDirectives: true }, 14 | rules: { 15 | "arrow-body-style": "warn", 16 | strict: "error", 17 | "n/prefer-global/buffer": "error", 18 | "n/prefer-global/console": "error", 19 | "n/prefer-global/process": "error", 20 | "n/prefer-global/text-decoder": "error", 21 | "n/prefer-global/url": "error", 22 | "n/prefer-global/url-search-params": "error", 23 | "eslint-plugin/require-meta-docs-url": [ 24 | "error", 25 | { 26 | pattern: 27 | "https://github.com/joshuajaco/eslint-plugin-workspaces/blob/main/docs/rules/{{name}}.md", 28 | }, 29 | ], 30 | }, 31 | }, 32 | { 33 | files: ["**/*.mjs"], 34 | languageOptions: { sourceType: "module" }, 35 | }, 36 | { 37 | files: ["tests/**/*.js"], 38 | languageOptions: { globals: globals.mocha }, 39 | }, 40 | prettier, 41 | ]; 42 | -------------------------------------------------------------------------------- /lib/rules/no-relative-imports.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { getWorkspaces, isSubPath, getImport } = require("../utils"); 4 | 5 | module.exports.meta = { 6 | type: "problem", 7 | docs: { 8 | description: 9 | "disallow relative imports of files that are outside of the current package", 10 | recommended: true, 11 | url: "https://github.com/joshuajaco/eslint-plugin-workspaces/blob/main/docs/rules/no-relative-imports.md", 12 | }, 13 | fixable: "code", 14 | schema: [], 15 | messages: { 16 | noRelativeImports: "Relative imports of other packages are not allowed", 17 | }, 18 | }; 19 | 20 | module.exports.create = (context) => { 21 | const workspaces = getWorkspaces(context); 22 | return getImport( 23 | workspaces, 24 | context.getFilename(), 25 | ({ node, path, start, end, currentWorkspace }) => { 26 | if (isSubPath(currentWorkspace.location, path)) return; 27 | 28 | workspaces.forEach(({ package: { name }, location }) => { 29 | if ( 30 | name !== path && 31 | name !== currentWorkspace.package.name && 32 | isSubPath(location, path) 33 | ) { 34 | context.report({ 35 | node, 36 | messageId: "noRelativeImports", 37 | fix: (fixer) => 38 | fixer.replaceTextRange( 39 | [start + 1, end - 1], 40 | path.replace(location, name), 41 | ), 42 | }); 43 | } 44 | }); 45 | }, 46 | ); 47 | }; 48 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "eslint-plugin-workspaces", 3 | "version": "0.11.1", 4 | "keywords": [ 5 | "eslint", 6 | "eslintplugin", 7 | "eslint-plugin", 8 | "monorepo", 9 | "packages", 10 | "workspaces", 11 | "yarn", 12 | "lerna", 13 | "npm", 14 | "pnpm", 15 | "bolt" 16 | ], 17 | "repository": { 18 | "type": "git", 19 | "url": "git+https://github.com/joshuajaco/eslint-plugin-workspaces.git" 20 | }, 21 | "license": "MIT", 22 | "exports": "./lib/index.js", 23 | "main": "lib/index.js", 24 | "types": "lib/index.d.ts", 25 | "files": [ 26 | "lib/", 27 | "CHANGELOG.md" 28 | ], 29 | "scripts": { 30 | "format": "prettier . --write", 31 | "format:check": "prettier . --check", 32 | "lint": "eslint . --max-warnings=0", 33 | "lint:fix": "pnpm lint --fix", 34 | "test": "nyc -r=lcov -r=text pnpm run \"/^test:.*/\"", 35 | "test:e2e": "mocha tests/e2e/test.js", 36 | "test:rules": "mocha tests/rules --recursive --file tests/setup.js" 37 | }, 38 | "dependencies": { 39 | "find-workspaces": "^0.3.1" 40 | }, 41 | "devDependencies": { 42 | "@eslint/js": "^9.39.2", 43 | "eslint": "^9.39.2", 44 | "eslint-config-prettier": "^10.1.8", 45 | "eslint-plugin-eslint-plugin": "^6.5.0", 46 | "eslint-plugin-n": "^17.23.1", 47 | "eslint8": "npm:eslint@8.57.1", 48 | "globals": "^16.5.0", 49 | "mocha": "^11.7.5", 50 | "nyc": "^17.1.0", 51 | "prettier": "^3.7.4", 52 | "sinon": "^20.0.0" 53 | }, 54 | "packageManager": "pnpm@10.25.0" 55 | } 56 | -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const plugin = { 4 | rules: { 5 | "no-cross-imports": require("./rules/no-cross-imports"), 6 | "no-relative-imports": require("./rules/no-relative-imports"), 7 | "no-absolute-imports": require("./rules/no-absolute-imports"), 8 | "require-dependency": require("./rules/require-dependency"), 9 | }, 10 | configs: { 11 | recommended: { 12 | plugins: ["workspaces"], 13 | rules: { 14 | "workspaces/no-relative-imports": "error", 15 | "workspaces/no-absolute-imports": "error", 16 | "workspaces/require-dependency": "error", 17 | }, 18 | }, 19 | all: { 20 | plugins: ["workspaces"], 21 | rules: { 22 | "workspaces/no-relative-imports": "error", 23 | "workspaces/no-absolute-imports": "error", 24 | "workspaces/require-dependency": "error", 25 | "workspaces/no-cross-imports": "error", 26 | }, 27 | }, 28 | }, 29 | }; 30 | 31 | Object.assign(plugin.configs, { 32 | "flat/recommended": { 33 | plugins: { workspaces: plugin }, 34 | rules: { 35 | "workspaces/no-relative-imports": "error", 36 | "workspaces/no-absolute-imports": "error", 37 | "workspaces/require-dependency": "error", 38 | }, 39 | }, 40 | "flat/all": { 41 | plugins: { workspaces: plugin }, 42 | rules: { 43 | "workspaces/no-relative-imports": "error", 44 | "workspaces/no-absolute-imports": "error", 45 | "workspaces/require-dependency": "error", 46 | "workspaces/no-cross-imports": "error", 47 | }, 48 | }, 49 | }); 50 | 51 | module.exports = plugin; 52 | -------------------------------------------------------------------------------- /lib/rules/no-absolute-imports.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { dirname, relative } = require("path"); 4 | const { 5 | getWorkspaces, 6 | isWorkspacePath, 7 | getImport, 8 | pathToImport, 9 | } = require("../utils"); 10 | 11 | module.exports.meta = { 12 | type: "problem", 13 | docs: { 14 | description: 15 | "disallow absolute imports for files that are within the current package", 16 | recommended: true, 17 | url: "https://github.com/joshuajaco/eslint-plugin-workspaces/blob/main/docs/rules/no-absolute-imports.md", 18 | }, 19 | fixable: "code", 20 | schema: [], 21 | messages: { 22 | noAbsoluteImports: 23 | "Absolute imports within the current package are not allowed", 24 | }, 25 | }; 26 | 27 | module.exports.create = (context) => { 28 | const workspaces = getWorkspaces(context); 29 | const filename = context.getFilename(); 30 | return getImport( 31 | workspaces, 32 | filename, 33 | ({ node, path, value, start, end, currentWorkspace }) => { 34 | if (isWorkspacePath(currentWorkspace.package.name, value)) { 35 | context.report({ 36 | node, 37 | messageId: "noAbsoluteImports", 38 | fix: (fixer) => 39 | fixer.replaceTextRange( 40 | [start + 1, end - 1], 41 | pathToImport( 42 | relative( 43 | dirname(filename), 44 | path.replace( 45 | currentWorkspace.package.name, 46 | currentWorkspace.location, 47 | ), 48 | ), 49 | ), 50 | ), 51 | }); 52 | } 53 | }, 54 | ); 55 | }; 56 | -------------------------------------------------------------------------------- /tests/e2e/test.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const path = require("node:path"); 4 | const assert = require("node:assert"); 5 | const { ESLint } = require("eslint"); 6 | const { ESLint: ESLint8 } = require("eslint8"); 7 | const plugin = require("../../lib"); 8 | const snapshot = require("./snapshot"); 9 | 10 | const cwd = path.resolve("./tests/e2e/fixtures/app"); 11 | const files = ["packages/a/test.js"]; 12 | 13 | describe("eslint 9", () => { 14 | function runLint(baseConfig) { 15 | return lintFiles(new ESLint({ cwd, baseConfig })); 16 | } 17 | 18 | it("flat/recommended", async () => { 19 | const messages = await runLint(plugin.configs["flat/recommended"]); 20 | assert.deepStrictEqual(messages, snapshot.recommended); 21 | }); 22 | 23 | it("flat/all", async () => { 24 | const messages = await runLint(plugin.configs["flat/all"]); 25 | assert.deepStrictEqual(messages, snapshot.all); 26 | }); 27 | }); 28 | 29 | describe("eslint 8", () => { 30 | function runLint(baseConfig) { 31 | return lintFiles( 32 | new ESLint8({ 33 | cwd, 34 | baseConfig, 35 | plugins: { workspaces: plugin }, 36 | }), 37 | ); 38 | } 39 | 40 | it("recommended", async () => { 41 | const messages = await runLint(plugin.configs.recommended); 42 | assert.deepStrictEqual(messages, snapshot.recommended); 43 | }); 44 | 45 | it("all", async () => { 46 | const messages = await runLint(plugin.configs.all); 47 | assert.deepStrictEqual(messages, snapshot.all); 48 | }); 49 | }); 50 | 51 | async function lintFiles(linter) { 52 | const results = await linter.lintFiles(files); 53 | return results.flatMap((result) => result.messages); 54 | } 55 | -------------------------------------------------------------------------------- /tests/mocks.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | module.exports.findWorkspacesMock = () => [ 4 | { 5 | location: "/test/workspace", 6 | package: { 7 | name: "@test/workspace", 8 | }, 9 | }, 10 | { 11 | location: "/test/another-workspace", 12 | package: { 13 | name: "@test/another-workspace", 14 | dependencies: { "@test/workspace": "^1.0.0" }, 15 | }, 16 | }, 17 | { 18 | location: "/test/third-workspace", 19 | package: { 20 | name: "@test/third-workspace", 21 | }, 22 | }, 23 | { 24 | location: "/test/outer", 25 | package: { 26 | name: "@test/outer", 27 | }, 28 | }, 29 | { 30 | location: "/test/outer/inner", 31 | package: { 32 | name: "@test/inner", 33 | }, 34 | }, 35 | { 36 | location: "/test/no-npm-scope-workspace", 37 | package: { 38 | name: "no-npm-scope-workspace", 39 | }, 40 | }, 41 | { 42 | location: "/test/peer-dependencies", 43 | package: { 44 | name: "@test/peer-dependencies", 45 | peerDependencies: { "@test/peer-workspace": "^1.0.0" }, 46 | }, 47 | }, 48 | { 49 | location: "/test/optional-dependencies", 50 | package: { 51 | name: "@test/optional-dependencies", 52 | optionalDependencies: { "@test/optional-workspace": "^1.0.0" }, 53 | }, 54 | }, 55 | { 56 | location: "/test/scope/shared", 57 | package: { 58 | name: "@test/shared-in-scope", 59 | }, 60 | }, 61 | { 62 | location: "/test/other-scope/shared", 63 | package: { 64 | name: "@test/shared-outside-scope", 65 | }, 66 | }, 67 | { 68 | location: "/test/scope/workspace", 69 | package: { 70 | name: "@test/scoped-workspace", 71 | }, 72 | }, 73 | { 74 | location: "root", 75 | package: { name: "root" }, 76 | }, 77 | ]; 78 | -------------------------------------------------------------------------------- /lib/rules/require-dependency.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { 4 | getWorkspaces, 5 | isSubPath, 6 | isWorkspacePath, 7 | getImport, 8 | } = require("../utils"); 9 | 10 | module.exports.meta = { 11 | type: "problem", 12 | docs: { 13 | description: 14 | "disallow importing from packages that are not listed as a dependency", 15 | recommended: true, 16 | url: "https://github.com/joshuajaco/eslint-plugin-workspaces/blob/main/docs/rules/require-dependency.md", 17 | }, 18 | schema: [], 19 | messages: { 20 | requireDependency: 21 | "Importing from another workspace without listing it as a dependency is not allowed", 22 | }, 23 | }; 24 | 25 | module.exports.create = (context) => { 26 | const workspaces = getWorkspaces(context); 27 | return getImport( 28 | workspaces, 29 | context.getFilename(), 30 | ({ node, value, path, currentWorkspace }) => { 31 | if (isSubPath(currentWorkspace.location, path)) return; 32 | 33 | workspaces.forEach(({ package: { name }, location }) => { 34 | const { 35 | dependencies = {}, 36 | peerDependencies = {}, 37 | optionalDependencies = {}, 38 | devDependencies = {}, 39 | } = currentWorkspace.package; 40 | 41 | if ( 42 | name !== currentWorkspace.package.name && 43 | (isWorkspacePath(name, value) || isSubPath(location, path)) && 44 | !Object.keys(dependencies).includes(name) && 45 | !Object.keys(peerDependencies).includes(name) && 46 | !Object.keys(optionalDependencies).includes(name) && 47 | !Object.keys(devDependencies).includes(name) 48 | ) { 49 | context.report({ 50 | node, 51 | messageId: "requireDependency", 52 | }); 53 | } 54 | }); 55 | }, 56 | ); 57 | }; 58 | -------------------------------------------------------------------------------- /tests/rules/require-dependency.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { findWorkspaces } = require("find-workspaces"); 4 | const { ruleTester } = require("../ruleTester"); 5 | const { findWorkspacesMock } = require("../mocks"); 6 | const rule = require("../../lib/rules/require-dependency"); 7 | 8 | describe("require-dependency", () => { 9 | before(() => findWorkspaces.callsFake(findWorkspacesMock)); 10 | 11 | ruleTester.run("require-dependency", rule, { 12 | valid: [ 13 | { 14 | filename: "/test/another-workspace/index.js", 15 | code: "import '../workspace';", 16 | }, 17 | { 18 | filename: "/index.js", 19 | code: "import '../workspace';", 20 | }, 21 | { 22 | filename: "/test/workspace/test.js", 23 | code: "require(undefined)", 24 | }, 25 | { 26 | filename: "/test/peer-dependencies/test.js", 27 | code: "import '@test/peer-workspace'", 28 | }, 29 | { 30 | filename: "/test/optional-dependencies/test.js", 31 | code: "import '@test/optional-workspace'", 32 | }, 33 | { 34 | filename: "/test/workspace/index.js", 35 | code: "import './no-npm-scope-workspace';", 36 | }, 37 | { 38 | filename: "/test/outer/index.js", 39 | code: "import '@test/outer';", 40 | }, 41 | { 42 | filename: "/test/outer/inner/index.js", 43 | code: "import '@test/inner';", 44 | }, 45 | { 46 | filename: "/test/outer/index.js", 47 | code: "import './utils.js';", 48 | }, 49 | { 50 | filename: "/test/outer/inner/index.js", 51 | code: "import './utils.js';", 52 | }, 53 | ], 54 | invalid: [ 55 | { 56 | filename: "/test/workspace/index.js", 57 | code: "import '../another-workspace';", 58 | errors: [ 59 | { 60 | message: 61 | "Importing from another workspace without listing it as a dependency is not allowed", 62 | }, 63 | ], 64 | }, 65 | { 66 | filename: "/test/workspace/other.js", 67 | code: "import('../another-workspace');", 68 | errors: [ 69 | { 70 | message: 71 | "Importing from another workspace without listing it as a dependency is not allowed", 72 | }, 73 | ], 74 | }, 75 | { 76 | filename: "/test/workspace/other.js", 77 | code: "async () => await import('../another-workspace');", 78 | errors: [ 79 | { 80 | message: 81 | "Importing from another workspace without listing it as a dependency is not allowed", 82 | }, 83 | ], 84 | }, 85 | ], 86 | }); 87 | 88 | describe("without workspaces", () => { 89 | before(() => findWorkspaces.callsFake(() => null)); 90 | 91 | ruleTester.run("require-dependency", rule, { 92 | valid: ["import workspace from '@test/workspace';"], 93 | invalid: [], 94 | }); 95 | }); 96 | }); 97 | -------------------------------------------------------------------------------- /lib/utils.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { 4 | dirname, 5 | join, 6 | relative, 7 | sep, 8 | normalize, 9 | isAbsolute, 10 | posix, 11 | } = require("path"); 12 | const { findWorkspaces, createWorkspacesCache } = require("find-workspaces"); 13 | 14 | const isSubPath = (parent, path) => { 15 | const relativePath = relative(parent, path); 16 | return relativePath.split(sep)[0] !== ".." && !isAbsolute(relativePath); 17 | }; 18 | 19 | const isWorkspacePath = (name, path) => 20 | path === name || 21 | path.startsWith(name + sep) || 22 | path.startsWith(name + posix.sep); 23 | 24 | const resolvePath = (parent, path) => { 25 | if (path[0] !== ".") return path; 26 | 27 | return join(parent, path).split(sep).join(posix.sep); 28 | }; 29 | 30 | const resolveImport = (filename, node, { value, range }, currentWorkspace) => { 31 | const path = resolvePath(dirname(filename), value); 32 | const [start, end] = range; 33 | return { node, value, path, start, end, currentWorkspace }; 34 | }; 35 | 36 | const pathToImport = (path) => { 37 | if (path === "") return "."; 38 | 39 | const normalized = normalize(path).split(sep).join(posix.sep); 40 | 41 | if (normalized[0] !== ".") return `./${normalized}`; 42 | 43 | return normalized; 44 | }; 45 | 46 | const getImport = (workspaces, filename, callback) => { 47 | if (!workspaces) return {}; 48 | 49 | const currentWorkspace = workspaces 50 | .filter(({ location }) => isSubPath(location, filename)) 51 | .sort((a, b) => b.location.length - a.location.length) 52 | .at(0); 53 | 54 | if (!currentWorkspace) return {}; 55 | 56 | return { 57 | ImportDeclaration: (node) => { 58 | callback(resolveImport(filename, node, node.source, currentWorkspace)); 59 | }, 60 | CallExpression: (node) => { 61 | if ( 62 | node.arguments.length > 0 && 63 | node.arguments[0].type === "Literal" && 64 | (node.callee.type === "Import" || 65 | (node.callee.type === "Identifier" && node.callee.name === "require")) 66 | ) { 67 | callback( 68 | resolveImport(filename, node, node.arguments[0], currentWorkspace), 69 | ); 70 | } 71 | }, 72 | ImportExpression: (node) => { 73 | if (node.source.type === "Literal") { 74 | callback(resolveImport(filename, node, node.source, currentWorkspace)); 75 | } 76 | }, 77 | }; 78 | }; 79 | 80 | const cache = createWorkspacesCache(); 81 | 82 | const getWorkspaces = (context) => { 83 | const searchSetting = 84 | context.settings && 85 | context.settings.workspaces && 86 | context.settings.workspaces.search; 87 | 88 | const dir = searchSetting 89 | ? searchSetting.startDir 90 | : dirname(context.getFilename()); 91 | 92 | const stopDir = searchSetting && searchSetting.stopDir; 93 | 94 | return findWorkspaces(dir, { stopDir, cache }); 95 | }; 96 | 97 | module.exports = { 98 | isSubPath, 99 | isWorkspacePath, 100 | getImport, 101 | pathToImport, 102 | getWorkspaces, 103 | }; 104 | -------------------------------------------------------------------------------- /docs/deprecating-scopes.md: -------------------------------------------------------------------------------- 1 | # Deprecating Scopes 2 | 3 | The [`scopes`](./rules/no-cross-imports.md#scopes-deprecated) option of the [`workspaces/no-cross-imports`](./rules/no-cross-imports.md) rule has been deprecated and will be removed in the next major version. 4 | It was made with a specific use case in mind, but it turned out to be too inflexible and confusing. 5 | Since there are better ways to achieve the same result, the option will be removed. 6 | 7 | ## Migration 8 | 9 | There are two ways to migrate from `scopes` using basic ESLint configuration: 10 | 11 | ### Using `overrides` (Recommended) 12 | 13 | The [`overrides`](https://eslint.org/docs/user-guide/configuring/configuration-files#how-do-overrides-work) key of the ESLint configuration allows you to apply rules differently to a specific set of files. 14 | 15 | #### Example 16 | 17 | Assuming the following project structure: 18 | 19 | ``` 20 | project 21 | └─── packages 22 | └─── user-management/ 23 | └─── shared/ 24 | └─── package.json 25 | └─── registration/ 26 | └─── package.json 27 | └─── login/ 28 | └─── package.json 29 | ``` 30 | 31 | Inside `project/.eslintrc.json`: 32 | 33 | ```jsonc 34 | { 35 | // ... 36 | "rules": { 37 | // ... 38 | "workspaces/no-cross-imports": "error", 39 | }, 40 | "overrides": [ 41 | { 42 | "files": ["packages/user-management/**/*"], 43 | "rules": { 44 | "workspaces/no-cross-imports": [ 45 | "error", 46 | { "allow": ["@project/user-management-shared"] }, 47 | ], 48 | }, 49 | }, 50 | ], 51 | } 52 | ``` 53 | 54 | ### Using cascading configuration files 55 | 56 | The [cascading configuration files feature](https://eslint.org/docs/latest/use/configure/configuration-files#cascading-and-hierarchy) of ESLint allows you to create a configuration file in a subdirectory of your project. 57 | 58 | > [!WARNING] 59 | > This feature will be deprecated in the next major version of ESLint, see [Flat config rollout plans](https://eslint.org/blog/2023/10/flat-config-rollout-plans). 60 | > It is recommended to use [`overrides`](#using-overrides-recommended) instead. 61 | 62 | #### Example 63 | 64 | Assuming the following project structure: 65 | 66 | ``` 67 | project 68 | └─── packages 69 | └─── user-management/ 70 | └─── shared/ 71 | └─── package.json 72 | └─── registration/ 73 | └─── package.json 74 | └─── login/ 75 | └─── package.json 76 | ``` 77 | 78 | Inside `project/.eslintrc.json`: 79 | 80 | ```jsonc 81 | { 82 | // ... 83 | "rules": { 84 | // ... 85 | "workspaces/no-cross-imports": "error", 86 | }, 87 | } 88 | ``` 89 | 90 | Inside `project/packages/user-management/.eslintrc.json`: 91 | 92 | ```jsonc 93 | { 94 | "rules": { 95 | "workspaces/no-cross-imports": [ 96 | "error", 97 | { "allow": ["@project/user-management-shared"] }, 98 | ], 99 | }, 100 | } 101 | ``` 102 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # eslint-plugin-workspaces ![npm downloads](https://img.shields.io/npm/dw/eslint-plugin-workspaces) [![Coverage Status](https://coveralls.io/repos/github/joshuajaco/eslint-plugin-workspaces/badge.svg)](https://coveralls.io/github/joshuajaco/eslint-plugin-workspaces) [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier) 2 | 3 | An ESLint plugin for enforcing consistent imports across monorepo packages. 4 | 5 | It supports: 6 | 7 | - [Yarn workspaces](https://classic.yarnpkg.com/en/docs/workspaces) 8 | - [npm workspaces](https://docs.npmjs.com/cli/v7/using-npm/workspaces) 9 | - [pnpm workspaces](https://pnpm.io/workspaces) 10 | - [lerna](https://github.com/lerna/lerna) 11 | - [bolt](https://github.com/boltpkg/bolt) 12 | 13 | ## Installation 14 | 15 | ```sh 16 | # npm 17 | npm install eslint-plugin-workspaces --save-dev 18 | 19 | # yarn 20 | yarn add eslint-plugin-workspaces --dev 21 | ``` 22 | 23 | ## Configuration 24 | 25 | Enable the rules in your ESLint configuration file: 26 | 27 | ```json 28 | { 29 | "plugins": ["workspaces"], 30 | "rules": { 31 | "workspaces/no-relative-imports": "error", 32 | "workspaces/require-dependency": "warn" 33 | } 34 | } 35 | ``` 36 | 37 | Or add the "recommended" preset: 38 | 39 | ```json 40 | { 41 | "extends": ["plugin:workspaces/recommended"] 42 | } 43 | ``` 44 | 45 | ### ESLint v9 Flat Config 46 | 47 | Enable the rules in your ESLint configuration file: 48 | 49 | ```js 50 | import workspaces from "eslint-plugin-workspaces"; 51 | 52 | export default [ 53 | { 54 | plugins: { workspaces }, 55 | rules: { 56 | "workspaces/no-relative-imports": "error", 57 | "workspaces/require-dependency": "warn", 58 | }, 59 | }, 60 | // ... 61 | ]; 62 | ``` 63 | 64 | Or add the "recommended" preset: 65 | 66 | ```js 67 | import workspaces from "eslint-plugin-workspaces"; 68 | 69 | export default [ 70 | workspaces.configs["flat/recommended"], 71 | // ... 72 | ]; 73 | ``` 74 | 75 | ## Rules 76 | 77 | ✔ included in the "recommended" preset 78 | 79 | 🔧 fixable using the `--fix` command line option 80 | 81 | | | | Name | Description | 82 | | --- | --- | ------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- | 83 | | ✔ | 🔧 | [no-absolute-imports](https://github.com/joshuajaco/eslint-plugin-workspaces/blob/main/docs/rules/no-absolute-imports.md) | disallow absolute imports for files that are within the current package | 84 | | | | [no-cross-imports](https://github.com/joshuajaco/eslint-plugin-workspaces/blob/main/docs/rules/no-cross-imports.md) | disallow imports of files that are inside another package | 85 | | ✔ | 🔧 | [no-relative-imports](https://github.com/joshuajaco/eslint-plugin-workspaces/blob/main/docs/rules/no-relative-imports.md) | disallow relative imports of files that are outside of the current package | 86 | | ✔ | | [require-dependency](https://github.com/joshuajaco/eslint-plugin-workspaces/blob/main/docs/rules/require-dependency.md) | disallow importing from packages that are not listed as a dependency | 87 | 88 | ## Presets 89 | 90 | - `recommended` enables rules recommended for all users 91 | - `all` enables all rules 92 | - `flat/recommended` enables rules recommended for all users 93 | - `flat/all` enables all rules 94 | 95 | # License 96 | 97 | [MIT](https://github.com/joshuajaco/eslint-plugin-workspaces/blob/main/LICENSE) 98 | -------------------------------------------------------------------------------- /tests/e2e/snapshot.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | module.exports.recommended = [ 4 | { 5 | ruleId: "workspaces/require-dependency", 6 | severity: 2, 7 | message: 8 | "Importing from another workspace without listing it as a dependency is not allowed", 9 | line: 1, 10 | column: 1, 11 | nodeType: "CallExpression", 12 | messageId: "requireDependency", 13 | endLine: 1, 14 | endColumn: 18, 15 | }, 16 | { 17 | ruleId: "workspaces/no-relative-imports", 18 | severity: 2, 19 | message: "Relative imports of other packages are not allowed", 20 | line: 2, 21 | column: 1, 22 | nodeType: "CallExpression", 23 | messageId: "noRelativeImports", 24 | endLine: 2, 25 | endColumn: 16, 26 | fix: { 27 | range: [28, 32], 28 | text: "@app/b", 29 | }, 30 | }, 31 | { 32 | ruleId: "workspaces/require-dependency", 33 | severity: 2, 34 | message: 35 | "Importing from another workspace without listing it as a dependency is not allowed", 36 | line: 2, 37 | column: 1, 38 | nodeType: "CallExpression", 39 | messageId: "requireDependency", 40 | endLine: 2, 41 | endColumn: 16, 42 | }, 43 | { 44 | ruleId: "workspaces/no-absolute-imports", 45 | severity: 2, 46 | message: "Absolute imports within the current package are not allowed", 47 | line: 3, 48 | column: 1, 49 | nodeType: "CallExpression", 50 | messageId: "noAbsoluteImports", 51 | endLine: 3, 52 | endColumn: 18, 53 | fix: { 54 | range: [45, 51], 55 | text: ".", 56 | }, 57 | }, 58 | ]; 59 | 60 | module.exports.all = [ 61 | { 62 | ruleId: "workspaces/require-dependency", 63 | severity: 2, 64 | message: 65 | "Importing from another workspace without listing it as a dependency is not allowed", 66 | line: 1, 67 | column: 1, 68 | nodeType: "CallExpression", 69 | messageId: "requireDependency", 70 | endLine: 1, 71 | endColumn: 18, 72 | }, 73 | { 74 | ruleId: "workspaces/no-cross-imports", 75 | severity: 2, 76 | message: 'Import from package "@app/b" is not allowed', 77 | line: 1, 78 | column: 1, 79 | nodeType: "CallExpression", 80 | messageId: "noCrossImports", 81 | endLine: 1, 82 | endColumn: 18, 83 | }, 84 | { 85 | ruleId: "workspaces/no-relative-imports", 86 | severity: 2, 87 | message: "Relative imports of other packages are not allowed", 88 | line: 2, 89 | column: 1, 90 | nodeType: "CallExpression", 91 | messageId: "noRelativeImports", 92 | endLine: 2, 93 | endColumn: 16, 94 | fix: { 95 | range: [28, 32], 96 | text: "@app/b", 97 | }, 98 | }, 99 | { 100 | ruleId: "workspaces/require-dependency", 101 | severity: 2, 102 | message: 103 | "Importing from another workspace without listing it as a dependency is not allowed", 104 | line: 2, 105 | column: 1, 106 | nodeType: "CallExpression", 107 | messageId: "requireDependency", 108 | endLine: 2, 109 | endColumn: 16, 110 | }, 111 | { 112 | ruleId: "workspaces/no-cross-imports", 113 | severity: 2, 114 | message: 'Import from package "@app/b" is not allowed', 115 | line: 2, 116 | column: 1, 117 | nodeType: "CallExpression", 118 | messageId: "noCrossImports", 119 | endLine: 2, 120 | endColumn: 16, 121 | }, 122 | { 123 | ruleId: "workspaces/no-absolute-imports", 124 | severity: 2, 125 | message: "Absolute imports within the current package are not allowed", 126 | line: 3, 127 | column: 1, 128 | nodeType: "CallExpression", 129 | messageId: "noAbsoluteImports", 130 | endLine: 3, 131 | endColumn: 18, 132 | fix: { 133 | range: [45, 51], 134 | text: ".", 135 | }, 136 | }, 137 | ]; 138 | -------------------------------------------------------------------------------- /lib/rules/no-cross-imports.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { 4 | getWorkspaces, 5 | isSubPath, 6 | isWorkspacePath, 7 | getImport, 8 | } = require("../utils"); 9 | 10 | module.exports.meta = { 11 | type: "problem", 12 | docs: { 13 | description: "disallow imports of files that are inside another package", 14 | recommended: false, 15 | url: "https://github.com/joshuajaco/eslint-plugin-workspaces/blob/main/docs/rules/no-cross-imports.md", 16 | }, 17 | schema: [ 18 | { 19 | type: "object", 20 | additionalProperties: false, 21 | properties: { 22 | allow: { 23 | description: 24 | "single or a list of package names to exclude from this rule", 25 | anyOf: [ 26 | { type: "string" }, 27 | { 28 | type: "array", 29 | uniqueItems: true, 30 | items: { type: "string" }, 31 | }, 32 | ], 33 | }, 34 | scopes: { 35 | description: "deprecated", 36 | anyOf: [ 37 | { type: "boolean" }, 38 | { 39 | type: "object", 40 | additionalProperties: false, 41 | properties: { 42 | enable: { type: "boolean" }, 43 | folderName: { type: "string" }, 44 | }, 45 | }, 46 | ], 47 | }, 48 | }, 49 | }, 50 | ], 51 | defaultOptions: [{ allow: [], scopes: { enable: false } }], 52 | messages: { noCrossImports: 'Import from package "{{name}}" is not allowed' }, 53 | }; 54 | 55 | const filterSharedPackagesInCurrentScope = 56 | ({ location: currentLocation }, scopedEnabled, scopedSharingFolderName) => 57 | ({ location }) => { 58 | if (!scopedEnabled) return true; 59 | const locationArray = location.split("/"); 60 | const forbiddenPackageParent = locationArray.slice(0, -1).join("/"); 61 | if (!isSubPath(forbiddenPackageParent, currentLocation)) { 62 | return true; 63 | } 64 | 65 | return locationArray[locationArray.length - 1] !== scopedSharingFolderName; 66 | }; 67 | 68 | let scopesDeprecationShown = false; 69 | 70 | module.exports.create = (context) => { 71 | const { 72 | options: [{ allow = [], scopes = { enable: false } } = {}], 73 | } = context; 74 | 75 | const allowed = typeof allow === "string" ? [allow] : allow; 76 | const scopedEnabled = scopes === true || !!scopes.enable; 77 | const scopedSharingFolderName = scopes.folderName || "shared"; 78 | 79 | /* istanbul ignore if */ 80 | if ( 81 | scopedEnabled && 82 | !scopesDeprecationShown && 83 | process.stdout && 84 | process.stdout.isTTY 85 | ) { 86 | scopesDeprecationShown = true; 87 | 88 | console.warn( 89 | "\x1b[1m", // bright 90 | "\x1b[33m", // yellow text 91 | "Warning:", 92 | "\x1b[0m", // reset 93 | "the 'scopes' option of the 'workspaces/no-cross-imports' rule has been deprecated and will be removed in the next major version. See https://github.com/joshuajaco/eslint-plugin-workspaces/blob/main/docs/deprecating-scopes.md for more information.", 94 | ); 95 | } 96 | 97 | const workspaces = getWorkspaces(context); 98 | 99 | if (!workspaces) return {}; 100 | 101 | const forbidden = workspaces.filter( 102 | ({ package: { name } }) => !allowed.includes(name), 103 | ); 104 | 105 | return getImport( 106 | workspaces, 107 | context.getFilename(), 108 | ({ node, value, path, currentWorkspace }) => { 109 | if (isSubPath(currentWorkspace.location, path)) return; 110 | 111 | forbidden 112 | .filter( 113 | filterSharedPackagesInCurrentScope( 114 | currentWorkspace, 115 | scopedEnabled, 116 | scopedSharingFolderName, 117 | ), 118 | ) 119 | .forEach(({ package: { name }, location }) => { 120 | if ( 121 | name !== currentWorkspace.package.name && 122 | (isWorkspacePath(name, value) || isSubPath(location, path)) 123 | ) { 124 | context.report({ 125 | node, 126 | messageId: "noCrossImports", 127 | data: { name }, 128 | }); 129 | } 130 | }); 131 | }, 132 | ); 133 | }; 134 | -------------------------------------------------------------------------------- /docs/rules/no-cross-imports.md: -------------------------------------------------------------------------------- 1 | # workspaces/no-cross-imports 2 | 3 | Disallows the use of imports of files that are inside another package. This rule only affects files that are inside a package. 4 | 5 | ## Configuration 6 | 7 | This rule takes one argument: 8 | 9 | ``` 10 | ... 11 | "workspaces/no-cross-imports": ["error", { allow: ["@project/A", "@project/B"], scopes: { enable: true, folderName: 'shared' } }] 12 | ... 13 | ``` 14 | 15 | ### allow 16 | 17 | Takes a single or a list of package names to exclude from this rule. 18 | 19 | #### Example 20 | 21 | These examples have the following project structure: 22 | 23 | ``` 24 | project 25 | └───packages 26 | └─── A 27 | └─── B 28 | ``` 29 | 30 | Examples of **incorrect** code for this rule: 31 | 32 | ```js 33 | // inside "project/packages/A/index.js" 34 | import foo from "@project/B/foo"; 35 | import bar from "../B/bar"; 36 | ``` 37 | 38 | Examples of **correct** code for this rule: 39 | 40 | ```js 41 | // inside "project/packages/A/index.js" 42 | // configuration: [{ allow: "@project/B" }] 43 | import foo from "@project/B/foo"; 44 | import bar from "../B/bar"; 45 | 46 | // inside "project/index.js" 47 | import foo from "./packages/B/foo"; 48 | ``` 49 | 50 | ### scopes (**DEPRECATED**) 51 | 52 | > [!WARNING] 53 | > This feature has been deprecated and will be removed in the next major version. 54 | > For more information, see [Deprecating Scopes](../deprecating-scopes.md). 55 | 56 | Takes either a boolean or an options object. Defaults to `false`. 57 | 58 | Scopes are a way to partially allow imports across workspace boundaries. 59 | In larger monorepos, you might run into a situation where you want to group code 60 | across _some_ packages, but not all of them. A natural way to do this would be 61 | to create folder structure that visualizes this. So your structure might look 62 | like this: 63 | 64 | ``` 65 | project 66 | └─── packages 67 | └─── shared-components/ 68 | └─── package.json 69 | └─── welcome-page/ 70 | └─── package.json 71 | └─── user-management/ 72 | └─── registration/ 73 | └─── package.json 74 | └─── login/ 75 | └─── package.json 76 | ``` 77 | 78 | Now, we may want to share code across the packages in the `user-management` 79 | section (e.g. fetching the user object, user form components etc.). With scopes, 80 | i am always allowed to import from a package with a **special folder name** 81 | (see below) given that it shares a common folder parent. So for 82 | the above case, I would be able to do this: 83 | 84 | ``` 85 | project 86 | └─── packages 87 | └─── shared-components/ 88 | └─── package.json 89 | └─── welcome-page/ 90 | └─── package.json 91 | └─── user-management/ 92 | └─── shared/ 93 | └─── package.json 94 | └─── registration/ 95 | └─── package.json 96 | └─── login/ 97 | └─── package.json 98 | ``` 99 | 100 | When passing a boolean, the default folder name `shared` will be used. If you 101 | want to configure this, pass another string via the `folderName` key. 102 | 103 | #### Example 104 | 105 | These examples have the following project structure: 106 | 107 | ``` 108 | project 109 | └─── packages 110 | └─── shared-components/ 111 | └─── package.json 112 | └─── welcome-page/ 113 | └─── package.json 114 | └─── user-management/ 115 | └─── shared/ 116 | └─── package.json 117 | └─── registration/ 118 | └─── package.json 119 | └─── login/ 120 | └─── package.json 121 | ``` 122 | 123 | Examples of **incorrect** code for this rule: 124 | 125 | ```js 126 | // inside "project/packages/welcome-page/index.js" 127 | // configuration: [{ allow: "@project/user-management-shared", scopes: true }] 128 | import foo from "@project/user-management-shared"; 129 | ``` 130 | 131 | Examples of **correct** code for this rule: 132 | 133 | ```js 134 | // inside "project/packages/user-management/registration/index.js" 135 | // configuration: [{ allow: "@project/user-management-shared", scopes: true }] 136 | import foo from "@project/user-management-shared"; 137 | 138 | // inside "project/index.js" 139 | import foo from "./packages/user-management/registration"; 140 | ``` 141 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## [v0.11.1] - 2025-12-14 4 | 5 | - Fixed an issue where rules were incorrectly applied for nested workspace packages ([#42](https://github.com/joshuajaco/eslint-plugin-workspaces/issues/42)) 6 | 7 | ## [v0.11.0] - 2025-05-17 8 | 9 | - Added ESLint v9 flat configuration presets, see [docs](https://github.com/joshuajaco/eslint-plugin-workspaces/blob/v0.11.0/README.md#eslint-v9-flat-config) 10 | - Added TypeScript type definitions 11 | 12 | ## [v0.10.1] - 2024-05-07 13 | 14 | - Fixed an issue where importing a local file with the same name as a workspace would be detected as a workspace import (https://github.com/joshuajaco/eslint-plugin-workspaces/issues/32) 15 | 16 | ## [v0.10.0] - 2023-11-19 17 | 18 | - Updated to new Lerna defaults, see [Lerna v7 changelog](https://github.com/lerna/lerna/blob/main/CHANGELOG.md#breaking-changes) 19 | - Deprecated the [`scopes`](https://github.com/joshuajaco/eslint-plugin-workspaces/blob/main/docs/rules/no-cross-imports.md#scopes-deprecated) option of the [`workspaces/no-cross-imports`](https://github.com/joshuajaco/eslint-plugin-workspaces/blob/main/docs/rules/no-cross-imports.md) rule, it will be removed in the next major version. 20 | For more information, see [Deprecating Scopes](https://github.com/joshuajaco/eslint-plugin-workspaces/blob/main/docs/deprecating-scopes.md). 21 | 22 | ## [v0.9.0] - 2023-06-10 23 | 24 | - Added support for listing workspaces as `peerDependencies` & `optionalDependencies` (https://github.com/joshuajaco/eslint-plugin-workspaces/pull/25) 25 | - Fixed a bug where workspaces that do not have a `name` property defined in their `package.json` file resulted in crashes. They are now being ignored instead. (https://github.com/joshuajaco/eslint-plugin-workspaces/issues/24) 26 | 27 | ## [v0.8.0] - 2023-03-04 28 | 29 | - Replaced the underlying package to resolve monorepo packages (from [get-monorepo-packages](https://github.com/azz/get-monorepo-packages) to [find-workspaces](https://github.com/joshuajaco/find-workspaces)) which comes with a few benefits: 30 | - [pnpm workspaces](https://pnpm.io/workspaces) support 31 | - [bolt](https://github.com/boltpkg/bolt) support 32 | - caching layer which allows this plugin to look for the workspaces root relative to the file that is being linted instead of the current working directory. 33 | This means you can run now eslint from outside a monorepo. 34 | 35 | ## [v0.7.0] - 2021-10-08 36 | 37 | - Fixed a bug where imports were incorrectly flagged as relative imports ([#11](https://github.com/joshuajaco/eslint-plugin-workspaces/issues/11)) 38 | - It is no longer necessary to add the plugin when also extending one of the presets: 39 | 40 | ```patch 41 | { 42 | - "plugins": ["workspaces"], 43 | "extends": ["plugin:workspaces/recommended"] 44 | } 45 | ``` 46 | 47 | ## [v0.6.2] - 2020-10-16 48 | 49 | - Fixed a bug where mismatched dependencies were listed as disallowed ([#9](https://github.com/joshuajaco/eslint-plugin-workspaces/issues/9)) 50 | 51 | ## [v0.6.1] - 2020-10-15 52 | 53 | - Added support for lerna-based eslint runs ([@isachivka](https://github.com/isachivka) in [#10](https://github.com/joshuajaco/eslint-plugin-workspaces/pull/10)) 54 | 55 | ## [v0.6.0] - 2020-10-06 56 | 57 | - Added [Scopes](https://github.com/joshuajaco/eslint-plugin-workspaces/blob/main/docs/rules/no-cross-imports.md#scopes) -- a way to partially allow imports across workspace boundaries ([@tobilen](https://github.com/tobilen) in [#8](https://github.com/joshuajaco/eslint-plugin-workspaces/pull/8)) 58 | - Added this CHANGELOG file 59 | 60 | [v0.11.1]: https://github.com/joshuajaco/eslint-plugin-workspaces/compare/v0.11.0...v0.11.1 61 | [v0.11.0]: https://github.com/joshuajaco/eslint-plugin-workspaces/compare/v0.10.1...v0.11.0 62 | [v0.10.1]: https://github.com/joshuajaco/eslint-plugin-workspaces/compare/v0.10.0...v0.10.1 63 | [v0.10.0]: https://github.com/joshuajaco/eslint-plugin-workspaces/compare/v0.9.0...v0.10.0 64 | [v0.9.0]: https://github.com/joshuajaco/eslint-plugin-workspaces/compare/v0.8.0...v0.9.0 65 | [v0.8.0]: https://github.com/joshuajaco/eslint-plugin-workspaces/compare/v0.7.0...v0.8.0 66 | [v0.7.0]: https://github.com/joshuajaco/eslint-plugin-workspaces/compare/v0.6.2...v0.7.0 67 | [v0.6.2]: https://github.com/joshuajaco/eslint-plugin-workspaces/compare/v0.6.1...v0.6.2 68 | [v0.6.1]: https://github.com/joshuajaco/eslint-plugin-workspaces/compare/v0.6.0...v0.6.1 69 | [v0.6.0]: https://github.com/joshuajaco/eslint-plugin-workspaces/compare/v0.5.5...v0.6.0 70 | -------------------------------------------------------------------------------- /tests/rules/no-relative-imports.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { findWorkspaces } = require("find-workspaces"); 4 | const { ruleTester } = require("../ruleTester"); 5 | const { findWorkspacesMock } = require("../mocks"); 6 | const rule = require("../../lib/rules/no-relative-imports"); 7 | 8 | describe("no-relative-imports", () => { 9 | before(() => findWorkspaces.callsFake(findWorkspacesMock)); 10 | 11 | ruleTester.run("no-relative-imports", rule, { 12 | valid: [ 13 | "import workspace from '@test/workspace';", 14 | "require('@test/workspace');", 15 | "import('@test/workspace');", 16 | "import '@test/workspace';", 17 | "import '../some/relative/path';", 18 | "someFunction();", 19 | { 20 | filename: "/test/workspace/test.js", 21 | code: "import 'root';", 22 | }, 23 | { 24 | filename: "/test/workspace/test.js", 25 | code: "import '../workspace';", 26 | }, 27 | { 28 | filename: "/test/workspace/test.js", 29 | code: "import './some/path';", 30 | }, 31 | { 32 | filename: "/test/workspace/some/path.js", 33 | code: "import '../another/path';", 34 | }, 35 | { 36 | filename: "/test/workspace/test.js", 37 | code: "require(undefined)", 38 | }, 39 | { 40 | filename: "/some/file.js", 41 | code: "import '../test/workspace';", 42 | }, 43 | { 44 | filename: "/test/workspace/index.js", 45 | code: "import './no-npm-scope-workspace';", 46 | }, 47 | { 48 | filename: "/test/outer/index.js", 49 | code: "import './utils.js';", 50 | }, 51 | { 52 | filename: "/test/outer/inner/index.js", 53 | code: "import './utils.js';", 54 | }, 55 | ], 56 | invalid: [ 57 | { 58 | code: "import workspace from '../../test/workspace';", 59 | filename: "/test/another-workspace/test.js", 60 | output: "import workspace from '@test/workspace';", 61 | errors: [ 62 | { 63 | message: "Relative imports of other packages are not allowed", 64 | }, 65 | ], 66 | }, 67 | { 68 | code: "require('../../test/workspace');", 69 | filename: "/test/another-workspace/test.js", 70 | output: "require('@test/workspace');", 71 | errors: [ 72 | { 73 | message: "Relative imports of other packages are not allowed", 74 | }, 75 | ], 76 | }, 77 | { 78 | code: "import('../../test/workspace');", 79 | filename: "/test/another-workspace/test.js", 80 | output: "import('@test/workspace');", 81 | errors: [ 82 | { 83 | message: "Relative imports of other packages are not allowed", 84 | }, 85 | ], 86 | }, 87 | { 88 | code: "async () => await import('../../test/workspace');", 89 | filename: "/test/another-workspace/test.js", 90 | output: "async () => await import('@test/workspace');", 91 | errors: [ 92 | { 93 | message: "Relative imports of other packages are not allowed", 94 | }, 95 | ], 96 | }, 97 | { 98 | code: "import '../../test/workspace';", 99 | filename: "/test/another-workspace/test.js", 100 | output: "import '@test/workspace';", 101 | errors: [ 102 | { 103 | message: "Relative imports of other packages are not allowed", 104 | }, 105 | ], 106 | }, 107 | { 108 | code: "import workspace from '../another-workspace';", 109 | filename: "/test/workspace/test.js", 110 | output: "import workspace from '@test/another-workspace';", 111 | errors: [ 112 | { 113 | message: "Relative imports of other packages are not allowed", 114 | }, 115 | ], 116 | }, 117 | { 118 | code: "import workspace from '../another-workspace/testing';", 119 | filename: "/test/workspace/test.js", 120 | output: "import workspace from '@test/another-workspace/testing';", 121 | errors: [ 122 | { 123 | message: "Relative imports of other packages are not allowed", 124 | }, 125 | ], 126 | }, 127 | ], 128 | }); 129 | 130 | describe("without workspaces", () => { 131 | before(() => findWorkspaces.callsFake(() => null)); 132 | 133 | ruleTester.run("no-relative-imports", rule, { 134 | valid: ["import workspace from '@test/workspace';"], 135 | invalid: [], 136 | }); 137 | }); 138 | }); 139 | -------------------------------------------------------------------------------- /tests/rules/no-absolute-imports.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { findWorkspaces } = require("find-workspaces"); 4 | const { ruleTester, ruleTesterWithSettings } = require("../ruleTester"); 5 | const { findWorkspacesMock } = require("../mocks"); 6 | const rule = require("../../lib/rules/no-absolute-imports"); 7 | 8 | describe("no-absolute-imports", () => { 9 | before(() => findWorkspaces.callsFake(findWorkspacesMock)); 10 | 11 | ruleTester.run("no-absolute-imports", rule, { 12 | valid: [ 13 | "import workspace from '@test/workspace';", 14 | "require('@test/workspace');", 15 | "import('@test/workspace');", 16 | "import '@test/workspace';", 17 | "import '../some/relative/path';", 18 | "someFunction();", 19 | { 20 | filename: "/test/workspace/test.js", 21 | code: "import '../workspace';", 22 | }, 23 | { 24 | filename: "/test/workspace/test.js", 25 | code: "import(`/some/path/${someVar}`);", 26 | }, 27 | { 28 | filename: "/test/workspace/test.js", 29 | code: "import './some/path';", 30 | }, 31 | { 32 | filename: "/test/workspace/some/path.js", 33 | code: "import '../another/path';", 34 | }, 35 | { 36 | filename: "/test/workspace/test.js", 37 | code: "require(undefined)", 38 | }, 39 | { 40 | code: "import workspace from '@test/workspace';", 41 | filename: "/some/path.js", 42 | }, 43 | { 44 | filename: "/test/no-npm-scope-workspace/index.js", 45 | code: "import './no-npm-scope-workspace';", 46 | }, 47 | { 48 | filename: "/test/outer/index.js", 49 | code: "import '@test/inner';", 50 | }, 51 | { 52 | filename: "/test/outer/inner/index.js", 53 | code: "import '@test/outer';", 54 | }, 55 | ], 56 | 57 | invalid: [ 58 | { 59 | code: "import workspace from '@test/workspace/some/path';", 60 | filename: "/test/workspace/some/file.js", 61 | output: "import workspace from './path';", 62 | errors: [ 63 | { 64 | message: 65 | "Absolute imports within the current package are not allowed", 66 | }, 67 | ], 68 | }, 69 | { 70 | code: "import '@test/workspace/some/path';", 71 | filename: "/test/workspace/some/file.js", 72 | output: "import './path';", 73 | errors: [ 74 | { 75 | message: 76 | "Absolute imports within the current package are not allowed", 77 | }, 78 | ], 79 | }, 80 | { 81 | code: "const workspace = require('@test/workspace/some/path');", 82 | filename: "/test/workspace/some/file.js", 83 | output: "const workspace = require('./path');", 84 | errors: [ 85 | { 86 | message: 87 | "Absolute imports within the current package are not allowed", 88 | }, 89 | ], 90 | }, 91 | { 92 | code: "require('@test/workspace/some/path');", 93 | filename: "/test/workspace/some/file.js", 94 | output: "require('./path');", 95 | errors: [ 96 | { 97 | message: 98 | "Absolute imports within the current package are not allowed", 99 | }, 100 | ], 101 | }, 102 | { 103 | code: "import '@test/workspace/some/long/path/file.js';", 104 | filename: "/test/workspace/some/longer/path/file.js", 105 | output: "import '../../long/path/file.js';", 106 | errors: [ 107 | { 108 | message: 109 | "Absolute imports within the current package are not allowed", 110 | }, 111 | ], 112 | }, 113 | { 114 | code: "import '@test/workspace/some/long/path/file.js';", 115 | filename: "/test/workspace/some/file.js", 116 | output: "import './long/path/file.js';", 117 | errors: [ 118 | { 119 | message: 120 | "Absolute imports within the current package are not allowed", 121 | }, 122 | ], 123 | }, 124 | { 125 | code: "import '@test/workspace';", 126 | filename: "/test/workspace/file.js", 127 | output: "import '.';", 128 | errors: [ 129 | { 130 | message: 131 | "Absolute imports within the current package are not allowed", 132 | }, 133 | ], 134 | }, 135 | ], 136 | }); 137 | 138 | describe("without workspaces", () => { 139 | before(() => findWorkspaces.callsFake(() => null)); 140 | 141 | ruleTester.run("no-absolute-imports", rule, { 142 | valid: ["import workspace from '@test/workspace';"], 143 | invalid: [], 144 | }); 145 | }); 146 | 147 | describe("with settings", () => { 148 | ruleTesterWithSettings.run("no-absolute-imports", rule, { 149 | valid: ["import workspace from '@test/workspace';"], 150 | invalid: [], 151 | }); 152 | }); 153 | }); 154 | -------------------------------------------------------------------------------- /tests/rules/no-cross-imports.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { findWorkspaces } = require("find-workspaces"); 4 | const { ruleTester } = require("../ruleTester"); 5 | const { findWorkspacesMock } = require("../mocks"); 6 | const rule = require("../../lib/rules/no-cross-imports"); 7 | 8 | describe("no-cross-imports", () => { 9 | before(() => findWorkspaces.callsFake(findWorkspacesMock)); 10 | 11 | ruleTester.run("no-cross-imports", rule, { 12 | valid: [ 13 | "import module from 'module';", 14 | "require('module');", 15 | "import('module');", 16 | "import 'module';", 17 | "import '../some/relative/path';", 18 | "someFunction();", 19 | "let a;", 20 | { 21 | options: [{ allow: "@test/workspace" }], 22 | filename: "/some/path.js", 23 | code: "import '@test/workspace';", 24 | }, 25 | { 26 | options: [{ allow: ["@test/workspace", "@test/another-workspace"] }], 27 | filename: "/some/path.js", 28 | code: "import '@test/workspace';import '@test/another-workspace';", 29 | }, 30 | { 31 | filename: "/test/workspace/test.js", 32 | code: "import '@test/workspace';", 33 | }, 34 | { 35 | filename: "/test/workspace/test.js", 36 | code: "import './some/thing'", 37 | }, 38 | { 39 | filename: "/test/workspace/test.js", 40 | code: "require(undefined)", 41 | }, 42 | { 43 | filename: "/some/file.js", 44 | code: "import '@test/workspace';", 45 | }, 46 | { 47 | options: [{ scopes: true }], 48 | filename: "/test/scope/workspace/file.js", 49 | code: "import '@test/shared-in-scope';", 50 | }, 51 | { 52 | options: [{ scopes: { enable: true } }], 53 | filename: "/test/scope/workspace/file.js", 54 | code: "import '@test/shared-in-scope';", 55 | }, 56 | { 57 | options: [{ scopes: { enable: true, folderName: "shared" } }], 58 | filename: "/test/scope/workspace/file.js", 59 | code: "import '@test/shared-in-scope';", 60 | }, 61 | { 62 | filename: "/test/workspace/index.js", 63 | code: "import './no-npm-scope-workspace';", 64 | }, 65 | { 66 | filename: "/test/outer/index.js", 67 | code: "import '@test/outer';", 68 | }, 69 | { 70 | filename: "/test/outer/inner/index.js", 71 | code: "import '@test/inner';", 72 | }, 73 | { 74 | filename: "/test/outer/index.js", 75 | code: "import './utils.js';", 76 | }, 77 | { 78 | filename: "/test/outer/inner/index.js", 79 | code: "import './utils.js';", 80 | }, 81 | ], 82 | 83 | invalid: [ 84 | { 85 | code: "import workspace from '@test/workspace';", 86 | filename: "/test/another-workspace/test.js", 87 | errors: [ 88 | { 89 | message: 'Import from package "@test/workspace" is not allowed', 90 | }, 91 | ], 92 | }, 93 | { 94 | code: "import('@test/workspace');", 95 | filename: "/test/another-workspace/test.js", 96 | errors: [ 97 | { 98 | message: 'Import from package "@test/workspace" is not allowed', 99 | }, 100 | ], 101 | }, 102 | { 103 | code: "const test = import('@test/workspace');", 104 | filename: "/test/another-workspace/test.js", 105 | errors: [ 106 | { 107 | message: 'Import from package "@test/workspace" is not allowed', 108 | }, 109 | ], 110 | }, 111 | { 112 | code: "async () => await import('@test/workspace');", 113 | filename: "/test/another-workspace/test.js", 114 | errors: [ 115 | { 116 | message: 'Import from package "@test/workspace" is not allowed', 117 | }, 118 | ], 119 | }, 120 | { 121 | code: "require('@test/workspace');", 122 | filename: "/test/another-workspace/test.js", 123 | errors: [ 124 | { 125 | message: 'Import from package "@test/workspace" is not allowed', 126 | }, 127 | ], 128 | }, 129 | { 130 | code: "const test = require('@test/workspace');", 131 | filename: "/test/another-workspace/test.js", 132 | errors: [ 133 | { 134 | message: 'Import from package "@test/workspace" is not allowed', 135 | }, 136 | ], 137 | }, 138 | { 139 | code: "import '@test/workspace';", 140 | filename: "/test/another-workspace/test.js", 141 | errors: [ 142 | { 143 | message: 'Import from package "@test/workspace" is not allowed', 144 | }, 145 | ], 146 | }, 147 | { 148 | code: "import '@test/workspace/some/path';", 149 | filename: "/test/another-workspace/test.js", 150 | errors: [ 151 | { 152 | message: 'Import from package "@test/workspace" is not allowed', 153 | }, 154 | ], 155 | }, 156 | { 157 | code: "import '../../test/workspace';", 158 | filename: "/test/another-workspace/test.js", 159 | errors: [ 160 | { 161 | message: 'Import from package "@test/workspace" is not allowed', 162 | }, 163 | ], 164 | }, 165 | { 166 | code: "import '../../test/workspace/some/path';", 167 | filename: "/test/another-workspace/test.js", 168 | errors: [ 169 | { 170 | message: 'Import from package "@test/workspace" is not allowed', 171 | }, 172 | ], 173 | }, 174 | { 175 | code: "import '@test/workspace';import '@test/another-workspace';", 176 | filename: "/test/third-workspace/test.js", 177 | errors: [ 178 | { 179 | message: 'Import from package "@test/workspace" is not allowed', 180 | }, 181 | { 182 | message: 183 | 'Import from package "@test/another-workspace" is not allowed', 184 | }, 185 | ], 186 | }, 187 | { 188 | code: "import '@test/workspace';import '@test/another-workspace';", 189 | options: [{ allow: "@test/workspace" }], 190 | filename: "/test/third-workspace/test.js", 191 | errors: [ 192 | { 193 | message: 194 | 'Import from package "@test/another-workspace" is not allowed', 195 | }, 196 | ], 197 | }, 198 | { 199 | options: [{ allow: "@test/workspacetest" }], 200 | filename: "/test/another-workspace/test.js", 201 | code: "import '@test/workspace';", 202 | errors: [ 203 | { 204 | message: 'Import from package "@test/workspace" is not allowed', 205 | }, 206 | ], 207 | }, 208 | { 209 | filename: "/test/workspace/test.js", 210 | code: "import '../another-workspace/test'", 211 | errors: [ 212 | { 213 | message: 214 | 'Import from package "@test/another-workspace" is not allowed', 215 | }, 216 | ], 217 | }, 218 | { 219 | options: [{ scopes: true }], 220 | filename: "/test/scope/workspace/file.js", 221 | code: "import '@test/shared-outside-scope';", 222 | errors: [ 223 | { 224 | message: 225 | 'Import from package "@test/shared-outside-scope" is not allowed', 226 | }, 227 | ], 228 | }, 229 | { 230 | filename: "/test/scope/workspace/file.js", 231 | code: "import '@test/shared-in-scope';", 232 | errors: [ 233 | { 234 | message: 235 | 'Import from package "@test/shared-in-scope" is not allowed', 236 | }, 237 | ], 238 | }, 239 | { 240 | options: [{ scopes: { enable: true, folderName: "something-else" } }], 241 | filename: "/test/scope/workspace/file.js", 242 | code: "import '@test/shared-in-scope';", 243 | errors: [ 244 | { 245 | message: 246 | 'Import from package "@test/shared-in-scope" is not allowed', 247 | }, 248 | ], 249 | }, 250 | ], 251 | }); 252 | 253 | describe("without workspaces", () => { 254 | before(() => findWorkspaces.callsFake(() => null)); 255 | 256 | ruleTester.run("no-cross-imports", rule, { 257 | valid: ["import workspace from '@test/workspace';"], 258 | invalid: [], 259 | }); 260 | }); 261 | }); 262 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | find-workspaces: 12 | specifier: ^0.3.1 13 | version: 0.3.1 14 | devDependencies: 15 | '@eslint/js': 16 | specifier: ^9.39.2 17 | version: 9.39.2 18 | eslint: 19 | specifier: ^9.39.2 20 | version: 9.39.2 21 | eslint-config-prettier: 22 | specifier: ^10.1.8 23 | version: 10.1.8(eslint@9.39.2) 24 | eslint-plugin-eslint-plugin: 25 | specifier: ^6.5.0 26 | version: 6.5.0(eslint@9.39.2) 27 | eslint-plugin-n: 28 | specifier: ^17.23.1 29 | version: 17.23.1(eslint@9.39.2)(typescript@5.9.3) 30 | eslint8: 31 | specifier: npm:eslint@8.57.1 32 | version: eslint@8.57.1 33 | globals: 34 | specifier: ^16.5.0 35 | version: 16.5.0 36 | mocha: 37 | specifier: ^11.7.5 38 | version: 11.7.5 39 | nyc: 40 | specifier: ^17.1.0 41 | version: 17.1.0 42 | prettier: 43 | specifier: ^3.7.4 44 | version: 3.7.4 45 | sinon: 46 | specifier: ^20.0.0 47 | version: 20.0.0 48 | 49 | packages: 50 | 51 | '@babel/code-frame@7.27.1': 52 | resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} 53 | engines: {node: '>=6.9.0'} 54 | 55 | '@babel/compat-data@7.28.5': 56 | resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} 57 | engines: {node: '>=6.9.0'} 58 | 59 | '@babel/core@7.28.5': 60 | resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} 61 | engines: {node: '>=6.9.0'} 62 | 63 | '@babel/generator@7.28.5': 64 | resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} 65 | engines: {node: '>=6.9.0'} 66 | 67 | '@babel/helper-compilation-targets@7.27.2': 68 | resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} 69 | engines: {node: '>=6.9.0'} 70 | 71 | '@babel/helper-globals@7.28.0': 72 | resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} 73 | engines: {node: '>=6.9.0'} 74 | 75 | '@babel/helper-module-imports@7.27.1': 76 | resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} 77 | engines: {node: '>=6.9.0'} 78 | 79 | '@babel/helper-module-transforms@7.28.3': 80 | resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} 81 | engines: {node: '>=6.9.0'} 82 | peerDependencies: 83 | '@babel/core': ^7.0.0 84 | 85 | '@babel/helper-string-parser@7.27.1': 86 | resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 87 | engines: {node: '>=6.9.0'} 88 | 89 | '@babel/helper-validator-identifier@7.28.5': 90 | resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} 91 | engines: {node: '>=6.9.0'} 92 | 93 | '@babel/helper-validator-option@7.27.1': 94 | resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} 95 | engines: {node: '>=6.9.0'} 96 | 97 | '@babel/helpers@7.28.4': 98 | resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} 99 | engines: {node: '>=6.9.0'} 100 | 101 | '@babel/parser@7.28.5': 102 | resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} 103 | engines: {node: '>=6.0.0'} 104 | hasBin: true 105 | 106 | '@babel/template@7.27.2': 107 | resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} 108 | engines: {node: '>=6.9.0'} 109 | 110 | '@babel/traverse@7.28.5': 111 | resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} 112 | engines: {node: '>=6.9.0'} 113 | 114 | '@babel/types@7.28.5': 115 | resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} 116 | engines: {node: '>=6.9.0'} 117 | 118 | '@eslint-community/eslint-utils@4.9.0': 119 | resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} 120 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 121 | peerDependencies: 122 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 123 | 124 | '@eslint-community/regexpp@4.12.2': 125 | resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} 126 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 127 | 128 | '@eslint/config-array@0.21.1': 129 | resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} 130 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 131 | 132 | '@eslint/config-helpers@0.4.2': 133 | resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} 134 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 135 | 136 | '@eslint/core@0.17.0': 137 | resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} 138 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 139 | 140 | '@eslint/eslintrc@2.1.4': 141 | resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} 142 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 143 | 144 | '@eslint/eslintrc@3.3.3': 145 | resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} 146 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 147 | 148 | '@eslint/js@8.57.1': 149 | resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} 150 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 151 | 152 | '@eslint/js@9.39.2': 153 | resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} 154 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 155 | 156 | '@eslint/object-schema@2.1.7': 157 | resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} 158 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 159 | 160 | '@eslint/plugin-kit@0.4.1': 161 | resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} 162 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 163 | 164 | '@humanfs/core@0.19.1': 165 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 166 | engines: {node: '>=18.18.0'} 167 | 168 | '@humanfs/node@0.16.7': 169 | resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} 170 | engines: {node: '>=18.18.0'} 171 | 172 | '@humanwhocodes/config-array@0.13.0': 173 | resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} 174 | engines: {node: '>=10.10.0'} 175 | deprecated: Use @eslint/config-array instead 176 | 177 | '@humanwhocodes/module-importer@1.0.1': 178 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 179 | engines: {node: '>=12.22'} 180 | 181 | '@humanwhocodes/object-schema@2.0.3': 182 | resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} 183 | deprecated: Use @eslint/object-schema instead 184 | 185 | '@humanwhocodes/retry@0.4.3': 186 | resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} 187 | engines: {node: '>=18.18'} 188 | 189 | '@isaacs/cliui@8.0.2': 190 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 191 | engines: {node: '>=12'} 192 | 193 | '@istanbuljs/load-nyc-config@1.1.0': 194 | resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} 195 | engines: {node: '>=8'} 196 | 197 | '@istanbuljs/schema@0.1.3': 198 | resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} 199 | engines: {node: '>=8'} 200 | 201 | '@jridgewell/gen-mapping@0.3.13': 202 | resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} 203 | 204 | '@jridgewell/remapping@2.3.5': 205 | resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} 206 | 207 | '@jridgewell/resolve-uri@3.1.2': 208 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 209 | engines: {node: '>=6.0.0'} 210 | 211 | '@jridgewell/sourcemap-codec@1.5.5': 212 | resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 213 | 214 | '@jridgewell/trace-mapping@0.3.31': 215 | resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} 216 | 217 | '@nodelib/fs.scandir@2.1.5': 218 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 219 | engines: {node: '>= 8'} 220 | 221 | '@nodelib/fs.stat@2.0.5': 222 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 223 | engines: {node: '>= 8'} 224 | 225 | '@nodelib/fs.walk@1.2.8': 226 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 227 | engines: {node: '>= 8'} 228 | 229 | '@pkgjs/parseargs@0.11.0': 230 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 231 | engines: {node: '>=14'} 232 | 233 | '@sinonjs/commons@3.0.1': 234 | resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} 235 | 236 | '@sinonjs/fake-timers@13.0.5': 237 | resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==} 238 | 239 | '@sinonjs/samsam@8.0.3': 240 | resolution: {integrity: sha512-hw6HbX+GyVZzmaYNh82Ecj1vdGZrqVIn/keDTg63IgAwiQPO+xCz99uG6Woqgb4tM0mUiFENKZ4cqd7IX94AXQ==} 241 | 242 | '@types/estree@1.0.8': 243 | resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 244 | 245 | '@types/json-schema@7.0.15': 246 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 247 | 248 | '@ungap/structured-clone@1.3.0': 249 | resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} 250 | 251 | acorn-jsx@5.3.2: 252 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 253 | peerDependencies: 254 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 255 | 256 | acorn@8.15.0: 257 | resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} 258 | engines: {node: '>=0.4.0'} 259 | hasBin: true 260 | 261 | aggregate-error@3.1.0: 262 | resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} 263 | engines: {node: '>=8'} 264 | 265 | ajv@6.12.6: 266 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 267 | 268 | ansi-regex@5.0.1: 269 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 270 | engines: {node: '>=8'} 271 | 272 | ansi-regex@6.2.2: 273 | resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} 274 | engines: {node: '>=12'} 275 | 276 | ansi-styles@4.3.0: 277 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 278 | engines: {node: '>=8'} 279 | 280 | ansi-styles@6.2.3: 281 | resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} 282 | engines: {node: '>=12'} 283 | 284 | append-transform@2.0.0: 285 | resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} 286 | engines: {node: '>=8'} 287 | 288 | archy@1.0.0: 289 | resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} 290 | 291 | argparse@1.0.10: 292 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 293 | 294 | argparse@2.0.1: 295 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 296 | 297 | balanced-match@1.0.2: 298 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 299 | 300 | baseline-browser-mapping@2.9.7: 301 | resolution: {integrity: sha512-k9xFKplee6KIio3IDbwj+uaCLpqzOwakOgmqzPezM0sFJlFKcg30vk2wOiAJtkTSfx0SSQDSe8q+mWA/fSH5Zg==} 302 | hasBin: true 303 | 304 | brace-expansion@1.1.12: 305 | resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} 306 | 307 | brace-expansion@2.0.2: 308 | resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} 309 | 310 | braces@3.0.3: 311 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 312 | engines: {node: '>=8'} 313 | 314 | browser-stdout@1.3.1: 315 | resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} 316 | 317 | browserslist@4.28.1: 318 | resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} 319 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 320 | hasBin: true 321 | 322 | caching-transform@4.0.0: 323 | resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} 324 | engines: {node: '>=8'} 325 | 326 | callsites@3.1.0: 327 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 328 | engines: {node: '>=6'} 329 | 330 | camelcase@5.3.1: 331 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} 332 | engines: {node: '>=6'} 333 | 334 | camelcase@6.3.0: 335 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 336 | engines: {node: '>=10'} 337 | 338 | caniuse-lite@1.0.30001760: 339 | resolution: {integrity: sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==} 340 | 341 | chalk@4.1.2: 342 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 343 | engines: {node: '>=10'} 344 | 345 | chokidar@4.0.3: 346 | resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} 347 | engines: {node: '>= 14.16.0'} 348 | 349 | clean-stack@2.2.0: 350 | resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} 351 | engines: {node: '>=6'} 352 | 353 | cliui@6.0.0: 354 | resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} 355 | 356 | cliui@8.0.1: 357 | resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 358 | engines: {node: '>=12'} 359 | 360 | color-convert@2.0.1: 361 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 362 | engines: {node: '>=7.0.0'} 363 | 364 | color-name@1.1.4: 365 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 366 | 367 | commondir@1.0.1: 368 | resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} 369 | 370 | concat-map@0.0.1: 371 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 372 | 373 | confbox@0.1.8: 374 | resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} 375 | 376 | convert-source-map@1.9.0: 377 | resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} 378 | 379 | convert-source-map@2.0.0: 380 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 381 | 382 | cross-spawn@7.0.6: 383 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 384 | engines: {node: '>= 8'} 385 | 386 | debug@4.4.3: 387 | resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} 388 | engines: {node: '>=6.0'} 389 | peerDependencies: 390 | supports-color: '*' 391 | peerDependenciesMeta: 392 | supports-color: 393 | optional: true 394 | 395 | decamelize@1.2.0: 396 | resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} 397 | engines: {node: '>=0.10.0'} 398 | 399 | decamelize@4.0.0: 400 | resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} 401 | engines: {node: '>=10'} 402 | 403 | deep-is@0.1.4: 404 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 405 | 406 | default-require-extensions@3.0.1: 407 | resolution: {integrity: sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==} 408 | engines: {node: '>=8'} 409 | 410 | diff@7.0.0: 411 | resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} 412 | engines: {node: '>=0.3.1'} 413 | 414 | doctrine@3.0.0: 415 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 416 | engines: {node: '>=6.0.0'} 417 | 418 | eastasianwidth@0.2.0: 419 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 420 | 421 | electron-to-chromium@1.5.267: 422 | resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} 423 | 424 | emoji-regex@8.0.0: 425 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 426 | 427 | emoji-regex@9.2.2: 428 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 429 | 430 | enhanced-resolve@5.18.4: 431 | resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} 432 | engines: {node: '>=10.13.0'} 433 | 434 | es6-error@4.1.1: 435 | resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} 436 | 437 | escalade@3.2.0: 438 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 439 | engines: {node: '>=6'} 440 | 441 | escape-string-regexp@4.0.0: 442 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 443 | engines: {node: '>=10'} 444 | 445 | eslint-compat-utils@0.5.1: 446 | resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} 447 | engines: {node: '>=12'} 448 | peerDependencies: 449 | eslint: '>=6.0.0' 450 | 451 | eslint-config-prettier@10.1.8: 452 | resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} 453 | hasBin: true 454 | peerDependencies: 455 | eslint: '>=7.0.0' 456 | 457 | eslint-plugin-es-x@7.8.0: 458 | resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} 459 | engines: {node: ^14.18.0 || >=16.0.0} 460 | peerDependencies: 461 | eslint: '>=8' 462 | 463 | eslint-plugin-eslint-plugin@6.5.0: 464 | resolution: {integrity: sha512-DT8YpcXDtMBcBZN39JlkHGurHKU8eYFLavTrnowQLeNwqe/diRUsllsftgD/7dZ2/ItabNLLF2/EYapE1H+G7Q==} 465 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 466 | peerDependencies: 467 | eslint: '>=8.23.0' 468 | 469 | eslint-plugin-n@17.23.1: 470 | resolution: {integrity: sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==} 471 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 472 | peerDependencies: 473 | eslint: '>=8.23.0' 474 | 475 | eslint-scope@7.2.2: 476 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 477 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 478 | 479 | eslint-scope@8.4.0: 480 | resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} 481 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 482 | 483 | eslint-visitor-keys@3.4.3: 484 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 485 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 486 | 487 | eslint-visitor-keys@4.2.1: 488 | resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} 489 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 490 | 491 | eslint@8.57.1: 492 | resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} 493 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 494 | deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. 495 | hasBin: true 496 | 497 | eslint@9.39.2: 498 | resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} 499 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 500 | hasBin: true 501 | peerDependencies: 502 | jiti: '*' 503 | peerDependenciesMeta: 504 | jiti: 505 | optional: true 506 | 507 | espree@10.4.0: 508 | resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} 509 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 510 | 511 | espree@9.6.1: 512 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 513 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 514 | 515 | esprima@4.0.1: 516 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 517 | engines: {node: '>=4'} 518 | hasBin: true 519 | 520 | esquery@1.6.0: 521 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 522 | engines: {node: '>=0.10'} 523 | 524 | esrecurse@4.3.0: 525 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 526 | engines: {node: '>=4.0'} 527 | 528 | estraverse@5.3.0: 529 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 530 | engines: {node: '>=4.0'} 531 | 532 | esutils@2.0.3: 533 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 534 | engines: {node: '>=0.10.0'} 535 | 536 | fast-deep-equal@3.1.3: 537 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 538 | 539 | fast-glob@3.3.3: 540 | resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 541 | engines: {node: '>=8.6.0'} 542 | 543 | fast-json-stable-stringify@2.1.0: 544 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 545 | 546 | fast-levenshtein@2.0.6: 547 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 548 | 549 | fastq@1.19.1: 550 | resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} 551 | 552 | file-entry-cache@6.0.1: 553 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 554 | engines: {node: ^10.12.0 || >=12.0.0} 555 | 556 | file-entry-cache@8.0.0: 557 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 558 | engines: {node: '>=16.0.0'} 559 | 560 | fill-range@7.1.1: 561 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 562 | engines: {node: '>=8'} 563 | 564 | find-cache-dir@3.3.2: 565 | resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} 566 | engines: {node: '>=8'} 567 | 568 | find-up@4.1.0: 569 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 570 | engines: {node: '>=8'} 571 | 572 | find-up@5.0.0: 573 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 574 | engines: {node: '>=10'} 575 | 576 | find-workspaces@0.3.1: 577 | resolution: {integrity: sha512-UDkGILGJSA1LN5Aa7McxCid4sqW3/e+UYsVwyxki3dDT0F8+ym0rAfnCkEfkL0rO7M+8/mvkim4t/s3IPHmg+w==} 578 | 579 | flat-cache@3.2.0: 580 | resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} 581 | engines: {node: ^10.12.0 || >=12.0.0} 582 | 583 | flat-cache@4.0.1: 584 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 585 | engines: {node: '>=16'} 586 | 587 | flat@5.0.2: 588 | resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} 589 | hasBin: true 590 | 591 | flatted@3.3.3: 592 | resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} 593 | 594 | foreground-child@2.0.0: 595 | resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} 596 | engines: {node: '>=8.0.0'} 597 | 598 | foreground-child@3.3.1: 599 | resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} 600 | engines: {node: '>=14'} 601 | 602 | fromentries@1.3.2: 603 | resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} 604 | 605 | fs.realpath@1.0.0: 606 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 607 | 608 | gensync@1.0.0-beta.2: 609 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 610 | engines: {node: '>=6.9.0'} 611 | 612 | get-caller-file@2.0.5: 613 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 614 | engines: {node: 6.* || 8.* || >= 10.*} 615 | 616 | get-package-type@0.1.0: 617 | resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} 618 | engines: {node: '>=8.0.0'} 619 | 620 | get-tsconfig@4.13.0: 621 | resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} 622 | 623 | glob-parent@5.1.2: 624 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 625 | engines: {node: '>= 6'} 626 | 627 | glob-parent@6.0.2: 628 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 629 | engines: {node: '>=10.13.0'} 630 | 631 | glob@10.5.0: 632 | resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} 633 | hasBin: true 634 | 635 | glob@7.2.3: 636 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 637 | deprecated: Glob versions prior to v9 are no longer supported 638 | 639 | globals@13.24.0: 640 | resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} 641 | engines: {node: '>=8'} 642 | 643 | globals@14.0.0: 644 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 645 | engines: {node: '>=18'} 646 | 647 | globals@15.15.0: 648 | resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} 649 | engines: {node: '>=18'} 650 | 651 | globals@16.5.0: 652 | resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} 653 | engines: {node: '>=18'} 654 | 655 | globrex@0.1.2: 656 | resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} 657 | 658 | graceful-fs@4.2.11: 659 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 660 | 661 | graphemer@1.4.0: 662 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 663 | 664 | has-flag@4.0.0: 665 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 666 | engines: {node: '>=8'} 667 | 668 | hasha@5.2.2: 669 | resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} 670 | engines: {node: '>=8'} 671 | 672 | he@1.2.0: 673 | resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} 674 | hasBin: true 675 | 676 | html-escaper@2.0.2: 677 | resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} 678 | 679 | ignore@5.3.2: 680 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 681 | engines: {node: '>= 4'} 682 | 683 | import-fresh@3.3.1: 684 | resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 685 | engines: {node: '>=6'} 686 | 687 | imurmurhash@0.1.4: 688 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 689 | engines: {node: '>=0.8.19'} 690 | 691 | indent-string@4.0.0: 692 | resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} 693 | engines: {node: '>=8'} 694 | 695 | inflight@1.0.6: 696 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 697 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. 698 | 699 | inherits@2.0.4: 700 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 701 | 702 | is-extglob@2.1.1: 703 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 704 | engines: {node: '>=0.10.0'} 705 | 706 | is-fullwidth-code-point@3.0.0: 707 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 708 | engines: {node: '>=8'} 709 | 710 | is-glob@4.0.3: 711 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 712 | engines: {node: '>=0.10.0'} 713 | 714 | is-number@7.0.0: 715 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 716 | engines: {node: '>=0.12.0'} 717 | 718 | is-path-inside@3.0.3: 719 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 720 | engines: {node: '>=8'} 721 | 722 | is-plain-obj@2.1.0: 723 | resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} 724 | engines: {node: '>=8'} 725 | 726 | is-stream@2.0.1: 727 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 728 | engines: {node: '>=8'} 729 | 730 | is-typedarray@1.0.0: 731 | resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} 732 | 733 | is-unicode-supported@0.1.0: 734 | resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} 735 | engines: {node: '>=10'} 736 | 737 | is-windows@1.0.2: 738 | resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} 739 | engines: {node: '>=0.10.0'} 740 | 741 | isexe@2.0.0: 742 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 743 | 744 | istanbul-lib-coverage@3.2.2: 745 | resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} 746 | engines: {node: '>=8'} 747 | 748 | istanbul-lib-hook@3.0.0: 749 | resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} 750 | engines: {node: '>=8'} 751 | 752 | istanbul-lib-instrument@6.0.3: 753 | resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} 754 | engines: {node: '>=10'} 755 | 756 | istanbul-lib-processinfo@2.0.3: 757 | resolution: {integrity: sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==} 758 | engines: {node: '>=8'} 759 | 760 | istanbul-lib-report@3.0.1: 761 | resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} 762 | engines: {node: '>=10'} 763 | 764 | istanbul-lib-source-maps@4.0.1: 765 | resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} 766 | engines: {node: '>=10'} 767 | 768 | istanbul-reports@3.2.0: 769 | resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} 770 | engines: {node: '>=8'} 771 | 772 | jackspeak@3.4.3: 773 | resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} 774 | 775 | js-tokens@4.0.0: 776 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 777 | 778 | js-yaml@3.14.2: 779 | resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} 780 | hasBin: true 781 | 782 | js-yaml@4.1.1: 783 | resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} 784 | hasBin: true 785 | 786 | jsesc@3.1.0: 787 | resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} 788 | engines: {node: '>=6'} 789 | hasBin: true 790 | 791 | json-buffer@3.0.1: 792 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 793 | 794 | json-schema-traverse@0.4.1: 795 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 796 | 797 | json-stable-stringify-without-jsonify@1.0.1: 798 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 799 | 800 | json5@2.2.3: 801 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 802 | engines: {node: '>=6'} 803 | hasBin: true 804 | 805 | keyv@4.5.4: 806 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 807 | 808 | levn@0.4.1: 809 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 810 | engines: {node: '>= 0.8.0'} 811 | 812 | locate-path@5.0.0: 813 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 814 | engines: {node: '>=8'} 815 | 816 | locate-path@6.0.0: 817 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 818 | engines: {node: '>=10'} 819 | 820 | lodash.flattendeep@4.4.0: 821 | resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} 822 | 823 | lodash.merge@4.6.2: 824 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 825 | 826 | log-symbols@4.1.0: 827 | resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} 828 | engines: {node: '>=10'} 829 | 830 | lru-cache@10.4.3: 831 | resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 832 | 833 | lru-cache@5.1.1: 834 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 835 | 836 | make-dir@3.1.0: 837 | resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} 838 | engines: {node: '>=8'} 839 | 840 | make-dir@4.0.0: 841 | resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} 842 | engines: {node: '>=10'} 843 | 844 | merge2@1.4.1: 845 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 846 | engines: {node: '>= 8'} 847 | 848 | micromatch@4.0.8: 849 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 850 | engines: {node: '>=8.6'} 851 | 852 | minimatch@3.1.2: 853 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 854 | 855 | minimatch@9.0.5: 856 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 857 | engines: {node: '>=16 || 14 >=14.17'} 858 | 859 | minipass@7.1.2: 860 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 861 | engines: {node: '>=16 || 14 >=14.17'} 862 | 863 | mlly@1.8.0: 864 | resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} 865 | 866 | mocha@11.7.5: 867 | resolution: {integrity: sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==} 868 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 869 | hasBin: true 870 | 871 | ms@2.1.3: 872 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 873 | 874 | natural-compare@1.4.0: 875 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 876 | 877 | node-preload@0.2.1: 878 | resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} 879 | engines: {node: '>=8'} 880 | 881 | node-releases@2.0.27: 882 | resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} 883 | 884 | nyc@17.1.0: 885 | resolution: {integrity: sha512-U42vQ4czpKa0QdI1hu950XuNhYqgoM+ZF1HT+VuUHL9hPfDPVvNQyltmMqdE9bUHMVa+8yNbc3QKTj8zQhlVxQ==} 886 | engines: {node: '>=18'} 887 | hasBin: true 888 | 889 | once@1.4.0: 890 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 891 | 892 | optionator@0.9.4: 893 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 894 | engines: {node: '>= 0.8.0'} 895 | 896 | p-limit@2.3.0: 897 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 898 | engines: {node: '>=6'} 899 | 900 | p-limit@3.1.0: 901 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 902 | engines: {node: '>=10'} 903 | 904 | p-locate@4.1.0: 905 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 906 | engines: {node: '>=8'} 907 | 908 | p-locate@5.0.0: 909 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 910 | engines: {node: '>=10'} 911 | 912 | p-map@3.0.0: 913 | resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} 914 | engines: {node: '>=8'} 915 | 916 | p-try@2.2.0: 917 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 918 | engines: {node: '>=6'} 919 | 920 | package-hash@4.0.0: 921 | resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} 922 | engines: {node: '>=8'} 923 | 924 | package-json-from-dist@1.0.1: 925 | resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 926 | 927 | parent-module@1.0.1: 928 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 929 | engines: {node: '>=6'} 930 | 931 | path-exists@4.0.0: 932 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 933 | engines: {node: '>=8'} 934 | 935 | path-is-absolute@1.0.1: 936 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 937 | engines: {node: '>=0.10.0'} 938 | 939 | path-key@3.1.1: 940 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 941 | engines: {node: '>=8'} 942 | 943 | path-scurry@1.11.1: 944 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 945 | engines: {node: '>=16 || 14 >=14.18'} 946 | 947 | pathe@2.0.3: 948 | resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} 949 | 950 | picocolors@1.1.1: 951 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 952 | 953 | picomatch@2.3.1: 954 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 955 | engines: {node: '>=8.6'} 956 | 957 | picomatch@4.0.3: 958 | resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 959 | engines: {node: '>=12'} 960 | 961 | pkg-dir@4.2.0: 962 | resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} 963 | engines: {node: '>=8'} 964 | 965 | pkg-types@1.3.1: 966 | resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} 967 | 968 | prelude-ls@1.2.1: 969 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 970 | engines: {node: '>= 0.8.0'} 971 | 972 | prettier@3.7.4: 973 | resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==} 974 | engines: {node: '>=14'} 975 | hasBin: true 976 | 977 | process-on-spawn@1.1.0: 978 | resolution: {integrity: sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==} 979 | engines: {node: '>=8'} 980 | 981 | punycode@2.3.1: 982 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 983 | engines: {node: '>=6'} 984 | 985 | queue-microtask@1.2.3: 986 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 987 | 988 | randombytes@2.1.0: 989 | resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} 990 | 991 | readdirp@4.1.2: 992 | resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} 993 | engines: {node: '>= 14.18.0'} 994 | 995 | release-zalgo@1.0.0: 996 | resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} 997 | engines: {node: '>=4'} 998 | 999 | require-directory@2.1.1: 1000 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 1001 | engines: {node: '>=0.10.0'} 1002 | 1003 | require-main-filename@2.0.0: 1004 | resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} 1005 | 1006 | resolve-from@4.0.0: 1007 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1008 | engines: {node: '>=4'} 1009 | 1010 | resolve-from@5.0.0: 1011 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1012 | engines: {node: '>=8'} 1013 | 1014 | resolve-pkg-maps@1.0.0: 1015 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 1016 | 1017 | reusify@1.1.0: 1018 | resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} 1019 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1020 | 1021 | rimraf@3.0.2: 1022 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1023 | deprecated: Rimraf versions prior to v4 are no longer supported 1024 | hasBin: true 1025 | 1026 | run-parallel@1.2.0: 1027 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1028 | 1029 | safe-buffer@5.2.1: 1030 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1031 | 1032 | semver@6.3.1: 1033 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 1034 | hasBin: true 1035 | 1036 | semver@7.7.3: 1037 | resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} 1038 | engines: {node: '>=10'} 1039 | hasBin: true 1040 | 1041 | serialize-javascript@6.0.2: 1042 | resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} 1043 | 1044 | set-blocking@2.0.0: 1045 | resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} 1046 | 1047 | shebang-command@2.0.0: 1048 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1049 | engines: {node: '>=8'} 1050 | 1051 | shebang-regex@3.0.0: 1052 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1053 | engines: {node: '>=8'} 1054 | 1055 | signal-exit@3.0.7: 1056 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 1057 | 1058 | signal-exit@4.1.0: 1059 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1060 | engines: {node: '>=14'} 1061 | 1062 | sinon@20.0.0: 1063 | resolution: {integrity: sha512-+FXOAbdnj94AQIxH0w1v8gzNxkawVvNqE3jUzRLptR71Oykeu2RrQXXl/VQjKay+Qnh73fDt/oDfMo6xMeDQbQ==} 1064 | 1065 | source-map@0.6.1: 1066 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1067 | engines: {node: '>=0.10.0'} 1068 | 1069 | spawn-wrap@2.0.0: 1070 | resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} 1071 | engines: {node: '>=8'} 1072 | 1073 | sprintf-js@1.0.3: 1074 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 1075 | 1076 | string-width@4.2.3: 1077 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1078 | engines: {node: '>=8'} 1079 | 1080 | string-width@5.1.2: 1081 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1082 | engines: {node: '>=12'} 1083 | 1084 | strip-ansi@6.0.1: 1085 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1086 | engines: {node: '>=8'} 1087 | 1088 | strip-ansi@7.1.2: 1089 | resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} 1090 | engines: {node: '>=12'} 1091 | 1092 | strip-bom@4.0.0: 1093 | resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} 1094 | engines: {node: '>=8'} 1095 | 1096 | strip-json-comments@3.1.1: 1097 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1098 | engines: {node: '>=8'} 1099 | 1100 | supports-color@7.2.0: 1101 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1102 | engines: {node: '>=8'} 1103 | 1104 | supports-color@8.1.1: 1105 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 1106 | engines: {node: '>=10'} 1107 | 1108 | tapable@2.3.0: 1109 | resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} 1110 | engines: {node: '>=6'} 1111 | 1112 | test-exclude@6.0.0: 1113 | resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} 1114 | engines: {node: '>=8'} 1115 | 1116 | text-table@0.2.0: 1117 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 1118 | 1119 | to-regex-range@5.0.1: 1120 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1121 | engines: {node: '>=8.0'} 1122 | 1123 | ts-declaration-location@1.0.7: 1124 | resolution: {integrity: sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==} 1125 | peerDependencies: 1126 | typescript: '>=4.0.0' 1127 | 1128 | type-check@0.4.0: 1129 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1130 | engines: {node: '>= 0.8.0'} 1131 | 1132 | type-detect@4.0.8: 1133 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 1134 | engines: {node: '>=4'} 1135 | 1136 | type-detect@4.1.0: 1137 | resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} 1138 | engines: {node: '>=4'} 1139 | 1140 | type-fest@0.20.2: 1141 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 1142 | engines: {node: '>=10'} 1143 | 1144 | type-fest@0.8.1: 1145 | resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} 1146 | engines: {node: '>=8'} 1147 | 1148 | typedarray-to-buffer@3.1.5: 1149 | resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} 1150 | 1151 | typescript@5.9.3: 1152 | resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} 1153 | engines: {node: '>=14.17'} 1154 | hasBin: true 1155 | 1156 | ufo@1.6.1: 1157 | resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} 1158 | 1159 | update-browserslist-db@1.2.2: 1160 | resolution: {integrity: sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==} 1161 | hasBin: true 1162 | peerDependencies: 1163 | browserslist: '>= 4.21.0' 1164 | 1165 | uri-js@4.4.1: 1166 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1167 | 1168 | uuid@8.3.2: 1169 | resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} 1170 | hasBin: true 1171 | 1172 | which-module@2.0.1: 1173 | resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} 1174 | 1175 | which@2.0.2: 1176 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1177 | engines: {node: '>= 8'} 1178 | hasBin: true 1179 | 1180 | word-wrap@1.2.5: 1181 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1182 | engines: {node: '>=0.10.0'} 1183 | 1184 | workerpool@9.3.4: 1185 | resolution: {integrity: sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==} 1186 | 1187 | wrap-ansi@6.2.0: 1188 | resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} 1189 | engines: {node: '>=8'} 1190 | 1191 | wrap-ansi@7.0.0: 1192 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1193 | engines: {node: '>=10'} 1194 | 1195 | wrap-ansi@8.1.0: 1196 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1197 | engines: {node: '>=12'} 1198 | 1199 | wrappy@1.0.2: 1200 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1201 | 1202 | write-file-atomic@3.0.3: 1203 | resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} 1204 | 1205 | y18n@4.0.3: 1206 | resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} 1207 | 1208 | y18n@5.0.8: 1209 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 1210 | engines: {node: '>=10'} 1211 | 1212 | yallist@3.1.1: 1213 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 1214 | 1215 | yaml@2.8.2: 1216 | resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} 1217 | engines: {node: '>= 14.6'} 1218 | hasBin: true 1219 | 1220 | yargs-parser@18.1.3: 1221 | resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} 1222 | engines: {node: '>=6'} 1223 | 1224 | yargs-parser@21.1.1: 1225 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 1226 | engines: {node: '>=12'} 1227 | 1228 | yargs-unparser@2.0.0: 1229 | resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} 1230 | engines: {node: '>=10'} 1231 | 1232 | yargs@15.4.1: 1233 | resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} 1234 | engines: {node: '>=8'} 1235 | 1236 | yargs@17.7.2: 1237 | resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 1238 | engines: {node: '>=12'} 1239 | 1240 | yocto-queue@0.1.0: 1241 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1242 | engines: {node: '>=10'} 1243 | 1244 | snapshots: 1245 | 1246 | '@babel/code-frame@7.27.1': 1247 | dependencies: 1248 | '@babel/helper-validator-identifier': 7.28.5 1249 | js-tokens: 4.0.0 1250 | picocolors: 1.1.1 1251 | 1252 | '@babel/compat-data@7.28.5': {} 1253 | 1254 | '@babel/core@7.28.5': 1255 | dependencies: 1256 | '@babel/code-frame': 7.27.1 1257 | '@babel/generator': 7.28.5 1258 | '@babel/helper-compilation-targets': 7.27.2 1259 | '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) 1260 | '@babel/helpers': 7.28.4 1261 | '@babel/parser': 7.28.5 1262 | '@babel/template': 7.27.2 1263 | '@babel/traverse': 7.28.5 1264 | '@babel/types': 7.28.5 1265 | '@jridgewell/remapping': 2.3.5 1266 | convert-source-map: 2.0.0 1267 | debug: 4.4.3(supports-color@8.1.1) 1268 | gensync: 1.0.0-beta.2 1269 | json5: 2.2.3 1270 | semver: 6.3.1 1271 | transitivePeerDependencies: 1272 | - supports-color 1273 | 1274 | '@babel/generator@7.28.5': 1275 | dependencies: 1276 | '@babel/parser': 7.28.5 1277 | '@babel/types': 7.28.5 1278 | '@jridgewell/gen-mapping': 0.3.13 1279 | '@jridgewell/trace-mapping': 0.3.31 1280 | jsesc: 3.1.0 1281 | 1282 | '@babel/helper-compilation-targets@7.27.2': 1283 | dependencies: 1284 | '@babel/compat-data': 7.28.5 1285 | '@babel/helper-validator-option': 7.27.1 1286 | browserslist: 4.28.1 1287 | lru-cache: 5.1.1 1288 | semver: 6.3.1 1289 | 1290 | '@babel/helper-globals@7.28.0': {} 1291 | 1292 | '@babel/helper-module-imports@7.27.1': 1293 | dependencies: 1294 | '@babel/traverse': 7.28.5 1295 | '@babel/types': 7.28.5 1296 | transitivePeerDependencies: 1297 | - supports-color 1298 | 1299 | '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': 1300 | dependencies: 1301 | '@babel/core': 7.28.5 1302 | '@babel/helper-module-imports': 7.27.1 1303 | '@babel/helper-validator-identifier': 7.28.5 1304 | '@babel/traverse': 7.28.5 1305 | transitivePeerDependencies: 1306 | - supports-color 1307 | 1308 | '@babel/helper-string-parser@7.27.1': {} 1309 | 1310 | '@babel/helper-validator-identifier@7.28.5': {} 1311 | 1312 | '@babel/helper-validator-option@7.27.1': {} 1313 | 1314 | '@babel/helpers@7.28.4': 1315 | dependencies: 1316 | '@babel/template': 7.27.2 1317 | '@babel/types': 7.28.5 1318 | 1319 | '@babel/parser@7.28.5': 1320 | dependencies: 1321 | '@babel/types': 7.28.5 1322 | 1323 | '@babel/template@7.27.2': 1324 | dependencies: 1325 | '@babel/code-frame': 7.27.1 1326 | '@babel/parser': 7.28.5 1327 | '@babel/types': 7.28.5 1328 | 1329 | '@babel/traverse@7.28.5': 1330 | dependencies: 1331 | '@babel/code-frame': 7.27.1 1332 | '@babel/generator': 7.28.5 1333 | '@babel/helper-globals': 7.28.0 1334 | '@babel/parser': 7.28.5 1335 | '@babel/template': 7.27.2 1336 | '@babel/types': 7.28.5 1337 | debug: 4.4.3(supports-color@8.1.1) 1338 | transitivePeerDependencies: 1339 | - supports-color 1340 | 1341 | '@babel/types@7.28.5': 1342 | dependencies: 1343 | '@babel/helper-string-parser': 7.27.1 1344 | '@babel/helper-validator-identifier': 7.28.5 1345 | 1346 | '@eslint-community/eslint-utils@4.9.0(eslint@9.39.2)': 1347 | dependencies: 1348 | eslint: 9.39.2 1349 | eslint-visitor-keys: 3.4.3 1350 | 1351 | '@eslint-community/regexpp@4.12.2': {} 1352 | 1353 | '@eslint/config-array@0.21.1': 1354 | dependencies: 1355 | '@eslint/object-schema': 2.1.7 1356 | debug: 4.4.3(supports-color@8.1.1) 1357 | minimatch: 3.1.2 1358 | transitivePeerDependencies: 1359 | - supports-color 1360 | 1361 | '@eslint/config-helpers@0.4.2': 1362 | dependencies: 1363 | '@eslint/core': 0.17.0 1364 | 1365 | '@eslint/core@0.17.0': 1366 | dependencies: 1367 | '@types/json-schema': 7.0.15 1368 | 1369 | '@eslint/eslintrc@2.1.4': 1370 | dependencies: 1371 | ajv: 6.12.6 1372 | debug: 4.4.3(supports-color@8.1.1) 1373 | espree: 9.6.1 1374 | globals: 13.24.0 1375 | ignore: 5.3.2 1376 | import-fresh: 3.3.1 1377 | js-yaml: 4.1.1 1378 | minimatch: 3.1.2 1379 | strip-json-comments: 3.1.1 1380 | transitivePeerDependencies: 1381 | - supports-color 1382 | 1383 | '@eslint/eslintrc@3.3.3': 1384 | dependencies: 1385 | ajv: 6.12.6 1386 | debug: 4.4.3(supports-color@8.1.1) 1387 | espree: 10.4.0 1388 | globals: 14.0.0 1389 | ignore: 5.3.2 1390 | import-fresh: 3.3.1 1391 | js-yaml: 4.1.1 1392 | minimatch: 3.1.2 1393 | strip-json-comments: 3.1.1 1394 | transitivePeerDependencies: 1395 | - supports-color 1396 | 1397 | '@eslint/js@8.57.1': {} 1398 | 1399 | '@eslint/js@9.39.2': {} 1400 | 1401 | '@eslint/object-schema@2.1.7': {} 1402 | 1403 | '@eslint/plugin-kit@0.4.1': 1404 | dependencies: 1405 | '@eslint/core': 0.17.0 1406 | levn: 0.4.1 1407 | 1408 | '@humanfs/core@0.19.1': {} 1409 | 1410 | '@humanfs/node@0.16.7': 1411 | dependencies: 1412 | '@humanfs/core': 0.19.1 1413 | '@humanwhocodes/retry': 0.4.3 1414 | 1415 | '@humanwhocodes/config-array@0.13.0': 1416 | dependencies: 1417 | '@humanwhocodes/object-schema': 2.0.3 1418 | debug: 4.4.3(supports-color@8.1.1) 1419 | minimatch: 3.1.2 1420 | transitivePeerDependencies: 1421 | - supports-color 1422 | 1423 | '@humanwhocodes/module-importer@1.0.1': {} 1424 | 1425 | '@humanwhocodes/object-schema@2.0.3': {} 1426 | 1427 | '@humanwhocodes/retry@0.4.3': {} 1428 | 1429 | '@isaacs/cliui@8.0.2': 1430 | dependencies: 1431 | string-width: 5.1.2 1432 | string-width-cjs: string-width@4.2.3 1433 | strip-ansi: 7.1.2 1434 | strip-ansi-cjs: strip-ansi@6.0.1 1435 | wrap-ansi: 8.1.0 1436 | wrap-ansi-cjs: wrap-ansi@7.0.0 1437 | 1438 | '@istanbuljs/load-nyc-config@1.1.0': 1439 | dependencies: 1440 | camelcase: 5.3.1 1441 | find-up: 4.1.0 1442 | get-package-type: 0.1.0 1443 | js-yaml: 3.14.2 1444 | resolve-from: 5.0.0 1445 | 1446 | '@istanbuljs/schema@0.1.3': {} 1447 | 1448 | '@jridgewell/gen-mapping@0.3.13': 1449 | dependencies: 1450 | '@jridgewell/sourcemap-codec': 1.5.5 1451 | '@jridgewell/trace-mapping': 0.3.31 1452 | 1453 | '@jridgewell/remapping@2.3.5': 1454 | dependencies: 1455 | '@jridgewell/gen-mapping': 0.3.13 1456 | '@jridgewell/trace-mapping': 0.3.31 1457 | 1458 | '@jridgewell/resolve-uri@3.1.2': {} 1459 | 1460 | '@jridgewell/sourcemap-codec@1.5.5': {} 1461 | 1462 | '@jridgewell/trace-mapping@0.3.31': 1463 | dependencies: 1464 | '@jridgewell/resolve-uri': 3.1.2 1465 | '@jridgewell/sourcemap-codec': 1.5.5 1466 | 1467 | '@nodelib/fs.scandir@2.1.5': 1468 | dependencies: 1469 | '@nodelib/fs.stat': 2.0.5 1470 | run-parallel: 1.2.0 1471 | 1472 | '@nodelib/fs.stat@2.0.5': {} 1473 | 1474 | '@nodelib/fs.walk@1.2.8': 1475 | dependencies: 1476 | '@nodelib/fs.scandir': 2.1.5 1477 | fastq: 1.19.1 1478 | 1479 | '@pkgjs/parseargs@0.11.0': 1480 | optional: true 1481 | 1482 | '@sinonjs/commons@3.0.1': 1483 | dependencies: 1484 | type-detect: 4.0.8 1485 | 1486 | '@sinonjs/fake-timers@13.0.5': 1487 | dependencies: 1488 | '@sinonjs/commons': 3.0.1 1489 | 1490 | '@sinonjs/samsam@8.0.3': 1491 | dependencies: 1492 | '@sinonjs/commons': 3.0.1 1493 | type-detect: 4.1.0 1494 | 1495 | '@types/estree@1.0.8': {} 1496 | 1497 | '@types/json-schema@7.0.15': {} 1498 | 1499 | '@ungap/structured-clone@1.3.0': {} 1500 | 1501 | acorn-jsx@5.3.2(acorn@8.15.0): 1502 | dependencies: 1503 | acorn: 8.15.0 1504 | 1505 | acorn@8.15.0: {} 1506 | 1507 | aggregate-error@3.1.0: 1508 | dependencies: 1509 | clean-stack: 2.2.0 1510 | indent-string: 4.0.0 1511 | 1512 | ajv@6.12.6: 1513 | dependencies: 1514 | fast-deep-equal: 3.1.3 1515 | fast-json-stable-stringify: 2.1.0 1516 | json-schema-traverse: 0.4.1 1517 | uri-js: 4.4.1 1518 | 1519 | ansi-regex@5.0.1: {} 1520 | 1521 | ansi-regex@6.2.2: {} 1522 | 1523 | ansi-styles@4.3.0: 1524 | dependencies: 1525 | color-convert: 2.0.1 1526 | 1527 | ansi-styles@6.2.3: {} 1528 | 1529 | append-transform@2.0.0: 1530 | dependencies: 1531 | default-require-extensions: 3.0.1 1532 | 1533 | archy@1.0.0: {} 1534 | 1535 | argparse@1.0.10: 1536 | dependencies: 1537 | sprintf-js: 1.0.3 1538 | 1539 | argparse@2.0.1: {} 1540 | 1541 | balanced-match@1.0.2: {} 1542 | 1543 | baseline-browser-mapping@2.9.7: {} 1544 | 1545 | brace-expansion@1.1.12: 1546 | dependencies: 1547 | balanced-match: 1.0.2 1548 | concat-map: 0.0.1 1549 | 1550 | brace-expansion@2.0.2: 1551 | dependencies: 1552 | balanced-match: 1.0.2 1553 | 1554 | braces@3.0.3: 1555 | dependencies: 1556 | fill-range: 7.1.1 1557 | 1558 | browser-stdout@1.3.1: {} 1559 | 1560 | browserslist@4.28.1: 1561 | dependencies: 1562 | baseline-browser-mapping: 2.9.7 1563 | caniuse-lite: 1.0.30001760 1564 | electron-to-chromium: 1.5.267 1565 | node-releases: 2.0.27 1566 | update-browserslist-db: 1.2.2(browserslist@4.28.1) 1567 | 1568 | caching-transform@4.0.0: 1569 | dependencies: 1570 | hasha: 5.2.2 1571 | make-dir: 3.1.0 1572 | package-hash: 4.0.0 1573 | write-file-atomic: 3.0.3 1574 | 1575 | callsites@3.1.0: {} 1576 | 1577 | camelcase@5.3.1: {} 1578 | 1579 | camelcase@6.3.0: {} 1580 | 1581 | caniuse-lite@1.0.30001760: {} 1582 | 1583 | chalk@4.1.2: 1584 | dependencies: 1585 | ansi-styles: 4.3.0 1586 | supports-color: 7.2.0 1587 | 1588 | chokidar@4.0.3: 1589 | dependencies: 1590 | readdirp: 4.1.2 1591 | 1592 | clean-stack@2.2.0: {} 1593 | 1594 | cliui@6.0.0: 1595 | dependencies: 1596 | string-width: 4.2.3 1597 | strip-ansi: 6.0.1 1598 | wrap-ansi: 6.2.0 1599 | 1600 | cliui@8.0.1: 1601 | dependencies: 1602 | string-width: 4.2.3 1603 | strip-ansi: 6.0.1 1604 | wrap-ansi: 7.0.0 1605 | 1606 | color-convert@2.0.1: 1607 | dependencies: 1608 | color-name: 1.1.4 1609 | 1610 | color-name@1.1.4: {} 1611 | 1612 | commondir@1.0.1: {} 1613 | 1614 | concat-map@0.0.1: {} 1615 | 1616 | confbox@0.1.8: {} 1617 | 1618 | convert-source-map@1.9.0: {} 1619 | 1620 | convert-source-map@2.0.0: {} 1621 | 1622 | cross-spawn@7.0.6: 1623 | dependencies: 1624 | path-key: 3.1.1 1625 | shebang-command: 2.0.0 1626 | which: 2.0.2 1627 | 1628 | debug@4.4.3(supports-color@8.1.1): 1629 | dependencies: 1630 | ms: 2.1.3 1631 | optionalDependencies: 1632 | supports-color: 8.1.1 1633 | 1634 | decamelize@1.2.0: {} 1635 | 1636 | decamelize@4.0.0: {} 1637 | 1638 | deep-is@0.1.4: {} 1639 | 1640 | default-require-extensions@3.0.1: 1641 | dependencies: 1642 | strip-bom: 4.0.0 1643 | 1644 | diff@7.0.0: {} 1645 | 1646 | doctrine@3.0.0: 1647 | dependencies: 1648 | esutils: 2.0.3 1649 | 1650 | eastasianwidth@0.2.0: {} 1651 | 1652 | electron-to-chromium@1.5.267: {} 1653 | 1654 | emoji-regex@8.0.0: {} 1655 | 1656 | emoji-regex@9.2.2: {} 1657 | 1658 | enhanced-resolve@5.18.4: 1659 | dependencies: 1660 | graceful-fs: 4.2.11 1661 | tapable: 2.3.0 1662 | 1663 | es6-error@4.1.1: {} 1664 | 1665 | escalade@3.2.0: {} 1666 | 1667 | escape-string-regexp@4.0.0: {} 1668 | 1669 | eslint-compat-utils@0.5.1(eslint@9.39.2): 1670 | dependencies: 1671 | eslint: 9.39.2 1672 | semver: 7.7.3 1673 | 1674 | eslint-config-prettier@10.1.8(eslint@9.39.2): 1675 | dependencies: 1676 | eslint: 9.39.2 1677 | 1678 | eslint-plugin-es-x@7.8.0(eslint@9.39.2): 1679 | dependencies: 1680 | '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2) 1681 | '@eslint-community/regexpp': 4.12.2 1682 | eslint: 9.39.2 1683 | eslint-compat-utils: 0.5.1(eslint@9.39.2) 1684 | 1685 | eslint-plugin-eslint-plugin@6.5.0(eslint@9.39.2): 1686 | dependencies: 1687 | '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2) 1688 | eslint: 9.39.2 1689 | estraverse: 5.3.0 1690 | 1691 | eslint-plugin-n@17.23.1(eslint@9.39.2)(typescript@5.9.3): 1692 | dependencies: 1693 | '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2) 1694 | enhanced-resolve: 5.18.4 1695 | eslint: 9.39.2 1696 | eslint-plugin-es-x: 7.8.0(eslint@9.39.2) 1697 | get-tsconfig: 4.13.0 1698 | globals: 15.15.0 1699 | globrex: 0.1.2 1700 | ignore: 5.3.2 1701 | semver: 7.7.3 1702 | ts-declaration-location: 1.0.7(typescript@5.9.3) 1703 | transitivePeerDependencies: 1704 | - typescript 1705 | 1706 | eslint-scope@7.2.2: 1707 | dependencies: 1708 | esrecurse: 4.3.0 1709 | estraverse: 5.3.0 1710 | 1711 | eslint-scope@8.4.0: 1712 | dependencies: 1713 | esrecurse: 4.3.0 1714 | estraverse: 5.3.0 1715 | 1716 | eslint-visitor-keys@3.4.3: {} 1717 | 1718 | eslint-visitor-keys@4.2.1: {} 1719 | 1720 | eslint@8.57.1: 1721 | dependencies: 1722 | '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2) 1723 | '@eslint-community/regexpp': 4.12.2 1724 | '@eslint/eslintrc': 2.1.4 1725 | '@eslint/js': 8.57.1 1726 | '@humanwhocodes/config-array': 0.13.0 1727 | '@humanwhocodes/module-importer': 1.0.1 1728 | '@nodelib/fs.walk': 1.2.8 1729 | '@ungap/structured-clone': 1.3.0 1730 | ajv: 6.12.6 1731 | chalk: 4.1.2 1732 | cross-spawn: 7.0.6 1733 | debug: 4.4.3(supports-color@8.1.1) 1734 | doctrine: 3.0.0 1735 | escape-string-regexp: 4.0.0 1736 | eslint-scope: 7.2.2 1737 | eslint-visitor-keys: 3.4.3 1738 | espree: 9.6.1 1739 | esquery: 1.6.0 1740 | esutils: 2.0.3 1741 | fast-deep-equal: 3.1.3 1742 | file-entry-cache: 6.0.1 1743 | find-up: 5.0.0 1744 | glob-parent: 6.0.2 1745 | globals: 13.24.0 1746 | graphemer: 1.4.0 1747 | ignore: 5.3.2 1748 | imurmurhash: 0.1.4 1749 | is-glob: 4.0.3 1750 | is-path-inside: 3.0.3 1751 | js-yaml: 4.1.1 1752 | json-stable-stringify-without-jsonify: 1.0.1 1753 | levn: 0.4.1 1754 | lodash.merge: 4.6.2 1755 | minimatch: 3.1.2 1756 | natural-compare: 1.4.0 1757 | optionator: 0.9.4 1758 | strip-ansi: 6.0.1 1759 | text-table: 0.2.0 1760 | transitivePeerDependencies: 1761 | - supports-color 1762 | 1763 | eslint@9.39.2: 1764 | dependencies: 1765 | '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2) 1766 | '@eslint-community/regexpp': 4.12.2 1767 | '@eslint/config-array': 0.21.1 1768 | '@eslint/config-helpers': 0.4.2 1769 | '@eslint/core': 0.17.0 1770 | '@eslint/eslintrc': 3.3.3 1771 | '@eslint/js': 9.39.2 1772 | '@eslint/plugin-kit': 0.4.1 1773 | '@humanfs/node': 0.16.7 1774 | '@humanwhocodes/module-importer': 1.0.1 1775 | '@humanwhocodes/retry': 0.4.3 1776 | '@types/estree': 1.0.8 1777 | ajv: 6.12.6 1778 | chalk: 4.1.2 1779 | cross-spawn: 7.0.6 1780 | debug: 4.4.3(supports-color@8.1.1) 1781 | escape-string-regexp: 4.0.0 1782 | eslint-scope: 8.4.0 1783 | eslint-visitor-keys: 4.2.1 1784 | espree: 10.4.0 1785 | esquery: 1.6.0 1786 | esutils: 2.0.3 1787 | fast-deep-equal: 3.1.3 1788 | file-entry-cache: 8.0.0 1789 | find-up: 5.0.0 1790 | glob-parent: 6.0.2 1791 | ignore: 5.3.2 1792 | imurmurhash: 0.1.4 1793 | is-glob: 4.0.3 1794 | json-stable-stringify-without-jsonify: 1.0.1 1795 | lodash.merge: 4.6.2 1796 | minimatch: 3.1.2 1797 | natural-compare: 1.4.0 1798 | optionator: 0.9.4 1799 | transitivePeerDependencies: 1800 | - supports-color 1801 | 1802 | espree@10.4.0: 1803 | dependencies: 1804 | acorn: 8.15.0 1805 | acorn-jsx: 5.3.2(acorn@8.15.0) 1806 | eslint-visitor-keys: 4.2.1 1807 | 1808 | espree@9.6.1: 1809 | dependencies: 1810 | acorn: 8.15.0 1811 | acorn-jsx: 5.3.2(acorn@8.15.0) 1812 | eslint-visitor-keys: 3.4.3 1813 | 1814 | esprima@4.0.1: {} 1815 | 1816 | esquery@1.6.0: 1817 | dependencies: 1818 | estraverse: 5.3.0 1819 | 1820 | esrecurse@4.3.0: 1821 | dependencies: 1822 | estraverse: 5.3.0 1823 | 1824 | estraverse@5.3.0: {} 1825 | 1826 | esutils@2.0.3: {} 1827 | 1828 | fast-deep-equal@3.1.3: {} 1829 | 1830 | fast-glob@3.3.3: 1831 | dependencies: 1832 | '@nodelib/fs.stat': 2.0.5 1833 | '@nodelib/fs.walk': 1.2.8 1834 | glob-parent: 5.1.2 1835 | merge2: 1.4.1 1836 | micromatch: 4.0.8 1837 | 1838 | fast-json-stable-stringify@2.1.0: {} 1839 | 1840 | fast-levenshtein@2.0.6: {} 1841 | 1842 | fastq@1.19.1: 1843 | dependencies: 1844 | reusify: 1.1.0 1845 | 1846 | file-entry-cache@6.0.1: 1847 | dependencies: 1848 | flat-cache: 3.2.0 1849 | 1850 | file-entry-cache@8.0.0: 1851 | dependencies: 1852 | flat-cache: 4.0.1 1853 | 1854 | fill-range@7.1.1: 1855 | dependencies: 1856 | to-regex-range: 5.0.1 1857 | 1858 | find-cache-dir@3.3.2: 1859 | dependencies: 1860 | commondir: 1.0.1 1861 | make-dir: 3.1.0 1862 | pkg-dir: 4.2.0 1863 | 1864 | find-up@4.1.0: 1865 | dependencies: 1866 | locate-path: 5.0.0 1867 | path-exists: 4.0.0 1868 | 1869 | find-up@5.0.0: 1870 | dependencies: 1871 | locate-path: 6.0.0 1872 | path-exists: 4.0.0 1873 | 1874 | find-workspaces@0.3.1: 1875 | dependencies: 1876 | fast-glob: 3.3.3 1877 | pkg-types: 1.3.1 1878 | yaml: 2.8.2 1879 | 1880 | flat-cache@3.2.0: 1881 | dependencies: 1882 | flatted: 3.3.3 1883 | keyv: 4.5.4 1884 | rimraf: 3.0.2 1885 | 1886 | flat-cache@4.0.1: 1887 | dependencies: 1888 | flatted: 3.3.3 1889 | keyv: 4.5.4 1890 | 1891 | flat@5.0.2: {} 1892 | 1893 | flatted@3.3.3: {} 1894 | 1895 | foreground-child@2.0.0: 1896 | dependencies: 1897 | cross-spawn: 7.0.6 1898 | signal-exit: 3.0.7 1899 | 1900 | foreground-child@3.3.1: 1901 | dependencies: 1902 | cross-spawn: 7.0.6 1903 | signal-exit: 4.1.0 1904 | 1905 | fromentries@1.3.2: {} 1906 | 1907 | fs.realpath@1.0.0: {} 1908 | 1909 | gensync@1.0.0-beta.2: {} 1910 | 1911 | get-caller-file@2.0.5: {} 1912 | 1913 | get-package-type@0.1.0: {} 1914 | 1915 | get-tsconfig@4.13.0: 1916 | dependencies: 1917 | resolve-pkg-maps: 1.0.0 1918 | 1919 | glob-parent@5.1.2: 1920 | dependencies: 1921 | is-glob: 4.0.3 1922 | 1923 | glob-parent@6.0.2: 1924 | dependencies: 1925 | is-glob: 4.0.3 1926 | 1927 | glob@10.5.0: 1928 | dependencies: 1929 | foreground-child: 3.3.1 1930 | jackspeak: 3.4.3 1931 | minimatch: 9.0.5 1932 | minipass: 7.1.2 1933 | package-json-from-dist: 1.0.1 1934 | path-scurry: 1.11.1 1935 | 1936 | glob@7.2.3: 1937 | dependencies: 1938 | fs.realpath: 1.0.0 1939 | inflight: 1.0.6 1940 | inherits: 2.0.4 1941 | minimatch: 3.1.2 1942 | once: 1.4.0 1943 | path-is-absolute: 1.0.1 1944 | 1945 | globals@13.24.0: 1946 | dependencies: 1947 | type-fest: 0.20.2 1948 | 1949 | globals@14.0.0: {} 1950 | 1951 | globals@15.15.0: {} 1952 | 1953 | globals@16.5.0: {} 1954 | 1955 | globrex@0.1.2: {} 1956 | 1957 | graceful-fs@4.2.11: {} 1958 | 1959 | graphemer@1.4.0: {} 1960 | 1961 | has-flag@4.0.0: {} 1962 | 1963 | hasha@5.2.2: 1964 | dependencies: 1965 | is-stream: 2.0.1 1966 | type-fest: 0.8.1 1967 | 1968 | he@1.2.0: {} 1969 | 1970 | html-escaper@2.0.2: {} 1971 | 1972 | ignore@5.3.2: {} 1973 | 1974 | import-fresh@3.3.1: 1975 | dependencies: 1976 | parent-module: 1.0.1 1977 | resolve-from: 4.0.0 1978 | 1979 | imurmurhash@0.1.4: {} 1980 | 1981 | indent-string@4.0.0: {} 1982 | 1983 | inflight@1.0.6: 1984 | dependencies: 1985 | once: 1.4.0 1986 | wrappy: 1.0.2 1987 | 1988 | inherits@2.0.4: {} 1989 | 1990 | is-extglob@2.1.1: {} 1991 | 1992 | is-fullwidth-code-point@3.0.0: {} 1993 | 1994 | is-glob@4.0.3: 1995 | dependencies: 1996 | is-extglob: 2.1.1 1997 | 1998 | is-number@7.0.0: {} 1999 | 2000 | is-path-inside@3.0.3: {} 2001 | 2002 | is-plain-obj@2.1.0: {} 2003 | 2004 | is-stream@2.0.1: {} 2005 | 2006 | is-typedarray@1.0.0: {} 2007 | 2008 | is-unicode-supported@0.1.0: {} 2009 | 2010 | is-windows@1.0.2: {} 2011 | 2012 | isexe@2.0.0: {} 2013 | 2014 | istanbul-lib-coverage@3.2.2: {} 2015 | 2016 | istanbul-lib-hook@3.0.0: 2017 | dependencies: 2018 | append-transform: 2.0.0 2019 | 2020 | istanbul-lib-instrument@6.0.3: 2021 | dependencies: 2022 | '@babel/core': 7.28.5 2023 | '@babel/parser': 7.28.5 2024 | '@istanbuljs/schema': 0.1.3 2025 | istanbul-lib-coverage: 3.2.2 2026 | semver: 7.7.3 2027 | transitivePeerDependencies: 2028 | - supports-color 2029 | 2030 | istanbul-lib-processinfo@2.0.3: 2031 | dependencies: 2032 | archy: 1.0.0 2033 | cross-spawn: 7.0.6 2034 | istanbul-lib-coverage: 3.2.2 2035 | p-map: 3.0.0 2036 | rimraf: 3.0.2 2037 | uuid: 8.3.2 2038 | 2039 | istanbul-lib-report@3.0.1: 2040 | dependencies: 2041 | istanbul-lib-coverage: 3.2.2 2042 | make-dir: 4.0.0 2043 | supports-color: 7.2.0 2044 | 2045 | istanbul-lib-source-maps@4.0.1: 2046 | dependencies: 2047 | debug: 4.4.3(supports-color@8.1.1) 2048 | istanbul-lib-coverage: 3.2.2 2049 | source-map: 0.6.1 2050 | transitivePeerDependencies: 2051 | - supports-color 2052 | 2053 | istanbul-reports@3.2.0: 2054 | dependencies: 2055 | html-escaper: 2.0.2 2056 | istanbul-lib-report: 3.0.1 2057 | 2058 | jackspeak@3.4.3: 2059 | dependencies: 2060 | '@isaacs/cliui': 8.0.2 2061 | optionalDependencies: 2062 | '@pkgjs/parseargs': 0.11.0 2063 | 2064 | js-tokens@4.0.0: {} 2065 | 2066 | js-yaml@3.14.2: 2067 | dependencies: 2068 | argparse: 1.0.10 2069 | esprima: 4.0.1 2070 | 2071 | js-yaml@4.1.1: 2072 | dependencies: 2073 | argparse: 2.0.1 2074 | 2075 | jsesc@3.1.0: {} 2076 | 2077 | json-buffer@3.0.1: {} 2078 | 2079 | json-schema-traverse@0.4.1: {} 2080 | 2081 | json-stable-stringify-without-jsonify@1.0.1: {} 2082 | 2083 | json5@2.2.3: {} 2084 | 2085 | keyv@4.5.4: 2086 | dependencies: 2087 | json-buffer: 3.0.1 2088 | 2089 | levn@0.4.1: 2090 | dependencies: 2091 | prelude-ls: 1.2.1 2092 | type-check: 0.4.0 2093 | 2094 | locate-path@5.0.0: 2095 | dependencies: 2096 | p-locate: 4.1.0 2097 | 2098 | locate-path@6.0.0: 2099 | dependencies: 2100 | p-locate: 5.0.0 2101 | 2102 | lodash.flattendeep@4.4.0: {} 2103 | 2104 | lodash.merge@4.6.2: {} 2105 | 2106 | log-symbols@4.1.0: 2107 | dependencies: 2108 | chalk: 4.1.2 2109 | is-unicode-supported: 0.1.0 2110 | 2111 | lru-cache@10.4.3: {} 2112 | 2113 | lru-cache@5.1.1: 2114 | dependencies: 2115 | yallist: 3.1.1 2116 | 2117 | make-dir@3.1.0: 2118 | dependencies: 2119 | semver: 6.3.1 2120 | 2121 | make-dir@4.0.0: 2122 | dependencies: 2123 | semver: 7.7.3 2124 | 2125 | merge2@1.4.1: {} 2126 | 2127 | micromatch@4.0.8: 2128 | dependencies: 2129 | braces: 3.0.3 2130 | picomatch: 2.3.1 2131 | 2132 | minimatch@3.1.2: 2133 | dependencies: 2134 | brace-expansion: 1.1.12 2135 | 2136 | minimatch@9.0.5: 2137 | dependencies: 2138 | brace-expansion: 2.0.2 2139 | 2140 | minipass@7.1.2: {} 2141 | 2142 | mlly@1.8.0: 2143 | dependencies: 2144 | acorn: 8.15.0 2145 | pathe: 2.0.3 2146 | pkg-types: 1.3.1 2147 | ufo: 1.6.1 2148 | 2149 | mocha@11.7.5: 2150 | dependencies: 2151 | browser-stdout: 1.3.1 2152 | chokidar: 4.0.3 2153 | debug: 4.4.3(supports-color@8.1.1) 2154 | diff: 7.0.0 2155 | escape-string-regexp: 4.0.0 2156 | find-up: 5.0.0 2157 | glob: 10.5.0 2158 | he: 1.2.0 2159 | is-path-inside: 3.0.3 2160 | js-yaml: 4.1.1 2161 | log-symbols: 4.1.0 2162 | minimatch: 9.0.5 2163 | ms: 2.1.3 2164 | picocolors: 1.1.1 2165 | serialize-javascript: 6.0.2 2166 | strip-json-comments: 3.1.1 2167 | supports-color: 8.1.1 2168 | workerpool: 9.3.4 2169 | yargs: 17.7.2 2170 | yargs-parser: 21.1.1 2171 | yargs-unparser: 2.0.0 2172 | 2173 | ms@2.1.3: {} 2174 | 2175 | natural-compare@1.4.0: {} 2176 | 2177 | node-preload@0.2.1: 2178 | dependencies: 2179 | process-on-spawn: 1.1.0 2180 | 2181 | node-releases@2.0.27: {} 2182 | 2183 | nyc@17.1.0: 2184 | dependencies: 2185 | '@istanbuljs/load-nyc-config': 1.1.0 2186 | '@istanbuljs/schema': 0.1.3 2187 | caching-transform: 4.0.0 2188 | convert-source-map: 1.9.0 2189 | decamelize: 1.2.0 2190 | find-cache-dir: 3.3.2 2191 | find-up: 4.1.0 2192 | foreground-child: 3.3.1 2193 | get-package-type: 0.1.0 2194 | glob: 7.2.3 2195 | istanbul-lib-coverage: 3.2.2 2196 | istanbul-lib-hook: 3.0.0 2197 | istanbul-lib-instrument: 6.0.3 2198 | istanbul-lib-processinfo: 2.0.3 2199 | istanbul-lib-report: 3.0.1 2200 | istanbul-lib-source-maps: 4.0.1 2201 | istanbul-reports: 3.2.0 2202 | make-dir: 3.1.0 2203 | node-preload: 0.2.1 2204 | p-map: 3.0.0 2205 | process-on-spawn: 1.1.0 2206 | resolve-from: 5.0.0 2207 | rimraf: 3.0.2 2208 | signal-exit: 3.0.7 2209 | spawn-wrap: 2.0.0 2210 | test-exclude: 6.0.0 2211 | yargs: 15.4.1 2212 | transitivePeerDependencies: 2213 | - supports-color 2214 | 2215 | once@1.4.0: 2216 | dependencies: 2217 | wrappy: 1.0.2 2218 | 2219 | optionator@0.9.4: 2220 | dependencies: 2221 | deep-is: 0.1.4 2222 | fast-levenshtein: 2.0.6 2223 | levn: 0.4.1 2224 | prelude-ls: 1.2.1 2225 | type-check: 0.4.0 2226 | word-wrap: 1.2.5 2227 | 2228 | p-limit@2.3.0: 2229 | dependencies: 2230 | p-try: 2.2.0 2231 | 2232 | p-limit@3.1.0: 2233 | dependencies: 2234 | yocto-queue: 0.1.0 2235 | 2236 | p-locate@4.1.0: 2237 | dependencies: 2238 | p-limit: 2.3.0 2239 | 2240 | p-locate@5.0.0: 2241 | dependencies: 2242 | p-limit: 3.1.0 2243 | 2244 | p-map@3.0.0: 2245 | dependencies: 2246 | aggregate-error: 3.1.0 2247 | 2248 | p-try@2.2.0: {} 2249 | 2250 | package-hash@4.0.0: 2251 | dependencies: 2252 | graceful-fs: 4.2.11 2253 | hasha: 5.2.2 2254 | lodash.flattendeep: 4.4.0 2255 | release-zalgo: 1.0.0 2256 | 2257 | package-json-from-dist@1.0.1: {} 2258 | 2259 | parent-module@1.0.1: 2260 | dependencies: 2261 | callsites: 3.1.0 2262 | 2263 | path-exists@4.0.0: {} 2264 | 2265 | path-is-absolute@1.0.1: {} 2266 | 2267 | path-key@3.1.1: {} 2268 | 2269 | path-scurry@1.11.1: 2270 | dependencies: 2271 | lru-cache: 10.4.3 2272 | minipass: 7.1.2 2273 | 2274 | pathe@2.0.3: {} 2275 | 2276 | picocolors@1.1.1: {} 2277 | 2278 | picomatch@2.3.1: {} 2279 | 2280 | picomatch@4.0.3: {} 2281 | 2282 | pkg-dir@4.2.0: 2283 | dependencies: 2284 | find-up: 4.1.0 2285 | 2286 | pkg-types@1.3.1: 2287 | dependencies: 2288 | confbox: 0.1.8 2289 | mlly: 1.8.0 2290 | pathe: 2.0.3 2291 | 2292 | prelude-ls@1.2.1: {} 2293 | 2294 | prettier@3.7.4: {} 2295 | 2296 | process-on-spawn@1.1.0: 2297 | dependencies: 2298 | fromentries: 1.3.2 2299 | 2300 | punycode@2.3.1: {} 2301 | 2302 | queue-microtask@1.2.3: {} 2303 | 2304 | randombytes@2.1.0: 2305 | dependencies: 2306 | safe-buffer: 5.2.1 2307 | 2308 | readdirp@4.1.2: {} 2309 | 2310 | release-zalgo@1.0.0: 2311 | dependencies: 2312 | es6-error: 4.1.1 2313 | 2314 | require-directory@2.1.1: {} 2315 | 2316 | require-main-filename@2.0.0: {} 2317 | 2318 | resolve-from@4.0.0: {} 2319 | 2320 | resolve-from@5.0.0: {} 2321 | 2322 | resolve-pkg-maps@1.0.0: {} 2323 | 2324 | reusify@1.1.0: {} 2325 | 2326 | rimraf@3.0.2: 2327 | dependencies: 2328 | glob: 7.2.3 2329 | 2330 | run-parallel@1.2.0: 2331 | dependencies: 2332 | queue-microtask: 1.2.3 2333 | 2334 | safe-buffer@5.2.1: {} 2335 | 2336 | semver@6.3.1: {} 2337 | 2338 | semver@7.7.3: {} 2339 | 2340 | serialize-javascript@6.0.2: 2341 | dependencies: 2342 | randombytes: 2.1.0 2343 | 2344 | set-blocking@2.0.0: {} 2345 | 2346 | shebang-command@2.0.0: 2347 | dependencies: 2348 | shebang-regex: 3.0.0 2349 | 2350 | shebang-regex@3.0.0: {} 2351 | 2352 | signal-exit@3.0.7: {} 2353 | 2354 | signal-exit@4.1.0: {} 2355 | 2356 | sinon@20.0.0: 2357 | dependencies: 2358 | '@sinonjs/commons': 3.0.1 2359 | '@sinonjs/fake-timers': 13.0.5 2360 | '@sinonjs/samsam': 8.0.3 2361 | diff: 7.0.0 2362 | supports-color: 7.2.0 2363 | 2364 | source-map@0.6.1: {} 2365 | 2366 | spawn-wrap@2.0.0: 2367 | dependencies: 2368 | foreground-child: 2.0.0 2369 | is-windows: 1.0.2 2370 | make-dir: 3.1.0 2371 | rimraf: 3.0.2 2372 | signal-exit: 3.0.7 2373 | which: 2.0.2 2374 | 2375 | sprintf-js@1.0.3: {} 2376 | 2377 | string-width@4.2.3: 2378 | dependencies: 2379 | emoji-regex: 8.0.0 2380 | is-fullwidth-code-point: 3.0.0 2381 | strip-ansi: 6.0.1 2382 | 2383 | string-width@5.1.2: 2384 | dependencies: 2385 | eastasianwidth: 0.2.0 2386 | emoji-regex: 9.2.2 2387 | strip-ansi: 7.1.2 2388 | 2389 | strip-ansi@6.0.1: 2390 | dependencies: 2391 | ansi-regex: 5.0.1 2392 | 2393 | strip-ansi@7.1.2: 2394 | dependencies: 2395 | ansi-regex: 6.2.2 2396 | 2397 | strip-bom@4.0.0: {} 2398 | 2399 | strip-json-comments@3.1.1: {} 2400 | 2401 | supports-color@7.2.0: 2402 | dependencies: 2403 | has-flag: 4.0.0 2404 | 2405 | supports-color@8.1.1: 2406 | dependencies: 2407 | has-flag: 4.0.0 2408 | 2409 | tapable@2.3.0: {} 2410 | 2411 | test-exclude@6.0.0: 2412 | dependencies: 2413 | '@istanbuljs/schema': 0.1.3 2414 | glob: 7.2.3 2415 | minimatch: 3.1.2 2416 | 2417 | text-table@0.2.0: {} 2418 | 2419 | to-regex-range@5.0.1: 2420 | dependencies: 2421 | is-number: 7.0.0 2422 | 2423 | ts-declaration-location@1.0.7(typescript@5.9.3): 2424 | dependencies: 2425 | picomatch: 4.0.3 2426 | typescript: 5.9.3 2427 | 2428 | type-check@0.4.0: 2429 | dependencies: 2430 | prelude-ls: 1.2.1 2431 | 2432 | type-detect@4.0.8: {} 2433 | 2434 | type-detect@4.1.0: {} 2435 | 2436 | type-fest@0.20.2: {} 2437 | 2438 | type-fest@0.8.1: {} 2439 | 2440 | typedarray-to-buffer@3.1.5: 2441 | dependencies: 2442 | is-typedarray: 1.0.0 2443 | 2444 | typescript@5.9.3: {} 2445 | 2446 | ufo@1.6.1: {} 2447 | 2448 | update-browserslist-db@1.2.2(browserslist@4.28.1): 2449 | dependencies: 2450 | browserslist: 4.28.1 2451 | escalade: 3.2.0 2452 | picocolors: 1.1.1 2453 | 2454 | uri-js@4.4.1: 2455 | dependencies: 2456 | punycode: 2.3.1 2457 | 2458 | uuid@8.3.2: {} 2459 | 2460 | which-module@2.0.1: {} 2461 | 2462 | which@2.0.2: 2463 | dependencies: 2464 | isexe: 2.0.0 2465 | 2466 | word-wrap@1.2.5: {} 2467 | 2468 | workerpool@9.3.4: {} 2469 | 2470 | wrap-ansi@6.2.0: 2471 | dependencies: 2472 | ansi-styles: 4.3.0 2473 | string-width: 4.2.3 2474 | strip-ansi: 6.0.1 2475 | 2476 | wrap-ansi@7.0.0: 2477 | dependencies: 2478 | ansi-styles: 4.3.0 2479 | string-width: 4.2.3 2480 | strip-ansi: 6.0.1 2481 | 2482 | wrap-ansi@8.1.0: 2483 | dependencies: 2484 | ansi-styles: 6.2.3 2485 | string-width: 5.1.2 2486 | strip-ansi: 7.1.2 2487 | 2488 | wrappy@1.0.2: {} 2489 | 2490 | write-file-atomic@3.0.3: 2491 | dependencies: 2492 | imurmurhash: 0.1.4 2493 | is-typedarray: 1.0.0 2494 | signal-exit: 3.0.7 2495 | typedarray-to-buffer: 3.1.5 2496 | 2497 | y18n@4.0.3: {} 2498 | 2499 | y18n@5.0.8: {} 2500 | 2501 | yallist@3.1.1: {} 2502 | 2503 | yaml@2.8.2: {} 2504 | 2505 | yargs-parser@18.1.3: 2506 | dependencies: 2507 | camelcase: 5.3.1 2508 | decamelize: 1.2.0 2509 | 2510 | yargs-parser@21.1.1: {} 2511 | 2512 | yargs-unparser@2.0.0: 2513 | dependencies: 2514 | camelcase: 6.3.0 2515 | decamelize: 4.0.0 2516 | flat: 5.0.2 2517 | is-plain-obj: 2.1.0 2518 | 2519 | yargs@15.4.1: 2520 | dependencies: 2521 | cliui: 6.0.0 2522 | decamelize: 1.2.0 2523 | find-up: 4.1.0 2524 | get-caller-file: 2.0.5 2525 | require-directory: 2.1.1 2526 | require-main-filename: 2.0.0 2527 | set-blocking: 2.0.0 2528 | string-width: 4.2.3 2529 | which-module: 2.0.1 2530 | y18n: 4.0.3 2531 | yargs-parser: 18.1.3 2532 | 2533 | yargs@17.7.2: 2534 | dependencies: 2535 | cliui: 8.0.1 2536 | escalade: 3.2.0 2537 | get-caller-file: 2.0.5 2538 | require-directory: 2.1.1 2539 | string-width: 4.2.3 2540 | y18n: 5.0.8 2541 | yargs-parser: 21.1.1 2542 | 2543 | yocto-queue@0.1.0: {} 2544 | --------------------------------------------------------------------------------