├── .eslintignore ├── .eslintrc.yml ├── .github └── workflows │ ├── build.yml │ └── publish.yml ├── .gitignore ├── .husky ├── .gitignore └── pre-commit ├── .npmignore ├── .prettierignore ├── .prettierrc.yml ├── .vscode └── settings.json ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── cast.gif ├── e2e ├── .gitignore ├── helper │ └── server.ts ├── jest.config.json ├── projects │ ├── eslint-recommended │ │ ├── .eslintignore │ │ ├── .eslintrc.js │ │ ├── main.ts │ │ ├── package-lock.json │ │ ├── package.json │ │ └── tsconfig.json │ ├── other-parser │ │ ├── .eslintrc.js │ │ ├── .vscode │ │ │ └── settings.json │ │ ├── main.ts │ │ ├── package-lock.json │ │ ├── package.json │ │ └── tsconfig.json │ ├── simple │ │ ├── .eslintignore │ │ ├── .eslintrc.js │ │ ├── .vscode │ │ │ └── settings.json │ │ ├── main.ts │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── to-be-ignored.ts │ │ └── tsconfig.json │ └── ts-eslint-plugin │ │ ├── .eslintrc.js │ │ ├── .vscode │ │ └── settings.json │ │ ├── main.ts │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── reproduce_issue_217 │ │ └── main.ts │ │ ├── reproduce_issue_7 │ │ ├── main.ts │ │ └── types.ts │ │ └── tsconfig.json ├── setup.sh └── test │ ├── __snapshots__ │ └── e2e.test.ts.snap │ └── e2e.test.ts ├── package-lock.json ├── package.json ├── renovate.json ├── src ├── __snapshots__ │ └── eslint-adapter.test.ts.snap ├── consts.ts ├── errors.ts ├── eslint-adapter.test.ts ├── eslint-adapter.ts ├── eslint-config-provider.test.ts ├── eslint-config-provider.ts ├── index.ts ├── language-service-proxy-builder.ts ├── plugin-module-factory.ts └── typedef │ └── eslint-internal.d.ts ├── test-fixtures └── eslnt-config-provider │ ├── prj-with-eslintrc-yml │ ├── .eslintrc.yml │ └── package.json │ └── prj-with-eslintrc │ ├── .eslintrc.js │ └── package.json ├── tsconfig.build.json └── tsconfig.json /.eslintignore: -------------------------------------------------------------------------------- 1 | e2e/projects/ 2 | -------------------------------------------------------------------------------- /.eslintrc.yml: -------------------------------------------------------------------------------- 1 | root: true 2 | env: 3 | node: true 4 | es6: true 5 | extends: 6 | - "plugin:@typescript-eslint/recommended" 7 | - prettier 8 | parser: "@typescript-eslint/parser" 9 | parserOptions: 10 | project: "./tsconfig.json" 11 | plugins: 12 | - "@typescript-eslint" 13 | rules: 14 | no-eval: error 15 | no-debugger: error 16 | no-console: error 17 | no-var: error 18 | no-unsafe-finally: error 19 | prefer-const: error 20 | prefer-rest-params: error 21 | prefer-spread: error 22 | no-duplicate-imports: off 23 | "@typescript-eslint/prefer-interface": off 24 | "@typescript-eslint/no-explicit-any": off 25 | "@typescript-eslint/no-non-null-assertion": off 26 | "@typescript-eslint/no-empty-function": off 27 | "@typescript-eslint/explicit-module-boundary-types": off 28 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: build 2 | 3 | on: 4 | pull_request: 5 | push: 6 | branches: 7 | - master 8 | - main 9 | 10 | jobs: 11 | build: 12 | runs-on: ubuntu-latest 13 | 14 | strategy: 15 | matrix: 16 | node-version: [18.x] 17 | 18 | steps: 19 | - uses: actions/checkout@v4 20 | - name: Use Node.js ${{ matrix.node-version }} 21 | uses: actions/setup-node@v4 22 | with: 23 | node-version: ${{ matrix.node-version }} 24 | cache: npm 25 | - name: npm install, build, and test 26 | run: | 27 | npm ci 28 | npm run build 29 | npm run format:check 30 | npm run lint 31 | npm run test 32 | /bin/bash e2e/setup.sh 33 | npm run e2e 34 | env: 35 | CI: true 36 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: publish 2 | 3 | on: 4 | push: 5 | tags: 6 | - "*" 7 | 8 | jobs: 9 | publish: 10 | runs-on: ubuntu-latest 11 | 12 | strategy: 13 | matrix: 14 | node-version: [18.x] 15 | 16 | steps: 17 | - uses: actions/checkout@v4 18 | - name: Use Node.js ${{ matrix.node-version }} 19 | uses: actions/setup-node@v4 20 | with: 21 | node-version: ${{ matrix.node-version }} 22 | cache: npm 23 | - name: npm publish 24 | run: | 25 | echo "//registry.npmjs.org/:_authToken=${NPM_AUTH_TOKEN}" > ~/.npmrc 26 | npm whoami 27 | npm ci 28 | npm run build 29 | npm publish 30 | if: contains(github.ref, 'tags/v') 31 | env: 32 | NPM_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }} 33 | CI: true 34 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (https://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # TypeScript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # next.js build output 61 | .next 62 | 63 | lib/ 64 | local/ 65 | -------------------------------------------------------------------------------- /.husky/.gitignore: -------------------------------------------------------------------------------- 1 | _ 2 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | npx pretty-quick --staged 5 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | src/ 2 | .github/ 3 | .git/ 4 | .husky/ 5 | .vscode/ 6 | e2e/ 7 | test-fixtures/ 8 | local/ 9 | .prettierignore 10 | .prettierrc 11 | .eslintrc 12 | .eslintignore 13 | *.test.js 14 | *.test.js.map 15 | *.test.d.ts 16 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | lib/ 3 | project-fixtures/ 4 | __snapshots__/ 5 | coverage/ 6 | e2e/projects 7 | *.sh 8 | .gitignore 9 | -------------------------------------------------------------------------------- /.prettierrc.yml: -------------------------------------------------------------------------------- 1 | trailingComma: all 2 | tabWidth: 2 3 | semi: true 4 | singleQuote: false 5 | bracketSpacing: true 6 | printWidth: 120 7 | arrowParens: avoid 8 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "typescript.tsdk": "node_modules/typescript/lib" 3 | } -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ## Setup 2 | 3 | ```sh 4 | $ npm install 5 | ``` 6 | 7 | ```sh 8 | $ npm run build:local 9 | ``` 10 | 11 | The above command builds this plugin under `local` directory. 12 | And the built module is referenced from this project's tsconfig.json. 13 | So, whenever you edit the source code of this project, this plugin itself tell you ESLint errors on your editor. 14 | 15 | If you want to update modules in `local` dir, exec `npm run build:local` . 16 | 17 | ## Test 18 | 19 | ### Unit test 20 | 21 | ```sh 22 | $ npm run test 23 | ``` 24 | 25 | ### Lint 26 | 27 | ```sh 28 | $ npm run lint 29 | ``` 30 | 31 | ### E2E 32 | 33 | ```sh 34 | $ npm run build 35 | $ ./e2e/setup.sh 36 | $ npm run e2e 37 | ``` 38 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Yosuke Kurami 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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # typescript-eslint-language-service 2 | 3 | [![github actions](https://github.com/Quramy/typescript-eslint-language-service/workflows/build/badge.svg)](https://github.com/Quramy/typescript-eslint-language-service/actions) 4 | [![npm version](https://badge.fury.io/js/typescript-eslint-language-service.svg)](https://badge.fury.io/js/typescript-eslint-language-service) 5 | ![deps](https://david-dm.org/quramy/typescript-eslint-language-service.svg) 6 | [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/Quramy/ts-graphql-plugin/master/LICENSE.txt) 7 | 8 | TypeScript language service plugin to check ESLint errors. 9 | 10 | ![Screencast](https://raw.githubusercontent.com/Quramy/typescript-eslint-language-service/master/cast.gif) 11 | 12 | ## Features 13 | 14 | - Report ESLint errors as TypeScript semantic diagnostics 15 | - Create code-fix for ESLint errors if they have fixer 16 | 17 | ## Usage 18 | 19 | ### Requirements (peer dependencies) 20 | 21 | - `typescript` 22 | - `@typescript-eslint/parser` >= 5.0.0 23 | - `eslint` >= 8.0.0 24 | 25 | ### Install 26 | 27 | ```sh 28 | npm install typescript-eslint-language-service -D 29 | ``` 30 | 31 | ### Configure 32 | 33 | And configure `plugins` section in your tsconfig.json, for example: 34 | 35 | ```json 36 | { 37 | "compilerOptions": { 38 | "module": "commonjs", 39 | "target": "es5", 40 | "plugins": [ 41 | { 42 | "name": "typescript-eslint-language-service" 43 | } 44 | ] 45 | } 46 | } 47 | ``` 48 | 49 | It's ready to go. Launch your TypeScript IDE. 50 | 51 | ### Plugin options 52 | 53 | ```ts 54 | type PluginOptions = { 55 | name: "typescript-eslint-language-service"; 56 | watchDirs?: string[]; 57 | }; 58 | ``` 59 | 60 | #### `watchDirs` 61 | 62 | By default, this plugins watches only `.eslintrc.*` files that exist in your project root directory. If you want to watch other directories, add their names. 63 | 64 | ### Tips 65 | 66 | - Set `TS_ESLINT_SERVICE_DISABLED` env parameter and restart your IDE to turn this plugin off. 67 | 68 | ### If you use older version of `ESLint` packages 69 | 70 | - **If your eslint version is < 8.0.0, install `typescript-eslint-language-service@4.x.x`.** 71 | 72 | ### If you use older version of `@typescript-eslint` packages 73 | 74 | - **If your @typescript-eslint tool's version is < 4.0.0, install `typescript-eslint-language-service@3.1.x`.** 75 | - **If your @typescript-eslint tool's version is <= 3.4.0, install `typescript-eslint-language-service@3.0.x`.** 76 | - **If your @typescript-eslint tool's version is <= 2.x.x, install `typescript-eslint-language-service@2.x.x`.** 77 | 78 | ## LICENSE 79 | 80 | MIT 81 | -------------------------------------------------------------------------------- /cast.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Quramy/typescript-eslint-language-service/931b557270bc2ef3bdfd2172b51879be360cff1e/cast.gif -------------------------------------------------------------------------------- /e2e/.gitignore: -------------------------------------------------------------------------------- 1 | tsserver.log 2 | -------------------------------------------------------------------------------- /e2e/helper/server.ts: -------------------------------------------------------------------------------- 1 | import fs from "fs"; 2 | import path from "path"; 3 | import { ChildProcess, fork } from "child_process"; 4 | import { EventEmitter } from "events"; 5 | 6 | export type Options = { 7 | projectPath: string; 8 | }; 9 | 10 | export class TSServer { 11 | private readonly _projectPath: string; 12 | private readonly _responseEventEmitter: EventEmitter; 13 | private readonly _responseCommandEmitter: EventEmitter; 14 | private _exitPromise: Promise; 15 | private _isClosed = false; 16 | private _server: ChildProcess; 17 | private _seq = 0; 18 | 19 | public responses: any[] = []; 20 | 21 | public constructor({ projectPath }: Options) { 22 | this._projectPath = projectPath; 23 | this._responseEventEmitter = new EventEmitter(); 24 | this._responseCommandEmitter = new EventEmitter(); 25 | const tsserverPath = require.resolve(path.join(projectPath, "node_modules/typescript/lib/tsserver")); 26 | const server = fork(tsserverPath, [], { 27 | cwd: projectPath, 28 | stdio: ["pipe", "pipe", "pipe", "ipc"], 29 | }); 30 | this._exitPromise = new Promise((resolve, reject) => { 31 | server.on("exit", code => resolve(code)); 32 | server.on("error", reason => reject(reason)); 33 | }); 34 | server.stdout!.setEncoding("utf-8"); 35 | server.stdout!.on("data", data => { 36 | const [, , res] = data.split("\n"); 37 | const obj = JSON.parse(res); 38 | if (obj.type === "event") { 39 | this._responseEventEmitter.emit(obj.event, obj); 40 | } else if (obj.type === "response") { 41 | this._responseCommandEmitter.emit(obj.command, obj); 42 | } 43 | this.responses.push(obj); 44 | }); 45 | this._isClosed = false; 46 | this._server = server; 47 | this._seq = 0; 48 | this.responses = []; 49 | } 50 | 51 | public readFile(filepath: string) { 52 | const file = path.resolve(this._projectPath, filepath); 53 | const fileContent = fs.readFileSync(file, "utf8"); 54 | return { file, fileContent }; 55 | } 56 | 57 | public send(command: any) { 58 | const seq = ++this._seq; 59 | const req = JSON.stringify(Object.assign({ seq, type: "request" }, command)) + "\n"; 60 | this._server.stdin!.write(req); 61 | } 62 | 63 | public close() { 64 | if (!this._isClosed) { 65 | this._isClosed = true; 66 | this._server.stdin!.end(); 67 | } 68 | return this._exitPromise; 69 | } 70 | 71 | public wait(time = 0) { 72 | return new Promise(res => setTimeout(res, time)); 73 | } 74 | 75 | public waitEvent(eventName: string) { 76 | return new Promise(res => this._responseEventEmitter.once(eventName, res)); 77 | } 78 | 79 | public waitResponse(commandName: string) { 80 | return new Promise(res => this._responseCommandEmitter.once(commandName, res)); 81 | } 82 | } 83 | 84 | export function createServer(options: Options) { 85 | return new TSServer(options); 86 | } 87 | -------------------------------------------------------------------------------- /e2e/jest.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "transform": { 3 | "^.+\\.ts$": "ts-jest" 4 | }, 5 | "testRegex": "(test/.*|(src/.*\\.test))\\.ts$", 6 | "testPathIgnorePatterns": ["/node_modules/", "helper/.*", "\\.d\\.ts$"], 7 | "moduleFileExtensions": ["js", "ts", "json"], 8 | "testTimeout": 10000 9 | } 10 | -------------------------------------------------------------------------------- /e2e/projects/eslint-recommended/.eslintignore: -------------------------------------------------------------------------------- 1 | to-be-ignored.ts 2 | -------------------------------------------------------------------------------- /e2e/projects/eslint-recommended/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | es6: true, 5 | node: true, 6 | }, 7 | parser: "@typescript-eslint/parser", 8 | extends: ["eslint:recommended"], 9 | parserOptions: { 10 | project: "./tsconfig.json", 11 | }, 12 | }; 13 | -------------------------------------------------------------------------------- /e2e/projects/eslint-recommended/main.ts: -------------------------------------------------------------------------------- 1 | debugger; 2 | -------------------------------------------------------------------------------- /e2e/projects/eslint-recommended/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "eslint-recommended", 3 | "lockfileVersion": 3, 4 | "requires": true, 5 | "packages": { 6 | "": { 7 | "name": "eslint-recommended", 8 | "devDependencies": { 9 | "@typescript-eslint/parser": "7.12.0", 10 | "eslint": "8.57.1", 11 | "typescript": "5.8.3" 12 | } 13 | }, 14 | "node_modules/@eslint-community/eslint-utils": { 15 | "version": "4.7.0", 16 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", 17 | "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", 18 | "dev": true, 19 | "license": "MIT", 20 | "dependencies": { 21 | "eslint-visitor-keys": "^3.4.3" 22 | }, 23 | "engines": { 24 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 25 | }, 26 | "funding": { 27 | "url": "https://opencollective.com/eslint" 28 | }, 29 | "peerDependencies": { 30 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 31 | } 32 | }, 33 | "node_modules/@eslint-community/regexpp": { 34 | "version": "4.12.1", 35 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", 36 | "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", 37 | "dev": true, 38 | "license": "MIT", 39 | "engines": { 40 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 41 | } 42 | }, 43 | "node_modules/@eslint/eslintrc": { 44 | "version": "2.1.4", 45 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", 46 | "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", 47 | "dev": true, 48 | "license": "MIT", 49 | "dependencies": { 50 | "ajv": "^6.12.4", 51 | "debug": "^4.3.2", 52 | "espree": "^9.6.0", 53 | "globals": "^13.19.0", 54 | "ignore": "^5.2.0", 55 | "import-fresh": "^3.2.1", 56 | "js-yaml": "^4.1.0", 57 | "minimatch": "^3.1.2", 58 | "strip-json-comments": "^3.1.1" 59 | }, 60 | "engines": { 61 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 62 | }, 63 | "funding": { 64 | "url": "https://opencollective.com/eslint" 65 | } 66 | }, 67 | "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { 68 | "version": "1.1.11", 69 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 70 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 71 | "dev": true, 72 | "license": "MIT", 73 | "dependencies": { 74 | "balanced-match": "^1.0.0", 75 | "concat-map": "0.0.1" 76 | } 77 | }, 78 | "node_modules/@eslint/eslintrc/node_modules/minimatch": { 79 | "version": "3.1.2", 80 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 81 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 82 | "dev": true, 83 | "license": "ISC", 84 | "dependencies": { 85 | "brace-expansion": "^1.1.7" 86 | }, 87 | "engines": { 88 | "node": "*" 89 | } 90 | }, 91 | "node_modules/@eslint/js": { 92 | "version": "8.57.1", 93 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", 94 | "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", 95 | "dev": true, 96 | "license": "MIT", 97 | "engines": { 98 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 99 | } 100 | }, 101 | "node_modules/@humanwhocodes/config-array": { 102 | "version": "0.13.0", 103 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", 104 | "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", 105 | "deprecated": "Use @eslint/config-array instead", 106 | "dev": true, 107 | "license": "Apache-2.0", 108 | "dependencies": { 109 | "@humanwhocodes/object-schema": "^2.0.3", 110 | "debug": "^4.3.1", 111 | "minimatch": "^3.0.5" 112 | }, 113 | "engines": { 114 | "node": ">=10.10.0" 115 | } 116 | }, 117 | "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { 118 | "version": "1.1.11", 119 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 120 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 121 | "dev": true, 122 | "license": "MIT", 123 | "dependencies": { 124 | "balanced-match": "^1.0.0", 125 | "concat-map": "0.0.1" 126 | } 127 | }, 128 | "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { 129 | "version": "3.1.2", 130 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 131 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 132 | "dev": true, 133 | "license": "ISC", 134 | "dependencies": { 135 | "brace-expansion": "^1.1.7" 136 | }, 137 | "engines": { 138 | "node": "*" 139 | } 140 | }, 141 | "node_modules/@humanwhocodes/module-importer": { 142 | "version": "1.0.1", 143 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 144 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 145 | "dev": true, 146 | "license": "Apache-2.0", 147 | "engines": { 148 | "node": ">=12.22" 149 | }, 150 | "funding": { 151 | "type": "github", 152 | "url": "https://github.com/sponsors/nzakas" 153 | } 154 | }, 155 | "node_modules/@humanwhocodes/object-schema": { 156 | "version": "2.0.3", 157 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", 158 | "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", 159 | "deprecated": "Use @eslint/object-schema instead", 160 | "dev": true, 161 | "license": "BSD-3-Clause" 162 | }, 163 | "node_modules/@nodelib/fs.scandir": { 164 | "version": "2.1.5", 165 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 166 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 167 | "dev": true, 168 | "license": "MIT", 169 | "dependencies": { 170 | "@nodelib/fs.stat": "2.0.5", 171 | "run-parallel": "^1.1.9" 172 | }, 173 | "engines": { 174 | "node": ">= 8" 175 | } 176 | }, 177 | "node_modules/@nodelib/fs.stat": { 178 | "version": "2.0.5", 179 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 180 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 181 | "dev": true, 182 | "license": "MIT", 183 | "engines": { 184 | "node": ">= 8" 185 | } 186 | }, 187 | "node_modules/@nodelib/fs.walk": { 188 | "version": "1.2.8", 189 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 190 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 191 | "dev": true, 192 | "license": "MIT", 193 | "dependencies": { 194 | "@nodelib/fs.scandir": "2.1.5", 195 | "fastq": "^1.6.0" 196 | }, 197 | "engines": { 198 | "node": ">= 8" 199 | } 200 | }, 201 | "node_modules/@typescript-eslint/parser": { 202 | "version": "7.12.0", 203 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.12.0.tgz", 204 | "integrity": "sha512-dm/J2UDY3oV3TKius2OUZIFHsomQmpHtsV0FTh1WO8EKgHLQ1QCADUqscPgTpU+ih1e21FQSRjXckHn3txn6kQ==", 205 | "dev": true, 206 | "license": "BSD-2-Clause", 207 | "dependencies": { 208 | "@typescript-eslint/scope-manager": "7.12.0", 209 | "@typescript-eslint/types": "7.12.0", 210 | "@typescript-eslint/typescript-estree": "7.12.0", 211 | "@typescript-eslint/visitor-keys": "7.12.0", 212 | "debug": "^4.3.4" 213 | }, 214 | "engines": { 215 | "node": "^18.18.0 || >=20.0.0" 216 | }, 217 | "funding": { 218 | "type": "opencollective", 219 | "url": "https://opencollective.com/typescript-eslint" 220 | }, 221 | "peerDependencies": { 222 | "eslint": "^8.56.0" 223 | }, 224 | "peerDependenciesMeta": { 225 | "typescript": { 226 | "optional": true 227 | } 228 | } 229 | }, 230 | "node_modules/@typescript-eslint/scope-manager": { 231 | "version": "7.12.0", 232 | "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.12.0.tgz", 233 | "integrity": "sha512-itF1pTnN6F3unPak+kutH9raIkL3lhH1YRPGgt7QQOh43DQKVJXmWkpb+vpc/TiDHs6RSd9CTbDsc/Y+Ygq7kg==", 234 | "dev": true, 235 | "license": "MIT", 236 | "dependencies": { 237 | "@typescript-eslint/types": "7.12.0", 238 | "@typescript-eslint/visitor-keys": "7.12.0" 239 | }, 240 | "engines": { 241 | "node": "^18.18.0 || >=20.0.0" 242 | }, 243 | "funding": { 244 | "type": "opencollective", 245 | "url": "https://opencollective.com/typescript-eslint" 246 | } 247 | }, 248 | "node_modules/@typescript-eslint/types": { 249 | "version": "7.12.0", 250 | "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.12.0.tgz", 251 | "integrity": "sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==", 252 | "dev": true, 253 | "license": "MIT", 254 | "engines": { 255 | "node": "^18.18.0 || >=20.0.0" 256 | }, 257 | "funding": { 258 | "type": "opencollective", 259 | "url": "https://opencollective.com/typescript-eslint" 260 | } 261 | }, 262 | "node_modules/@typescript-eslint/typescript-estree": { 263 | "version": "7.12.0", 264 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.12.0.tgz", 265 | "integrity": "sha512-5bwqLsWBULv1h6pn7cMW5dXX/Y2amRqLaKqsASVwbBHMZSnHqE/HN4vT4fE0aFsiwxYvr98kqOWh1a8ZKXalCQ==", 266 | "dev": true, 267 | "license": "BSD-2-Clause", 268 | "dependencies": { 269 | "@typescript-eslint/types": "7.12.0", 270 | "@typescript-eslint/visitor-keys": "7.12.0", 271 | "debug": "^4.3.4", 272 | "globby": "^11.1.0", 273 | "is-glob": "^4.0.3", 274 | "minimatch": "^9.0.4", 275 | "semver": "^7.6.0", 276 | "ts-api-utils": "^1.3.0" 277 | }, 278 | "engines": { 279 | "node": "^18.18.0 || >=20.0.0" 280 | }, 281 | "funding": { 282 | "type": "opencollective", 283 | "url": "https://opencollective.com/typescript-eslint" 284 | }, 285 | "peerDependenciesMeta": { 286 | "typescript": { 287 | "optional": true 288 | } 289 | } 290 | }, 291 | "node_modules/@typescript-eslint/visitor-keys": { 292 | "version": "7.12.0", 293 | "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.12.0.tgz", 294 | "integrity": "sha512-uZk7DevrQLL3vSnfFl5bj4sL75qC9D6EdjemIdbtkuUmIheWpuiiylSY01JxJE7+zGrOWDZrp1WxOuDntvKrHQ==", 295 | "dev": true, 296 | "license": "MIT", 297 | "dependencies": { 298 | "@typescript-eslint/types": "7.12.0", 299 | "eslint-visitor-keys": "^3.4.3" 300 | }, 301 | "engines": { 302 | "node": "^18.18.0 || >=20.0.0" 303 | }, 304 | "funding": { 305 | "type": "opencollective", 306 | "url": "https://opencollective.com/typescript-eslint" 307 | } 308 | }, 309 | "node_modules/@ungap/structured-clone": { 310 | "version": "1.3.0", 311 | "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", 312 | "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", 313 | "dev": true, 314 | "license": "ISC" 315 | }, 316 | "node_modules/acorn": { 317 | "version": "8.14.1", 318 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", 319 | "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", 320 | "dev": true, 321 | "license": "MIT", 322 | "bin": { 323 | "acorn": "bin/acorn" 324 | }, 325 | "engines": { 326 | "node": ">=0.4.0" 327 | } 328 | }, 329 | "node_modules/acorn-jsx": { 330 | "version": "5.3.2", 331 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 332 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 333 | "dev": true, 334 | "license": "MIT", 335 | "peerDependencies": { 336 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 337 | } 338 | }, 339 | "node_modules/ajv": { 340 | "version": "6.12.6", 341 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 342 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 343 | "dev": true, 344 | "license": "MIT", 345 | "dependencies": { 346 | "fast-deep-equal": "^3.1.1", 347 | "fast-json-stable-stringify": "^2.0.0", 348 | "json-schema-traverse": "^0.4.1", 349 | "uri-js": "^4.2.2" 350 | }, 351 | "funding": { 352 | "type": "github", 353 | "url": "https://github.com/sponsors/epoberezkin" 354 | } 355 | }, 356 | "node_modules/ansi-regex": { 357 | "version": "5.0.1", 358 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 359 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 360 | "dev": true, 361 | "license": "MIT", 362 | "engines": { 363 | "node": ">=8" 364 | } 365 | }, 366 | "node_modules/ansi-styles": { 367 | "version": "4.3.0", 368 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 369 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 370 | "dev": true, 371 | "license": "MIT", 372 | "dependencies": { 373 | "color-convert": "^2.0.1" 374 | }, 375 | "engines": { 376 | "node": ">=8" 377 | }, 378 | "funding": { 379 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 380 | } 381 | }, 382 | "node_modules/argparse": { 383 | "version": "2.0.1", 384 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 385 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 386 | "dev": true, 387 | "license": "Python-2.0" 388 | }, 389 | "node_modules/array-union": { 390 | "version": "2.1.0", 391 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 392 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", 393 | "dev": true, 394 | "license": "MIT", 395 | "engines": { 396 | "node": ">=8" 397 | } 398 | }, 399 | "node_modules/balanced-match": { 400 | "version": "1.0.2", 401 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 402 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 403 | "dev": true, 404 | "license": "MIT" 405 | }, 406 | "node_modules/brace-expansion": { 407 | "version": "2.0.1", 408 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 409 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 410 | "dev": true, 411 | "license": "MIT", 412 | "dependencies": { 413 | "balanced-match": "^1.0.0" 414 | } 415 | }, 416 | "node_modules/braces": { 417 | "version": "3.0.3", 418 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 419 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 420 | "dev": true, 421 | "license": "MIT", 422 | "dependencies": { 423 | "fill-range": "^7.1.1" 424 | }, 425 | "engines": { 426 | "node": ">=8" 427 | } 428 | }, 429 | "node_modules/callsites": { 430 | "version": "3.1.0", 431 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 432 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 433 | "dev": true, 434 | "license": "MIT", 435 | "engines": { 436 | "node": ">=6" 437 | } 438 | }, 439 | "node_modules/chalk": { 440 | "version": "4.1.2", 441 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 442 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 443 | "dev": true, 444 | "license": "MIT", 445 | "dependencies": { 446 | "ansi-styles": "^4.1.0", 447 | "supports-color": "^7.1.0" 448 | }, 449 | "engines": { 450 | "node": ">=10" 451 | }, 452 | "funding": { 453 | "url": "https://github.com/chalk/chalk?sponsor=1" 454 | } 455 | }, 456 | "node_modules/color-convert": { 457 | "version": "2.0.1", 458 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 459 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 460 | "dev": true, 461 | "license": "MIT", 462 | "dependencies": { 463 | "color-name": "~1.1.4" 464 | }, 465 | "engines": { 466 | "node": ">=7.0.0" 467 | } 468 | }, 469 | "node_modules/color-name": { 470 | "version": "1.1.4", 471 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 472 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 473 | "dev": true, 474 | "license": "MIT" 475 | }, 476 | "node_modules/concat-map": { 477 | "version": "0.0.1", 478 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 479 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 480 | "dev": true, 481 | "license": "MIT" 482 | }, 483 | "node_modules/cross-spawn": { 484 | "version": "7.0.6", 485 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 486 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 487 | "dev": true, 488 | "license": "MIT", 489 | "dependencies": { 490 | "path-key": "^3.1.0", 491 | "shebang-command": "^2.0.0", 492 | "which": "^2.0.1" 493 | }, 494 | "engines": { 495 | "node": ">= 8" 496 | } 497 | }, 498 | "node_modules/debug": { 499 | "version": "4.4.1", 500 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", 501 | "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", 502 | "dev": true, 503 | "license": "MIT", 504 | "dependencies": { 505 | "ms": "^2.1.3" 506 | }, 507 | "engines": { 508 | "node": ">=6.0" 509 | }, 510 | "peerDependenciesMeta": { 511 | "supports-color": { 512 | "optional": true 513 | } 514 | } 515 | }, 516 | "node_modules/deep-is": { 517 | "version": "0.1.4", 518 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 519 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 520 | "dev": true, 521 | "license": "MIT" 522 | }, 523 | "node_modules/dir-glob": { 524 | "version": "3.0.1", 525 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 526 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 527 | "dev": true, 528 | "license": "MIT", 529 | "dependencies": { 530 | "path-type": "^4.0.0" 531 | }, 532 | "engines": { 533 | "node": ">=8" 534 | } 535 | }, 536 | "node_modules/doctrine": { 537 | "version": "3.0.0", 538 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 539 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 540 | "dev": true, 541 | "license": "Apache-2.0", 542 | "dependencies": { 543 | "esutils": "^2.0.2" 544 | }, 545 | "engines": { 546 | "node": ">=6.0.0" 547 | } 548 | }, 549 | "node_modules/escape-string-regexp": { 550 | "version": "4.0.0", 551 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 552 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 553 | "dev": true, 554 | "license": "MIT", 555 | "engines": { 556 | "node": ">=10" 557 | }, 558 | "funding": { 559 | "url": "https://github.com/sponsors/sindresorhus" 560 | } 561 | }, 562 | "node_modules/eslint": { 563 | "version": "8.57.1", 564 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", 565 | "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", 566 | "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", 567 | "dev": true, 568 | "license": "MIT", 569 | "dependencies": { 570 | "@eslint-community/eslint-utils": "^4.2.0", 571 | "@eslint-community/regexpp": "^4.6.1", 572 | "@eslint/eslintrc": "^2.1.4", 573 | "@eslint/js": "8.57.1", 574 | "@humanwhocodes/config-array": "^0.13.0", 575 | "@humanwhocodes/module-importer": "^1.0.1", 576 | "@nodelib/fs.walk": "^1.2.8", 577 | "@ungap/structured-clone": "^1.2.0", 578 | "ajv": "^6.12.4", 579 | "chalk": "^4.0.0", 580 | "cross-spawn": "^7.0.2", 581 | "debug": "^4.3.2", 582 | "doctrine": "^3.0.0", 583 | "escape-string-regexp": "^4.0.0", 584 | "eslint-scope": "^7.2.2", 585 | "eslint-visitor-keys": "^3.4.3", 586 | "espree": "^9.6.1", 587 | "esquery": "^1.4.2", 588 | "esutils": "^2.0.2", 589 | "fast-deep-equal": "^3.1.3", 590 | "file-entry-cache": "^6.0.1", 591 | "find-up": "^5.0.0", 592 | "glob-parent": "^6.0.2", 593 | "globals": "^13.19.0", 594 | "graphemer": "^1.4.0", 595 | "ignore": "^5.2.0", 596 | "imurmurhash": "^0.1.4", 597 | "is-glob": "^4.0.0", 598 | "is-path-inside": "^3.0.3", 599 | "js-yaml": "^4.1.0", 600 | "json-stable-stringify-without-jsonify": "^1.0.1", 601 | "levn": "^0.4.1", 602 | "lodash.merge": "^4.6.2", 603 | "minimatch": "^3.1.2", 604 | "natural-compare": "^1.4.0", 605 | "optionator": "^0.9.3", 606 | "strip-ansi": "^6.0.1", 607 | "text-table": "^0.2.0" 608 | }, 609 | "bin": { 610 | "eslint": "bin/eslint.js" 611 | }, 612 | "engines": { 613 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 614 | }, 615 | "funding": { 616 | "url": "https://opencollective.com/eslint" 617 | } 618 | }, 619 | "node_modules/eslint-scope": { 620 | "version": "7.2.2", 621 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", 622 | "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", 623 | "dev": true, 624 | "license": "BSD-2-Clause", 625 | "dependencies": { 626 | "esrecurse": "^4.3.0", 627 | "estraverse": "^5.2.0" 628 | }, 629 | "engines": { 630 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 631 | }, 632 | "funding": { 633 | "url": "https://opencollective.com/eslint" 634 | } 635 | }, 636 | "node_modules/eslint-visitor-keys": { 637 | "version": "3.4.3", 638 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 639 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 640 | "dev": true, 641 | "license": "Apache-2.0", 642 | "engines": { 643 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 644 | }, 645 | "funding": { 646 | "url": "https://opencollective.com/eslint" 647 | } 648 | }, 649 | "node_modules/eslint/node_modules/brace-expansion": { 650 | "version": "1.1.11", 651 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 652 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 653 | "dev": true, 654 | "license": "MIT", 655 | "dependencies": { 656 | "balanced-match": "^1.0.0", 657 | "concat-map": "0.0.1" 658 | } 659 | }, 660 | "node_modules/eslint/node_modules/minimatch": { 661 | "version": "3.1.2", 662 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 663 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 664 | "dev": true, 665 | "license": "ISC", 666 | "dependencies": { 667 | "brace-expansion": "^1.1.7" 668 | }, 669 | "engines": { 670 | "node": "*" 671 | } 672 | }, 673 | "node_modules/espree": { 674 | "version": "9.6.1", 675 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", 676 | "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", 677 | "dev": true, 678 | "license": "BSD-2-Clause", 679 | "dependencies": { 680 | "acorn": "^8.9.0", 681 | "acorn-jsx": "^5.3.2", 682 | "eslint-visitor-keys": "^3.4.1" 683 | }, 684 | "engines": { 685 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 686 | }, 687 | "funding": { 688 | "url": "https://opencollective.com/eslint" 689 | } 690 | }, 691 | "node_modules/esquery": { 692 | "version": "1.6.0", 693 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", 694 | "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", 695 | "dev": true, 696 | "license": "BSD-3-Clause", 697 | "dependencies": { 698 | "estraverse": "^5.1.0" 699 | }, 700 | "engines": { 701 | "node": ">=0.10" 702 | } 703 | }, 704 | "node_modules/esrecurse": { 705 | "version": "4.3.0", 706 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 707 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 708 | "dev": true, 709 | "license": "BSD-2-Clause", 710 | "dependencies": { 711 | "estraverse": "^5.2.0" 712 | }, 713 | "engines": { 714 | "node": ">=4.0" 715 | } 716 | }, 717 | "node_modules/estraverse": { 718 | "version": "5.3.0", 719 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 720 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 721 | "dev": true, 722 | "license": "BSD-2-Clause", 723 | "engines": { 724 | "node": ">=4.0" 725 | } 726 | }, 727 | "node_modules/esutils": { 728 | "version": "2.0.3", 729 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 730 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 731 | "dev": true, 732 | "license": "BSD-2-Clause", 733 | "engines": { 734 | "node": ">=0.10.0" 735 | } 736 | }, 737 | "node_modules/fast-deep-equal": { 738 | "version": "3.1.3", 739 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 740 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 741 | "dev": true, 742 | "license": "MIT" 743 | }, 744 | "node_modules/fast-glob": { 745 | "version": "3.3.3", 746 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", 747 | "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", 748 | "dev": true, 749 | "license": "MIT", 750 | "dependencies": { 751 | "@nodelib/fs.stat": "^2.0.2", 752 | "@nodelib/fs.walk": "^1.2.3", 753 | "glob-parent": "^5.1.2", 754 | "merge2": "^1.3.0", 755 | "micromatch": "^4.0.8" 756 | }, 757 | "engines": { 758 | "node": ">=8.6.0" 759 | } 760 | }, 761 | "node_modules/fast-glob/node_modules/glob-parent": { 762 | "version": "5.1.2", 763 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 764 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 765 | "dev": true, 766 | "license": "ISC", 767 | "dependencies": { 768 | "is-glob": "^4.0.1" 769 | }, 770 | "engines": { 771 | "node": ">= 6" 772 | } 773 | }, 774 | "node_modules/fast-json-stable-stringify": { 775 | "version": "2.1.0", 776 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 777 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 778 | "dev": true, 779 | "license": "MIT" 780 | }, 781 | "node_modules/fast-levenshtein": { 782 | "version": "2.0.6", 783 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 784 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 785 | "dev": true, 786 | "license": "MIT" 787 | }, 788 | "node_modules/fastq": { 789 | "version": "1.19.1", 790 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", 791 | "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", 792 | "dev": true, 793 | "license": "ISC", 794 | "dependencies": { 795 | "reusify": "^1.0.4" 796 | } 797 | }, 798 | "node_modules/file-entry-cache": { 799 | "version": "6.0.1", 800 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 801 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 802 | "dev": true, 803 | "license": "MIT", 804 | "dependencies": { 805 | "flat-cache": "^3.0.4" 806 | }, 807 | "engines": { 808 | "node": "^10.12.0 || >=12.0.0" 809 | } 810 | }, 811 | "node_modules/fill-range": { 812 | "version": "7.1.1", 813 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 814 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 815 | "dev": true, 816 | "license": "MIT", 817 | "dependencies": { 818 | "to-regex-range": "^5.0.1" 819 | }, 820 | "engines": { 821 | "node": ">=8" 822 | } 823 | }, 824 | "node_modules/find-up": { 825 | "version": "5.0.0", 826 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 827 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 828 | "dev": true, 829 | "license": "MIT", 830 | "dependencies": { 831 | "locate-path": "^6.0.0", 832 | "path-exists": "^4.0.0" 833 | }, 834 | "engines": { 835 | "node": ">=10" 836 | }, 837 | "funding": { 838 | "url": "https://github.com/sponsors/sindresorhus" 839 | } 840 | }, 841 | "node_modules/flat-cache": { 842 | "version": "3.2.0", 843 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", 844 | "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", 845 | "dev": true, 846 | "license": "MIT", 847 | "dependencies": { 848 | "flatted": "^3.2.9", 849 | "keyv": "^4.5.3", 850 | "rimraf": "^3.0.2" 851 | }, 852 | "engines": { 853 | "node": "^10.12.0 || >=12.0.0" 854 | } 855 | }, 856 | "node_modules/flatted": { 857 | "version": "3.3.3", 858 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", 859 | "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", 860 | "dev": true, 861 | "license": "ISC" 862 | }, 863 | "node_modules/fs.realpath": { 864 | "version": "1.0.0", 865 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 866 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 867 | "dev": true, 868 | "license": "ISC" 869 | }, 870 | "node_modules/glob": { 871 | "version": "7.2.3", 872 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 873 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 874 | "deprecated": "Glob versions prior to v9 are no longer supported", 875 | "dev": true, 876 | "license": "ISC", 877 | "dependencies": { 878 | "fs.realpath": "^1.0.0", 879 | "inflight": "^1.0.4", 880 | "inherits": "2", 881 | "minimatch": "^3.1.1", 882 | "once": "^1.3.0", 883 | "path-is-absolute": "^1.0.0" 884 | }, 885 | "engines": { 886 | "node": "*" 887 | }, 888 | "funding": { 889 | "url": "https://github.com/sponsors/isaacs" 890 | } 891 | }, 892 | "node_modules/glob-parent": { 893 | "version": "6.0.2", 894 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 895 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 896 | "dev": true, 897 | "license": "ISC", 898 | "dependencies": { 899 | "is-glob": "^4.0.3" 900 | }, 901 | "engines": { 902 | "node": ">=10.13.0" 903 | } 904 | }, 905 | "node_modules/glob/node_modules/brace-expansion": { 906 | "version": "1.1.11", 907 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 908 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 909 | "dev": true, 910 | "license": "MIT", 911 | "dependencies": { 912 | "balanced-match": "^1.0.0", 913 | "concat-map": "0.0.1" 914 | } 915 | }, 916 | "node_modules/glob/node_modules/minimatch": { 917 | "version": "3.1.2", 918 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 919 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 920 | "dev": true, 921 | "license": "ISC", 922 | "dependencies": { 923 | "brace-expansion": "^1.1.7" 924 | }, 925 | "engines": { 926 | "node": "*" 927 | } 928 | }, 929 | "node_modules/globals": { 930 | "version": "13.24.0", 931 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", 932 | "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", 933 | "dev": true, 934 | "license": "MIT", 935 | "dependencies": { 936 | "type-fest": "^0.20.2" 937 | }, 938 | "engines": { 939 | "node": ">=8" 940 | }, 941 | "funding": { 942 | "url": "https://github.com/sponsors/sindresorhus" 943 | } 944 | }, 945 | "node_modules/globby": { 946 | "version": "11.1.0", 947 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", 948 | "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", 949 | "dev": true, 950 | "license": "MIT", 951 | "dependencies": { 952 | "array-union": "^2.1.0", 953 | "dir-glob": "^3.0.1", 954 | "fast-glob": "^3.2.9", 955 | "ignore": "^5.2.0", 956 | "merge2": "^1.4.1", 957 | "slash": "^3.0.0" 958 | }, 959 | "engines": { 960 | "node": ">=10" 961 | }, 962 | "funding": { 963 | "url": "https://github.com/sponsors/sindresorhus" 964 | } 965 | }, 966 | "node_modules/graphemer": { 967 | "version": "1.4.0", 968 | "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", 969 | "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", 970 | "dev": true, 971 | "license": "MIT" 972 | }, 973 | "node_modules/has-flag": { 974 | "version": "4.0.0", 975 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 976 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 977 | "dev": true, 978 | "license": "MIT", 979 | "engines": { 980 | "node": ">=8" 981 | } 982 | }, 983 | "node_modules/ignore": { 984 | "version": "5.3.2", 985 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", 986 | "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", 987 | "dev": true, 988 | "license": "MIT", 989 | "engines": { 990 | "node": ">= 4" 991 | } 992 | }, 993 | "node_modules/import-fresh": { 994 | "version": "3.3.1", 995 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", 996 | "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", 997 | "dev": true, 998 | "license": "MIT", 999 | "dependencies": { 1000 | "parent-module": "^1.0.0", 1001 | "resolve-from": "^4.0.0" 1002 | }, 1003 | "engines": { 1004 | "node": ">=6" 1005 | }, 1006 | "funding": { 1007 | "url": "https://github.com/sponsors/sindresorhus" 1008 | } 1009 | }, 1010 | "node_modules/imurmurhash": { 1011 | "version": "0.1.4", 1012 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1013 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 1014 | "dev": true, 1015 | "license": "MIT", 1016 | "engines": { 1017 | "node": ">=0.8.19" 1018 | } 1019 | }, 1020 | "node_modules/inflight": { 1021 | "version": "1.0.6", 1022 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1023 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1024 | "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.", 1025 | "dev": true, 1026 | "license": "ISC", 1027 | "dependencies": { 1028 | "once": "^1.3.0", 1029 | "wrappy": "1" 1030 | } 1031 | }, 1032 | "node_modules/inherits": { 1033 | "version": "2.0.4", 1034 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1035 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1036 | "dev": true, 1037 | "license": "ISC" 1038 | }, 1039 | "node_modules/is-extglob": { 1040 | "version": "2.1.1", 1041 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1042 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1043 | "dev": true, 1044 | "license": "MIT", 1045 | "engines": { 1046 | "node": ">=0.10.0" 1047 | } 1048 | }, 1049 | "node_modules/is-glob": { 1050 | "version": "4.0.3", 1051 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1052 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1053 | "dev": true, 1054 | "license": "MIT", 1055 | "dependencies": { 1056 | "is-extglob": "^2.1.1" 1057 | }, 1058 | "engines": { 1059 | "node": ">=0.10.0" 1060 | } 1061 | }, 1062 | "node_modules/is-number": { 1063 | "version": "7.0.0", 1064 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1065 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1066 | "dev": true, 1067 | "license": "MIT", 1068 | "engines": { 1069 | "node": ">=0.12.0" 1070 | } 1071 | }, 1072 | "node_modules/is-path-inside": { 1073 | "version": "3.0.3", 1074 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 1075 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", 1076 | "dev": true, 1077 | "license": "MIT", 1078 | "engines": { 1079 | "node": ">=8" 1080 | } 1081 | }, 1082 | "node_modules/isexe": { 1083 | "version": "2.0.0", 1084 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1085 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1086 | "dev": true, 1087 | "license": "ISC" 1088 | }, 1089 | "node_modules/js-yaml": { 1090 | "version": "4.1.0", 1091 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1092 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1093 | "dev": true, 1094 | "license": "MIT", 1095 | "dependencies": { 1096 | "argparse": "^2.0.1" 1097 | }, 1098 | "bin": { 1099 | "js-yaml": "bin/js-yaml.js" 1100 | } 1101 | }, 1102 | "node_modules/json-buffer": { 1103 | "version": "3.0.1", 1104 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 1105 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 1106 | "dev": true, 1107 | "license": "MIT" 1108 | }, 1109 | "node_modules/json-schema-traverse": { 1110 | "version": "0.4.1", 1111 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1112 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1113 | "dev": true, 1114 | "license": "MIT" 1115 | }, 1116 | "node_modules/json-stable-stringify-without-jsonify": { 1117 | "version": "1.0.1", 1118 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1119 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 1120 | "dev": true, 1121 | "license": "MIT" 1122 | }, 1123 | "node_modules/keyv": { 1124 | "version": "4.5.4", 1125 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 1126 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 1127 | "dev": true, 1128 | "license": "MIT", 1129 | "dependencies": { 1130 | "json-buffer": "3.0.1" 1131 | } 1132 | }, 1133 | "node_modules/levn": { 1134 | "version": "0.4.1", 1135 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 1136 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 1137 | "dev": true, 1138 | "license": "MIT", 1139 | "dependencies": { 1140 | "prelude-ls": "^1.2.1", 1141 | "type-check": "~0.4.0" 1142 | }, 1143 | "engines": { 1144 | "node": ">= 0.8.0" 1145 | } 1146 | }, 1147 | "node_modules/locate-path": { 1148 | "version": "6.0.0", 1149 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1150 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1151 | "dev": true, 1152 | "license": "MIT", 1153 | "dependencies": { 1154 | "p-locate": "^5.0.0" 1155 | }, 1156 | "engines": { 1157 | "node": ">=10" 1158 | }, 1159 | "funding": { 1160 | "url": "https://github.com/sponsors/sindresorhus" 1161 | } 1162 | }, 1163 | "node_modules/lodash.merge": { 1164 | "version": "4.6.2", 1165 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 1166 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 1167 | "dev": true, 1168 | "license": "MIT" 1169 | }, 1170 | "node_modules/merge2": { 1171 | "version": "1.4.1", 1172 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1173 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1174 | "dev": true, 1175 | "license": "MIT", 1176 | "engines": { 1177 | "node": ">= 8" 1178 | } 1179 | }, 1180 | "node_modules/micromatch": { 1181 | "version": "4.0.8", 1182 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 1183 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 1184 | "dev": true, 1185 | "license": "MIT", 1186 | "dependencies": { 1187 | "braces": "^3.0.3", 1188 | "picomatch": "^2.3.1" 1189 | }, 1190 | "engines": { 1191 | "node": ">=8.6" 1192 | } 1193 | }, 1194 | "node_modules/minimatch": { 1195 | "version": "9.0.5", 1196 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 1197 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 1198 | "dev": true, 1199 | "license": "ISC", 1200 | "dependencies": { 1201 | "brace-expansion": "^2.0.1" 1202 | }, 1203 | "engines": { 1204 | "node": ">=16 || 14 >=14.17" 1205 | }, 1206 | "funding": { 1207 | "url": "https://github.com/sponsors/isaacs" 1208 | } 1209 | }, 1210 | "node_modules/ms": { 1211 | "version": "2.1.3", 1212 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1213 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1214 | "dev": true, 1215 | "license": "MIT" 1216 | }, 1217 | "node_modules/natural-compare": { 1218 | "version": "1.4.0", 1219 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1220 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 1221 | "dev": true, 1222 | "license": "MIT" 1223 | }, 1224 | "node_modules/once": { 1225 | "version": "1.4.0", 1226 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1227 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1228 | "dev": true, 1229 | "license": "ISC", 1230 | "dependencies": { 1231 | "wrappy": "1" 1232 | } 1233 | }, 1234 | "node_modules/optionator": { 1235 | "version": "0.9.4", 1236 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", 1237 | "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", 1238 | "dev": true, 1239 | "license": "MIT", 1240 | "dependencies": { 1241 | "deep-is": "^0.1.3", 1242 | "fast-levenshtein": "^2.0.6", 1243 | "levn": "^0.4.1", 1244 | "prelude-ls": "^1.2.1", 1245 | "type-check": "^0.4.0", 1246 | "word-wrap": "^1.2.5" 1247 | }, 1248 | "engines": { 1249 | "node": ">= 0.8.0" 1250 | } 1251 | }, 1252 | "node_modules/p-limit": { 1253 | "version": "3.1.0", 1254 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1255 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1256 | "dev": true, 1257 | "license": "MIT", 1258 | "dependencies": { 1259 | "yocto-queue": "^0.1.0" 1260 | }, 1261 | "engines": { 1262 | "node": ">=10" 1263 | }, 1264 | "funding": { 1265 | "url": "https://github.com/sponsors/sindresorhus" 1266 | } 1267 | }, 1268 | "node_modules/p-locate": { 1269 | "version": "5.0.0", 1270 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1271 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1272 | "dev": true, 1273 | "license": "MIT", 1274 | "dependencies": { 1275 | "p-limit": "^3.0.2" 1276 | }, 1277 | "engines": { 1278 | "node": ">=10" 1279 | }, 1280 | "funding": { 1281 | "url": "https://github.com/sponsors/sindresorhus" 1282 | } 1283 | }, 1284 | "node_modules/parent-module": { 1285 | "version": "1.0.1", 1286 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1287 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1288 | "dev": true, 1289 | "license": "MIT", 1290 | "dependencies": { 1291 | "callsites": "^3.0.0" 1292 | }, 1293 | "engines": { 1294 | "node": ">=6" 1295 | } 1296 | }, 1297 | "node_modules/path-exists": { 1298 | "version": "4.0.0", 1299 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1300 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1301 | "dev": true, 1302 | "license": "MIT", 1303 | "engines": { 1304 | "node": ">=8" 1305 | } 1306 | }, 1307 | "node_modules/path-is-absolute": { 1308 | "version": "1.0.1", 1309 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1310 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1311 | "dev": true, 1312 | "license": "MIT", 1313 | "engines": { 1314 | "node": ">=0.10.0" 1315 | } 1316 | }, 1317 | "node_modules/path-key": { 1318 | "version": "3.1.1", 1319 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1320 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1321 | "dev": true, 1322 | "license": "MIT", 1323 | "engines": { 1324 | "node": ">=8" 1325 | } 1326 | }, 1327 | "node_modules/path-type": { 1328 | "version": "4.0.0", 1329 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 1330 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 1331 | "dev": true, 1332 | "license": "MIT", 1333 | "engines": { 1334 | "node": ">=8" 1335 | } 1336 | }, 1337 | "node_modules/picomatch": { 1338 | "version": "2.3.1", 1339 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1340 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1341 | "dev": true, 1342 | "license": "MIT", 1343 | "engines": { 1344 | "node": ">=8.6" 1345 | }, 1346 | "funding": { 1347 | "url": "https://github.com/sponsors/jonschlinkert" 1348 | } 1349 | }, 1350 | "node_modules/prelude-ls": { 1351 | "version": "1.2.1", 1352 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 1353 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 1354 | "dev": true, 1355 | "license": "MIT", 1356 | "engines": { 1357 | "node": ">= 0.8.0" 1358 | } 1359 | }, 1360 | "node_modules/punycode": { 1361 | "version": "2.3.1", 1362 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 1363 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 1364 | "dev": true, 1365 | "license": "MIT", 1366 | "engines": { 1367 | "node": ">=6" 1368 | } 1369 | }, 1370 | "node_modules/queue-microtask": { 1371 | "version": "1.2.3", 1372 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1373 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1374 | "dev": true, 1375 | "funding": [ 1376 | { 1377 | "type": "github", 1378 | "url": "https://github.com/sponsors/feross" 1379 | }, 1380 | { 1381 | "type": "patreon", 1382 | "url": "https://www.patreon.com/feross" 1383 | }, 1384 | { 1385 | "type": "consulting", 1386 | "url": "https://feross.org/support" 1387 | } 1388 | ], 1389 | "license": "MIT" 1390 | }, 1391 | "node_modules/resolve-from": { 1392 | "version": "4.0.0", 1393 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1394 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1395 | "dev": true, 1396 | "license": "MIT", 1397 | "engines": { 1398 | "node": ">=4" 1399 | } 1400 | }, 1401 | "node_modules/reusify": { 1402 | "version": "1.1.0", 1403 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", 1404 | "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", 1405 | "dev": true, 1406 | "license": "MIT", 1407 | "engines": { 1408 | "iojs": ">=1.0.0", 1409 | "node": ">=0.10.0" 1410 | } 1411 | }, 1412 | "node_modules/rimraf": { 1413 | "version": "3.0.2", 1414 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1415 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1416 | "deprecated": "Rimraf versions prior to v4 are no longer supported", 1417 | "dev": true, 1418 | "license": "ISC", 1419 | "dependencies": { 1420 | "glob": "^7.1.3" 1421 | }, 1422 | "bin": { 1423 | "rimraf": "bin.js" 1424 | }, 1425 | "funding": { 1426 | "url": "https://github.com/sponsors/isaacs" 1427 | } 1428 | }, 1429 | "node_modules/run-parallel": { 1430 | "version": "1.2.0", 1431 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1432 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1433 | "dev": true, 1434 | "funding": [ 1435 | { 1436 | "type": "github", 1437 | "url": "https://github.com/sponsors/feross" 1438 | }, 1439 | { 1440 | "type": "patreon", 1441 | "url": "https://www.patreon.com/feross" 1442 | }, 1443 | { 1444 | "type": "consulting", 1445 | "url": "https://feross.org/support" 1446 | } 1447 | ], 1448 | "license": "MIT", 1449 | "dependencies": { 1450 | "queue-microtask": "^1.2.2" 1451 | } 1452 | }, 1453 | "node_modules/semver": { 1454 | "version": "7.7.2", 1455 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", 1456 | "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", 1457 | "dev": true, 1458 | "license": "ISC", 1459 | "bin": { 1460 | "semver": "bin/semver.js" 1461 | }, 1462 | "engines": { 1463 | "node": ">=10" 1464 | } 1465 | }, 1466 | "node_modules/shebang-command": { 1467 | "version": "2.0.0", 1468 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1469 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1470 | "dev": true, 1471 | "license": "MIT", 1472 | "dependencies": { 1473 | "shebang-regex": "^3.0.0" 1474 | }, 1475 | "engines": { 1476 | "node": ">=8" 1477 | } 1478 | }, 1479 | "node_modules/shebang-regex": { 1480 | "version": "3.0.0", 1481 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1482 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1483 | "dev": true, 1484 | "license": "MIT", 1485 | "engines": { 1486 | "node": ">=8" 1487 | } 1488 | }, 1489 | "node_modules/slash": { 1490 | "version": "3.0.0", 1491 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 1492 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 1493 | "dev": true, 1494 | "license": "MIT", 1495 | "engines": { 1496 | "node": ">=8" 1497 | } 1498 | }, 1499 | "node_modules/strip-ansi": { 1500 | "version": "6.0.1", 1501 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1502 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1503 | "dev": true, 1504 | "license": "MIT", 1505 | "dependencies": { 1506 | "ansi-regex": "^5.0.1" 1507 | }, 1508 | "engines": { 1509 | "node": ">=8" 1510 | } 1511 | }, 1512 | "node_modules/strip-json-comments": { 1513 | "version": "3.1.1", 1514 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1515 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1516 | "dev": true, 1517 | "license": "MIT", 1518 | "engines": { 1519 | "node": ">=8" 1520 | }, 1521 | "funding": { 1522 | "url": "https://github.com/sponsors/sindresorhus" 1523 | } 1524 | }, 1525 | "node_modules/supports-color": { 1526 | "version": "7.2.0", 1527 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1528 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1529 | "dev": true, 1530 | "license": "MIT", 1531 | "dependencies": { 1532 | "has-flag": "^4.0.0" 1533 | }, 1534 | "engines": { 1535 | "node": ">=8" 1536 | } 1537 | }, 1538 | "node_modules/text-table": { 1539 | "version": "0.2.0", 1540 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1541 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 1542 | "dev": true, 1543 | "license": "MIT" 1544 | }, 1545 | "node_modules/to-regex-range": { 1546 | "version": "5.0.1", 1547 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1548 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1549 | "dev": true, 1550 | "license": "MIT", 1551 | "dependencies": { 1552 | "is-number": "^7.0.0" 1553 | }, 1554 | "engines": { 1555 | "node": ">=8.0" 1556 | } 1557 | }, 1558 | "node_modules/ts-api-utils": { 1559 | "version": "1.4.3", 1560 | "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", 1561 | "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", 1562 | "dev": true, 1563 | "license": "MIT", 1564 | "engines": { 1565 | "node": ">=16" 1566 | }, 1567 | "peerDependencies": { 1568 | "typescript": ">=4.2.0" 1569 | } 1570 | }, 1571 | "node_modules/type-check": { 1572 | "version": "0.4.0", 1573 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 1574 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 1575 | "dev": true, 1576 | "license": "MIT", 1577 | "dependencies": { 1578 | "prelude-ls": "^1.2.1" 1579 | }, 1580 | "engines": { 1581 | "node": ">= 0.8.0" 1582 | } 1583 | }, 1584 | "node_modules/type-fest": { 1585 | "version": "0.20.2", 1586 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 1587 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 1588 | "dev": true, 1589 | "license": "(MIT OR CC0-1.0)", 1590 | "engines": { 1591 | "node": ">=10" 1592 | }, 1593 | "funding": { 1594 | "url": "https://github.com/sponsors/sindresorhus" 1595 | } 1596 | }, 1597 | "node_modules/typescript": { 1598 | "version": "5.8.3", 1599 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", 1600 | "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", 1601 | "dev": true, 1602 | "license": "Apache-2.0", 1603 | "bin": { 1604 | "tsc": "bin/tsc", 1605 | "tsserver": "bin/tsserver" 1606 | }, 1607 | "engines": { 1608 | "node": ">=14.17" 1609 | } 1610 | }, 1611 | "node_modules/uri-js": { 1612 | "version": "4.4.1", 1613 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1614 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1615 | "dev": true, 1616 | "license": "BSD-2-Clause", 1617 | "dependencies": { 1618 | "punycode": "^2.1.0" 1619 | } 1620 | }, 1621 | "node_modules/which": { 1622 | "version": "2.0.2", 1623 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1624 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1625 | "dev": true, 1626 | "license": "ISC", 1627 | "dependencies": { 1628 | "isexe": "^2.0.0" 1629 | }, 1630 | "bin": { 1631 | "node-which": "bin/node-which" 1632 | }, 1633 | "engines": { 1634 | "node": ">= 8" 1635 | } 1636 | }, 1637 | "node_modules/word-wrap": { 1638 | "version": "1.2.5", 1639 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 1640 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 1641 | "dev": true, 1642 | "license": "MIT", 1643 | "engines": { 1644 | "node": ">=0.10.0" 1645 | } 1646 | }, 1647 | "node_modules/wrappy": { 1648 | "version": "1.0.2", 1649 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1650 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1651 | "dev": true, 1652 | "license": "ISC" 1653 | }, 1654 | "node_modules/yocto-queue": { 1655 | "version": "0.1.0", 1656 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1657 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1658 | "dev": true, 1659 | "license": "MIT", 1660 | "engines": { 1661 | "node": ">=10" 1662 | }, 1663 | "funding": { 1664 | "url": "https://github.com/sponsors/sindresorhus" 1665 | } 1666 | } 1667 | } 1668 | } 1669 | -------------------------------------------------------------------------------- /e2e/projects/eslint-recommended/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "eslint-recommended", 3 | "private": true, 4 | "scripts": { 5 | "test": "echo \"Error: no test specified\" && exit 1" 6 | }, 7 | "devDependencies": { 8 | "@typescript-eslint/parser": "7.12.0", 9 | "eslint": "8.57.1", 10 | "typescript": "5.8.3" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /e2e/projects/eslint-recommended/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "commonjs", 5 | "plugins": [ 6 | { "name": "typescript-eslint-language-service" } 7 | ] 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /e2e/projects/other-parser/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | es6: true, 5 | node: true, 6 | }, 7 | parser: "babel-eslint", 8 | parserOptions: { 9 | sourceType: "module", 10 | allowImportExportEverywhere: false, 11 | ecmaFeatures: { 12 | globalReturn: false, 13 | }, 14 | }, 15 | rules: { 16 | semi: 2, 17 | }, 18 | }; 19 | -------------------------------------------------------------------------------- /e2e/projects/other-parser/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "typescript.tsdk": "node_modules/typescript/lib" 3 | } -------------------------------------------------------------------------------- /e2e/projects/other-parser/main.ts: -------------------------------------------------------------------------------- 1 | const a = 1 2 | -------------------------------------------------------------------------------- /e2e/projects/other-parser/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "other-parser", 3 | "private": true, 4 | "scripts": { 5 | "test": "echo \"Error: no test specified\" && exit 1" 6 | }, 7 | "devDependencies": { 8 | "@babel/core": "7.27.4", 9 | "@babel/eslint-parser": "7.27.5", 10 | "eslint": "8.57.1", 11 | "typescript": "5.8.3" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /e2e/projects/other-parser/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "commonjs", 5 | "plugins": [ 6 | { "name": "typescript-eslint-language-service" } 7 | ] 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /e2e/projects/simple/.eslintignore: -------------------------------------------------------------------------------- 1 | to-be-ignored.ts 2 | -------------------------------------------------------------------------------- /e2e/projects/simple/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | es6: true, 5 | node: true, 6 | }, 7 | parser: "@typescript-eslint/parser", 8 | parserOptions: { 9 | project: "./tsconfig.json", 10 | }, 11 | rules: { 12 | semi: 2, 13 | }, 14 | }; 15 | -------------------------------------------------------------------------------- /e2e/projects/simple/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "typescript.tsdk": "node_modules/typescript/lib" 3 | } -------------------------------------------------------------------------------- /e2e/projects/simple/main.ts: -------------------------------------------------------------------------------- 1 | const a = 1 2 | -------------------------------------------------------------------------------- /e2e/projects/simple/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "simple", 3 | "lockfileVersion": 3, 4 | "requires": true, 5 | "packages": { 6 | "": { 7 | "name": "simple", 8 | "devDependencies": { 9 | "@typescript-eslint/parser": "7.12.0", 10 | "eslint": "8.57.1", 11 | "typescript": "5.8.3" 12 | } 13 | }, 14 | "node_modules/@eslint-community/eslint-utils": { 15 | "version": "4.7.0", 16 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", 17 | "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", 18 | "dev": true, 19 | "license": "MIT", 20 | "dependencies": { 21 | "eslint-visitor-keys": "^3.4.3" 22 | }, 23 | "engines": { 24 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 25 | }, 26 | "funding": { 27 | "url": "https://opencollective.com/eslint" 28 | }, 29 | "peerDependencies": { 30 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 31 | } 32 | }, 33 | "node_modules/@eslint-community/regexpp": { 34 | "version": "4.12.1", 35 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", 36 | "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", 37 | "dev": true, 38 | "license": "MIT", 39 | "engines": { 40 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 41 | } 42 | }, 43 | "node_modules/@eslint/eslintrc": { 44 | "version": "2.1.4", 45 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", 46 | "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", 47 | "dev": true, 48 | "license": "MIT", 49 | "dependencies": { 50 | "ajv": "^6.12.4", 51 | "debug": "^4.3.2", 52 | "espree": "^9.6.0", 53 | "globals": "^13.19.0", 54 | "ignore": "^5.2.0", 55 | "import-fresh": "^3.2.1", 56 | "js-yaml": "^4.1.0", 57 | "minimatch": "^3.1.2", 58 | "strip-json-comments": "^3.1.1" 59 | }, 60 | "engines": { 61 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 62 | }, 63 | "funding": { 64 | "url": "https://opencollective.com/eslint" 65 | } 66 | }, 67 | "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { 68 | "version": "1.1.11", 69 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 70 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 71 | "dev": true, 72 | "license": "MIT", 73 | "dependencies": { 74 | "balanced-match": "^1.0.0", 75 | "concat-map": "0.0.1" 76 | } 77 | }, 78 | "node_modules/@eslint/eslintrc/node_modules/minimatch": { 79 | "version": "3.1.2", 80 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 81 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 82 | "dev": true, 83 | "license": "ISC", 84 | "dependencies": { 85 | "brace-expansion": "^1.1.7" 86 | }, 87 | "engines": { 88 | "node": "*" 89 | } 90 | }, 91 | "node_modules/@eslint/js": { 92 | "version": "8.57.1", 93 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", 94 | "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", 95 | "dev": true, 96 | "license": "MIT", 97 | "engines": { 98 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 99 | } 100 | }, 101 | "node_modules/@humanwhocodes/config-array": { 102 | "version": "0.13.0", 103 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", 104 | "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", 105 | "deprecated": "Use @eslint/config-array instead", 106 | "dev": true, 107 | "license": "Apache-2.0", 108 | "dependencies": { 109 | "@humanwhocodes/object-schema": "^2.0.3", 110 | "debug": "^4.3.1", 111 | "minimatch": "^3.0.5" 112 | }, 113 | "engines": { 114 | "node": ">=10.10.0" 115 | } 116 | }, 117 | "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { 118 | "version": "1.1.11", 119 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 120 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 121 | "dev": true, 122 | "license": "MIT", 123 | "dependencies": { 124 | "balanced-match": "^1.0.0", 125 | "concat-map": "0.0.1" 126 | } 127 | }, 128 | "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { 129 | "version": "3.1.2", 130 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 131 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 132 | "dev": true, 133 | "license": "ISC", 134 | "dependencies": { 135 | "brace-expansion": "^1.1.7" 136 | }, 137 | "engines": { 138 | "node": "*" 139 | } 140 | }, 141 | "node_modules/@humanwhocodes/module-importer": { 142 | "version": "1.0.1", 143 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 144 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 145 | "dev": true, 146 | "license": "Apache-2.0", 147 | "engines": { 148 | "node": ">=12.22" 149 | }, 150 | "funding": { 151 | "type": "github", 152 | "url": "https://github.com/sponsors/nzakas" 153 | } 154 | }, 155 | "node_modules/@humanwhocodes/object-schema": { 156 | "version": "2.0.3", 157 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", 158 | "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", 159 | "deprecated": "Use @eslint/object-schema instead", 160 | "dev": true, 161 | "license": "BSD-3-Clause" 162 | }, 163 | "node_modules/@nodelib/fs.scandir": { 164 | "version": "2.1.5", 165 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 166 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 167 | "dev": true, 168 | "license": "MIT", 169 | "dependencies": { 170 | "@nodelib/fs.stat": "2.0.5", 171 | "run-parallel": "^1.1.9" 172 | }, 173 | "engines": { 174 | "node": ">= 8" 175 | } 176 | }, 177 | "node_modules/@nodelib/fs.stat": { 178 | "version": "2.0.5", 179 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 180 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 181 | "dev": true, 182 | "license": "MIT", 183 | "engines": { 184 | "node": ">= 8" 185 | } 186 | }, 187 | "node_modules/@nodelib/fs.walk": { 188 | "version": "1.2.8", 189 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 190 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 191 | "dev": true, 192 | "license": "MIT", 193 | "dependencies": { 194 | "@nodelib/fs.scandir": "2.1.5", 195 | "fastq": "^1.6.0" 196 | }, 197 | "engines": { 198 | "node": ">= 8" 199 | } 200 | }, 201 | "node_modules/@typescript-eslint/parser": { 202 | "version": "7.12.0", 203 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.12.0.tgz", 204 | "integrity": "sha512-dm/J2UDY3oV3TKius2OUZIFHsomQmpHtsV0FTh1WO8EKgHLQ1QCADUqscPgTpU+ih1e21FQSRjXckHn3txn6kQ==", 205 | "dev": true, 206 | "license": "BSD-2-Clause", 207 | "dependencies": { 208 | "@typescript-eslint/scope-manager": "7.12.0", 209 | "@typescript-eslint/types": "7.12.0", 210 | "@typescript-eslint/typescript-estree": "7.12.0", 211 | "@typescript-eslint/visitor-keys": "7.12.0", 212 | "debug": "^4.3.4" 213 | }, 214 | "engines": { 215 | "node": "^18.18.0 || >=20.0.0" 216 | }, 217 | "funding": { 218 | "type": "opencollective", 219 | "url": "https://opencollective.com/typescript-eslint" 220 | }, 221 | "peerDependencies": { 222 | "eslint": "^8.56.0" 223 | }, 224 | "peerDependenciesMeta": { 225 | "typescript": { 226 | "optional": true 227 | } 228 | } 229 | }, 230 | "node_modules/@typescript-eslint/scope-manager": { 231 | "version": "7.12.0", 232 | "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.12.0.tgz", 233 | "integrity": "sha512-itF1pTnN6F3unPak+kutH9raIkL3lhH1YRPGgt7QQOh43DQKVJXmWkpb+vpc/TiDHs6RSd9CTbDsc/Y+Ygq7kg==", 234 | "dev": true, 235 | "license": "MIT", 236 | "dependencies": { 237 | "@typescript-eslint/types": "7.12.0", 238 | "@typescript-eslint/visitor-keys": "7.12.0" 239 | }, 240 | "engines": { 241 | "node": "^18.18.0 || >=20.0.0" 242 | }, 243 | "funding": { 244 | "type": "opencollective", 245 | "url": "https://opencollective.com/typescript-eslint" 246 | } 247 | }, 248 | "node_modules/@typescript-eslint/types": { 249 | "version": "7.12.0", 250 | "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.12.0.tgz", 251 | "integrity": "sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==", 252 | "dev": true, 253 | "license": "MIT", 254 | "engines": { 255 | "node": "^18.18.0 || >=20.0.0" 256 | }, 257 | "funding": { 258 | "type": "opencollective", 259 | "url": "https://opencollective.com/typescript-eslint" 260 | } 261 | }, 262 | "node_modules/@typescript-eslint/typescript-estree": { 263 | "version": "7.12.0", 264 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.12.0.tgz", 265 | "integrity": "sha512-5bwqLsWBULv1h6pn7cMW5dXX/Y2amRqLaKqsASVwbBHMZSnHqE/HN4vT4fE0aFsiwxYvr98kqOWh1a8ZKXalCQ==", 266 | "dev": true, 267 | "license": "BSD-2-Clause", 268 | "dependencies": { 269 | "@typescript-eslint/types": "7.12.0", 270 | "@typescript-eslint/visitor-keys": "7.12.0", 271 | "debug": "^4.3.4", 272 | "globby": "^11.1.0", 273 | "is-glob": "^4.0.3", 274 | "minimatch": "^9.0.4", 275 | "semver": "^7.6.0", 276 | "ts-api-utils": "^1.3.0" 277 | }, 278 | "engines": { 279 | "node": "^18.18.0 || >=20.0.0" 280 | }, 281 | "funding": { 282 | "type": "opencollective", 283 | "url": "https://opencollective.com/typescript-eslint" 284 | }, 285 | "peerDependenciesMeta": { 286 | "typescript": { 287 | "optional": true 288 | } 289 | } 290 | }, 291 | "node_modules/@typescript-eslint/visitor-keys": { 292 | "version": "7.12.0", 293 | "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.12.0.tgz", 294 | "integrity": "sha512-uZk7DevrQLL3vSnfFl5bj4sL75qC9D6EdjemIdbtkuUmIheWpuiiylSY01JxJE7+zGrOWDZrp1WxOuDntvKrHQ==", 295 | "dev": true, 296 | "license": "MIT", 297 | "dependencies": { 298 | "@typescript-eslint/types": "7.12.0", 299 | "eslint-visitor-keys": "^3.4.3" 300 | }, 301 | "engines": { 302 | "node": "^18.18.0 || >=20.0.0" 303 | }, 304 | "funding": { 305 | "type": "opencollective", 306 | "url": "https://opencollective.com/typescript-eslint" 307 | } 308 | }, 309 | "node_modules/@ungap/structured-clone": { 310 | "version": "1.3.0", 311 | "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", 312 | "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", 313 | "dev": true, 314 | "license": "ISC" 315 | }, 316 | "node_modules/acorn": { 317 | "version": "8.14.1", 318 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", 319 | "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", 320 | "dev": true, 321 | "license": "MIT", 322 | "bin": { 323 | "acorn": "bin/acorn" 324 | }, 325 | "engines": { 326 | "node": ">=0.4.0" 327 | } 328 | }, 329 | "node_modules/acorn-jsx": { 330 | "version": "5.3.2", 331 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 332 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 333 | "dev": true, 334 | "license": "MIT", 335 | "peerDependencies": { 336 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 337 | } 338 | }, 339 | "node_modules/ajv": { 340 | "version": "6.12.6", 341 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 342 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 343 | "dev": true, 344 | "license": "MIT", 345 | "dependencies": { 346 | "fast-deep-equal": "^3.1.1", 347 | "fast-json-stable-stringify": "^2.0.0", 348 | "json-schema-traverse": "^0.4.1", 349 | "uri-js": "^4.2.2" 350 | }, 351 | "funding": { 352 | "type": "github", 353 | "url": "https://github.com/sponsors/epoberezkin" 354 | } 355 | }, 356 | "node_modules/ansi-regex": { 357 | "version": "5.0.1", 358 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 359 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 360 | "dev": true, 361 | "license": "MIT", 362 | "engines": { 363 | "node": ">=8" 364 | } 365 | }, 366 | "node_modules/ansi-styles": { 367 | "version": "4.3.0", 368 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 369 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 370 | "dev": true, 371 | "license": "MIT", 372 | "dependencies": { 373 | "color-convert": "^2.0.1" 374 | }, 375 | "engines": { 376 | "node": ">=8" 377 | }, 378 | "funding": { 379 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 380 | } 381 | }, 382 | "node_modules/argparse": { 383 | "version": "2.0.1", 384 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 385 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 386 | "dev": true, 387 | "license": "Python-2.0" 388 | }, 389 | "node_modules/array-union": { 390 | "version": "2.1.0", 391 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 392 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", 393 | "dev": true, 394 | "license": "MIT", 395 | "engines": { 396 | "node": ">=8" 397 | } 398 | }, 399 | "node_modules/balanced-match": { 400 | "version": "1.0.2", 401 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 402 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 403 | "dev": true, 404 | "license": "MIT" 405 | }, 406 | "node_modules/brace-expansion": { 407 | "version": "2.0.1", 408 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 409 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 410 | "dev": true, 411 | "license": "MIT", 412 | "dependencies": { 413 | "balanced-match": "^1.0.0" 414 | } 415 | }, 416 | "node_modules/braces": { 417 | "version": "3.0.3", 418 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 419 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 420 | "dev": true, 421 | "license": "MIT", 422 | "dependencies": { 423 | "fill-range": "^7.1.1" 424 | }, 425 | "engines": { 426 | "node": ">=8" 427 | } 428 | }, 429 | "node_modules/callsites": { 430 | "version": "3.1.0", 431 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 432 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 433 | "dev": true, 434 | "license": "MIT", 435 | "engines": { 436 | "node": ">=6" 437 | } 438 | }, 439 | "node_modules/chalk": { 440 | "version": "4.1.2", 441 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 442 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 443 | "dev": true, 444 | "license": "MIT", 445 | "dependencies": { 446 | "ansi-styles": "^4.1.0", 447 | "supports-color": "^7.1.0" 448 | }, 449 | "engines": { 450 | "node": ">=10" 451 | }, 452 | "funding": { 453 | "url": "https://github.com/chalk/chalk?sponsor=1" 454 | } 455 | }, 456 | "node_modules/color-convert": { 457 | "version": "2.0.1", 458 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 459 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 460 | "dev": true, 461 | "license": "MIT", 462 | "dependencies": { 463 | "color-name": "~1.1.4" 464 | }, 465 | "engines": { 466 | "node": ">=7.0.0" 467 | } 468 | }, 469 | "node_modules/color-name": { 470 | "version": "1.1.4", 471 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 472 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 473 | "dev": true, 474 | "license": "MIT" 475 | }, 476 | "node_modules/concat-map": { 477 | "version": "0.0.1", 478 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 479 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 480 | "dev": true, 481 | "license": "MIT" 482 | }, 483 | "node_modules/cross-spawn": { 484 | "version": "7.0.6", 485 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 486 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 487 | "dev": true, 488 | "license": "MIT", 489 | "dependencies": { 490 | "path-key": "^3.1.0", 491 | "shebang-command": "^2.0.0", 492 | "which": "^2.0.1" 493 | }, 494 | "engines": { 495 | "node": ">= 8" 496 | } 497 | }, 498 | "node_modules/debug": { 499 | "version": "4.4.1", 500 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", 501 | "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", 502 | "dev": true, 503 | "license": "MIT", 504 | "dependencies": { 505 | "ms": "^2.1.3" 506 | }, 507 | "engines": { 508 | "node": ">=6.0" 509 | }, 510 | "peerDependenciesMeta": { 511 | "supports-color": { 512 | "optional": true 513 | } 514 | } 515 | }, 516 | "node_modules/deep-is": { 517 | "version": "0.1.4", 518 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 519 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 520 | "dev": true, 521 | "license": "MIT" 522 | }, 523 | "node_modules/dir-glob": { 524 | "version": "3.0.1", 525 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 526 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 527 | "dev": true, 528 | "license": "MIT", 529 | "dependencies": { 530 | "path-type": "^4.0.0" 531 | }, 532 | "engines": { 533 | "node": ">=8" 534 | } 535 | }, 536 | "node_modules/doctrine": { 537 | "version": "3.0.0", 538 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 539 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 540 | "dev": true, 541 | "license": "Apache-2.0", 542 | "dependencies": { 543 | "esutils": "^2.0.2" 544 | }, 545 | "engines": { 546 | "node": ">=6.0.0" 547 | } 548 | }, 549 | "node_modules/escape-string-regexp": { 550 | "version": "4.0.0", 551 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 552 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 553 | "dev": true, 554 | "license": "MIT", 555 | "engines": { 556 | "node": ">=10" 557 | }, 558 | "funding": { 559 | "url": "https://github.com/sponsors/sindresorhus" 560 | } 561 | }, 562 | "node_modules/eslint": { 563 | "version": "8.57.1", 564 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", 565 | "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", 566 | "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", 567 | "dev": true, 568 | "license": "MIT", 569 | "dependencies": { 570 | "@eslint-community/eslint-utils": "^4.2.0", 571 | "@eslint-community/regexpp": "^4.6.1", 572 | "@eslint/eslintrc": "^2.1.4", 573 | "@eslint/js": "8.57.1", 574 | "@humanwhocodes/config-array": "^0.13.0", 575 | "@humanwhocodes/module-importer": "^1.0.1", 576 | "@nodelib/fs.walk": "^1.2.8", 577 | "@ungap/structured-clone": "^1.2.0", 578 | "ajv": "^6.12.4", 579 | "chalk": "^4.0.0", 580 | "cross-spawn": "^7.0.2", 581 | "debug": "^4.3.2", 582 | "doctrine": "^3.0.0", 583 | "escape-string-regexp": "^4.0.0", 584 | "eslint-scope": "^7.2.2", 585 | "eslint-visitor-keys": "^3.4.3", 586 | "espree": "^9.6.1", 587 | "esquery": "^1.4.2", 588 | "esutils": "^2.0.2", 589 | "fast-deep-equal": "^3.1.3", 590 | "file-entry-cache": "^6.0.1", 591 | "find-up": "^5.0.0", 592 | "glob-parent": "^6.0.2", 593 | "globals": "^13.19.0", 594 | "graphemer": "^1.4.0", 595 | "ignore": "^5.2.0", 596 | "imurmurhash": "^0.1.4", 597 | "is-glob": "^4.0.0", 598 | "is-path-inside": "^3.0.3", 599 | "js-yaml": "^4.1.0", 600 | "json-stable-stringify-without-jsonify": "^1.0.1", 601 | "levn": "^0.4.1", 602 | "lodash.merge": "^4.6.2", 603 | "minimatch": "^3.1.2", 604 | "natural-compare": "^1.4.0", 605 | "optionator": "^0.9.3", 606 | "strip-ansi": "^6.0.1", 607 | "text-table": "^0.2.0" 608 | }, 609 | "bin": { 610 | "eslint": "bin/eslint.js" 611 | }, 612 | "engines": { 613 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 614 | }, 615 | "funding": { 616 | "url": "https://opencollective.com/eslint" 617 | } 618 | }, 619 | "node_modules/eslint-scope": { 620 | "version": "7.2.2", 621 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", 622 | "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", 623 | "dev": true, 624 | "license": "BSD-2-Clause", 625 | "dependencies": { 626 | "esrecurse": "^4.3.0", 627 | "estraverse": "^5.2.0" 628 | }, 629 | "engines": { 630 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 631 | }, 632 | "funding": { 633 | "url": "https://opencollective.com/eslint" 634 | } 635 | }, 636 | "node_modules/eslint-visitor-keys": { 637 | "version": "3.4.3", 638 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 639 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 640 | "dev": true, 641 | "license": "Apache-2.0", 642 | "engines": { 643 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 644 | }, 645 | "funding": { 646 | "url": "https://opencollective.com/eslint" 647 | } 648 | }, 649 | "node_modules/eslint/node_modules/brace-expansion": { 650 | "version": "1.1.11", 651 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 652 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 653 | "dev": true, 654 | "license": "MIT", 655 | "dependencies": { 656 | "balanced-match": "^1.0.0", 657 | "concat-map": "0.0.1" 658 | } 659 | }, 660 | "node_modules/eslint/node_modules/minimatch": { 661 | "version": "3.1.2", 662 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 663 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 664 | "dev": true, 665 | "license": "ISC", 666 | "dependencies": { 667 | "brace-expansion": "^1.1.7" 668 | }, 669 | "engines": { 670 | "node": "*" 671 | } 672 | }, 673 | "node_modules/espree": { 674 | "version": "9.6.1", 675 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", 676 | "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", 677 | "dev": true, 678 | "license": "BSD-2-Clause", 679 | "dependencies": { 680 | "acorn": "^8.9.0", 681 | "acorn-jsx": "^5.3.2", 682 | "eslint-visitor-keys": "^3.4.1" 683 | }, 684 | "engines": { 685 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 686 | }, 687 | "funding": { 688 | "url": "https://opencollective.com/eslint" 689 | } 690 | }, 691 | "node_modules/esquery": { 692 | "version": "1.6.0", 693 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", 694 | "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", 695 | "dev": true, 696 | "license": "BSD-3-Clause", 697 | "dependencies": { 698 | "estraverse": "^5.1.0" 699 | }, 700 | "engines": { 701 | "node": ">=0.10" 702 | } 703 | }, 704 | "node_modules/esrecurse": { 705 | "version": "4.3.0", 706 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 707 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 708 | "dev": true, 709 | "license": "BSD-2-Clause", 710 | "dependencies": { 711 | "estraverse": "^5.2.0" 712 | }, 713 | "engines": { 714 | "node": ">=4.0" 715 | } 716 | }, 717 | "node_modules/estraverse": { 718 | "version": "5.3.0", 719 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 720 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 721 | "dev": true, 722 | "license": "BSD-2-Clause", 723 | "engines": { 724 | "node": ">=4.0" 725 | } 726 | }, 727 | "node_modules/esutils": { 728 | "version": "2.0.3", 729 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 730 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 731 | "dev": true, 732 | "license": "BSD-2-Clause", 733 | "engines": { 734 | "node": ">=0.10.0" 735 | } 736 | }, 737 | "node_modules/fast-deep-equal": { 738 | "version": "3.1.3", 739 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 740 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 741 | "dev": true, 742 | "license": "MIT" 743 | }, 744 | "node_modules/fast-glob": { 745 | "version": "3.3.3", 746 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", 747 | "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", 748 | "dev": true, 749 | "license": "MIT", 750 | "dependencies": { 751 | "@nodelib/fs.stat": "^2.0.2", 752 | "@nodelib/fs.walk": "^1.2.3", 753 | "glob-parent": "^5.1.2", 754 | "merge2": "^1.3.0", 755 | "micromatch": "^4.0.8" 756 | }, 757 | "engines": { 758 | "node": ">=8.6.0" 759 | } 760 | }, 761 | "node_modules/fast-glob/node_modules/glob-parent": { 762 | "version": "5.1.2", 763 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 764 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 765 | "dev": true, 766 | "license": "ISC", 767 | "dependencies": { 768 | "is-glob": "^4.0.1" 769 | }, 770 | "engines": { 771 | "node": ">= 6" 772 | } 773 | }, 774 | "node_modules/fast-json-stable-stringify": { 775 | "version": "2.1.0", 776 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 777 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 778 | "dev": true, 779 | "license": "MIT" 780 | }, 781 | "node_modules/fast-levenshtein": { 782 | "version": "2.0.6", 783 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 784 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 785 | "dev": true, 786 | "license": "MIT" 787 | }, 788 | "node_modules/fastq": { 789 | "version": "1.19.1", 790 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", 791 | "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", 792 | "dev": true, 793 | "license": "ISC", 794 | "dependencies": { 795 | "reusify": "^1.0.4" 796 | } 797 | }, 798 | "node_modules/file-entry-cache": { 799 | "version": "6.0.1", 800 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 801 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 802 | "dev": true, 803 | "license": "MIT", 804 | "dependencies": { 805 | "flat-cache": "^3.0.4" 806 | }, 807 | "engines": { 808 | "node": "^10.12.0 || >=12.0.0" 809 | } 810 | }, 811 | "node_modules/fill-range": { 812 | "version": "7.1.1", 813 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 814 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 815 | "dev": true, 816 | "license": "MIT", 817 | "dependencies": { 818 | "to-regex-range": "^5.0.1" 819 | }, 820 | "engines": { 821 | "node": ">=8" 822 | } 823 | }, 824 | "node_modules/find-up": { 825 | "version": "5.0.0", 826 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 827 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 828 | "dev": true, 829 | "license": "MIT", 830 | "dependencies": { 831 | "locate-path": "^6.0.0", 832 | "path-exists": "^4.0.0" 833 | }, 834 | "engines": { 835 | "node": ">=10" 836 | }, 837 | "funding": { 838 | "url": "https://github.com/sponsors/sindresorhus" 839 | } 840 | }, 841 | "node_modules/flat-cache": { 842 | "version": "3.2.0", 843 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", 844 | "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", 845 | "dev": true, 846 | "license": "MIT", 847 | "dependencies": { 848 | "flatted": "^3.2.9", 849 | "keyv": "^4.5.3", 850 | "rimraf": "^3.0.2" 851 | }, 852 | "engines": { 853 | "node": "^10.12.0 || >=12.0.0" 854 | } 855 | }, 856 | "node_modules/flatted": { 857 | "version": "3.3.3", 858 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", 859 | "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", 860 | "dev": true, 861 | "license": "ISC" 862 | }, 863 | "node_modules/fs.realpath": { 864 | "version": "1.0.0", 865 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 866 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 867 | "dev": true, 868 | "license": "ISC" 869 | }, 870 | "node_modules/glob": { 871 | "version": "7.2.3", 872 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 873 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 874 | "deprecated": "Glob versions prior to v9 are no longer supported", 875 | "dev": true, 876 | "license": "ISC", 877 | "dependencies": { 878 | "fs.realpath": "^1.0.0", 879 | "inflight": "^1.0.4", 880 | "inherits": "2", 881 | "minimatch": "^3.1.1", 882 | "once": "^1.3.0", 883 | "path-is-absolute": "^1.0.0" 884 | }, 885 | "engines": { 886 | "node": "*" 887 | }, 888 | "funding": { 889 | "url": "https://github.com/sponsors/isaacs" 890 | } 891 | }, 892 | "node_modules/glob-parent": { 893 | "version": "6.0.2", 894 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 895 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 896 | "dev": true, 897 | "license": "ISC", 898 | "dependencies": { 899 | "is-glob": "^4.0.3" 900 | }, 901 | "engines": { 902 | "node": ">=10.13.0" 903 | } 904 | }, 905 | "node_modules/glob/node_modules/brace-expansion": { 906 | "version": "1.1.11", 907 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 908 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 909 | "dev": true, 910 | "license": "MIT", 911 | "dependencies": { 912 | "balanced-match": "^1.0.0", 913 | "concat-map": "0.0.1" 914 | } 915 | }, 916 | "node_modules/glob/node_modules/minimatch": { 917 | "version": "3.1.2", 918 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 919 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 920 | "dev": true, 921 | "license": "ISC", 922 | "dependencies": { 923 | "brace-expansion": "^1.1.7" 924 | }, 925 | "engines": { 926 | "node": "*" 927 | } 928 | }, 929 | "node_modules/globals": { 930 | "version": "13.24.0", 931 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", 932 | "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", 933 | "dev": true, 934 | "license": "MIT", 935 | "dependencies": { 936 | "type-fest": "^0.20.2" 937 | }, 938 | "engines": { 939 | "node": ">=8" 940 | }, 941 | "funding": { 942 | "url": "https://github.com/sponsors/sindresorhus" 943 | } 944 | }, 945 | "node_modules/globby": { 946 | "version": "11.1.0", 947 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", 948 | "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", 949 | "dev": true, 950 | "license": "MIT", 951 | "dependencies": { 952 | "array-union": "^2.1.0", 953 | "dir-glob": "^3.0.1", 954 | "fast-glob": "^3.2.9", 955 | "ignore": "^5.2.0", 956 | "merge2": "^1.4.1", 957 | "slash": "^3.0.0" 958 | }, 959 | "engines": { 960 | "node": ">=10" 961 | }, 962 | "funding": { 963 | "url": "https://github.com/sponsors/sindresorhus" 964 | } 965 | }, 966 | "node_modules/graphemer": { 967 | "version": "1.4.0", 968 | "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", 969 | "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", 970 | "dev": true, 971 | "license": "MIT" 972 | }, 973 | "node_modules/has-flag": { 974 | "version": "4.0.0", 975 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 976 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 977 | "dev": true, 978 | "license": "MIT", 979 | "engines": { 980 | "node": ">=8" 981 | } 982 | }, 983 | "node_modules/ignore": { 984 | "version": "5.3.2", 985 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", 986 | "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", 987 | "dev": true, 988 | "license": "MIT", 989 | "engines": { 990 | "node": ">= 4" 991 | } 992 | }, 993 | "node_modules/import-fresh": { 994 | "version": "3.3.1", 995 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", 996 | "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", 997 | "dev": true, 998 | "license": "MIT", 999 | "dependencies": { 1000 | "parent-module": "^1.0.0", 1001 | "resolve-from": "^4.0.0" 1002 | }, 1003 | "engines": { 1004 | "node": ">=6" 1005 | }, 1006 | "funding": { 1007 | "url": "https://github.com/sponsors/sindresorhus" 1008 | } 1009 | }, 1010 | "node_modules/imurmurhash": { 1011 | "version": "0.1.4", 1012 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1013 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 1014 | "dev": true, 1015 | "license": "MIT", 1016 | "engines": { 1017 | "node": ">=0.8.19" 1018 | } 1019 | }, 1020 | "node_modules/inflight": { 1021 | "version": "1.0.6", 1022 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1023 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1024 | "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.", 1025 | "dev": true, 1026 | "license": "ISC", 1027 | "dependencies": { 1028 | "once": "^1.3.0", 1029 | "wrappy": "1" 1030 | } 1031 | }, 1032 | "node_modules/inherits": { 1033 | "version": "2.0.4", 1034 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1035 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1036 | "dev": true, 1037 | "license": "ISC" 1038 | }, 1039 | "node_modules/is-extglob": { 1040 | "version": "2.1.1", 1041 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1042 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1043 | "dev": true, 1044 | "license": "MIT", 1045 | "engines": { 1046 | "node": ">=0.10.0" 1047 | } 1048 | }, 1049 | "node_modules/is-glob": { 1050 | "version": "4.0.3", 1051 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1052 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1053 | "dev": true, 1054 | "license": "MIT", 1055 | "dependencies": { 1056 | "is-extglob": "^2.1.1" 1057 | }, 1058 | "engines": { 1059 | "node": ">=0.10.0" 1060 | } 1061 | }, 1062 | "node_modules/is-number": { 1063 | "version": "7.0.0", 1064 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1065 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1066 | "dev": true, 1067 | "license": "MIT", 1068 | "engines": { 1069 | "node": ">=0.12.0" 1070 | } 1071 | }, 1072 | "node_modules/is-path-inside": { 1073 | "version": "3.0.3", 1074 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 1075 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", 1076 | "dev": true, 1077 | "license": "MIT", 1078 | "engines": { 1079 | "node": ">=8" 1080 | } 1081 | }, 1082 | "node_modules/isexe": { 1083 | "version": "2.0.0", 1084 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1085 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1086 | "dev": true, 1087 | "license": "ISC" 1088 | }, 1089 | "node_modules/js-yaml": { 1090 | "version": "4.1.0", 1091 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1092 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1093 | "dev": true, 1094 | "license": "MIT", 1095 | "dependencies": { 1096 | "argparse": "^2.0.1" 1097 | }, 1098 | "bin": { 1099 | "js-yaml": "bin/js-yaml.js" 1100 | } 1101 | }, 1102 | "node_modules/json-buffer": { 1103 | "version": "3.0.1", 1104 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 1105 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 1106 | "dev": true, 1107 | "license": "MIT" 1108 | }, 1109 | "node_modules/json-schema-traverse": { 1110 | "version": "0.4.1", 1111 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1112 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1113 | "dev": true, 1114 | "license": "MIT" 1115 | }, 1116 | "node_modules/json-stable-stringify-without-jsonify": { 1117 | "version": "1.0.1", 1118 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1119 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 1120 | "dev": true, 1121 | "license": "MIT" 1122 | }, 1123 | "node_modules/keyv": { 1124 | "version": "4.5.4", 1125 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 1126 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 1127 | "dev": true, 1128 | "license": "MIT", 1129 | "dependencies": { 1130 | "json-buffer": "3.0.1" 1131 | } 1132 | }, 1133 | "node_modules/levn": { 1134 | "version": "0.4.1", 1135 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 1136 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 1137 | "dev": true, 1138 | "license": "MIT", 1139 | "dependencies": { 1140 | "prelude-ls": "^1.2.1", 1141 | "type-check": "~0.4.0" 1142 | }, 1143 | "engines": { 1144 | "node": ">= 0.8.0" 1145 | } 1146 | }, 1147 | "node_modules/locate-path": { 1148 | "version": "6.0.0", 1149 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1150 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1151 | "dev": true, 1152 | "license": "MIT", 1153 | "dependencies": { 1154 | "p-locate": "^5.0.0" 1155 | }, 1156 | "engines": { 1157 | "node": ">=10" 1158 | }, 1159 | "funding": { 1160 | "url": "https://github.com/sponsors/sindresorhus" 1161 | } 1162 | }, 1163 | "node_modules/lodash.merge": { 1164 | "version": "4.6.2", 1165 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 1166 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 1167 | "dev": true, 1168 | "license": "MIT" 1169 | }, 1170 | "node_modules/merge2": { 1171 | "version": "1.4.1", 1172 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1173 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1174 | "dev": true, 1175 | "license": "MIT", 1176 | "engines": { 1177 | "node": ">= 8" 1178 | } 1179 | }, 1180 | "node_modules/micromatch": { 1181 | "version": "4.0.8", 1182 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 1183 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 1184 | "dev": true, 1185 | "license": "MIT", 1186 | "dependencies": { 1187 | "braces": "^3.0.3", 1188 | "picomatch": "^2.3.1" 1189 | }, 1190 | "engines": { 1191 | "node": ">=8.6" 1192 | } 1193 | }, 1194 | "node_modules/minimatch": { 1195 | "version": "9.0.5", 1196 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 1197 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 1198 | "dev": true, 1199 | "license": "ISC", 1200 | "dependencies": { 1201 | "brace-expansion": "^2.0.1" 1202 | }, 1203 | "engines": { 1204 | "node": ">=16 || 14 >=14.17" 1205 | }, 1206 | "funding": { 1207 | "url": "https://github.com/sponsors/isaacs" 1208 | } 1209 | }, 1210 | "node_modules/ms": { 1211 | "version": "2.1.3", 1212 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1213 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1214 | "dev": true, 1215 | "license": "MIT" 1216 | }, 1217 | "node_modules/natural-compare": { 1218 | "version": "1.4.0", 1219 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1220 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 1221 | "dev": true, 1222 | "license": "MIT" 1223 | }, 1224 | "node_modules/once": { 1225 | "version": "1.4.0", 1226 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1227 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1228 | "dev": true, 1229 | "license": "ISC", 1230 | "dependencies": { 1231 | "wrappy": "1" 1232 | } 1233 | }, 1234 | "node_modules/optionator": { 1235 | "version": "0.9.4", 1236 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", 1237 | "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", 1238 | "dev": true, 1239 | "license": "MIT", 1240 | "dependencies": { 1241 | "deep-is": "^0.1.3", 1242 | "fast-levenshtein": "^2.0.6", 1243 | "levn": "^0.4.1", 1244 | "prelude-ls": "^1.2.1", 1245 | "type-check": "^0.4.0", 1246 | "word-wrap": "^1.2.5" 1247 | }, 1248 | "engines": { 1249 | "node": ">= 0.8.0" 1250 | } 1251 | }, 1252 | "node_modules/p-limit": { 1253 | "version": "3.1.0", 1254 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1255 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1256 | "dev": true, 1257 | "license": "MIT", 1258 | "dependencies": { 1259 | "yocto-queue": "^0.1.0" 1260 | }, 1261 | "engines": { 1262 | "node": ">=10" 1263 | }, 1264 | "funding": { 1265 | "url": "https://github.com/sponsors/sindresorhus" 1266 | } 1267 | }, 1268 | "node_modules/p-locate": { 1269 | "version": "5.0.0", 1270 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1271 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1272 | "dev": true, 1273 | "license": "MIT", 1274 | "dependencies": { 1275 | "p-limit": "^3.0.2" 1276 | }, 1277 | "engines": { 1278 | "node": ">=10" 1279 | }, 1280 | "funding": { 1281 | "url": "https://github.com/sponsors/sindresorhus" 1282 | } 1283 | }, 1284 | "node_modules/parent-module": { 1285 | "version": "1.0.1", 1286 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1287 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1288 | "dev": true, 1289 | "license": "MIT", 1290 | "dependencies": { 1291 | "callsites": "^3.0.0" 1292 | }, 1293 | "engines": { 1294 | "node": ">=6" 1295 | } 1296 | }, 1297 | "node_modules/path-exists": { 1298 | "version": "4.0.0", 1299 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1300 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1301 | "dev": true, 1302 | "license": "MIT", 1303 | "engines": { 1304 | "node": ">=8" 1305 | } 1306 | }, 1307 | "node_modules/path-is-absolute": { 1308 | "version": "1.0.1", 1309 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1310 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1311 | "dev": true, 1312 | "license": "MIT", 1313 | "engines": { 1314 | "node": ">=0.10.0" 1315 | } 1316 | }, 1317 | "node_modules/path-key": { 1318 | "version": "3.1.1", 1319 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1320 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1321 | "dev": true, 1322 | "license": "MIT", 1323 | "engines": { 1324 | "node": ">=8" 1325 | } 1326 | }, 1327 | "node_modules/path-type": { 1328 | "version": "4.0.0", 1329 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 1330 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 1331 | "dev": true, 1332 | "license": "MIT", 1333 | "engines": { 1334 | "node": ">=8" 1335 | } 1336 | }, 1337 | "node_modules/picomatch": { 1338 | "version": "2.3.1", 1339 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1340 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1341 | "dev": true, 1342 | "license": "MIT", 1343 | "engines": { 1344 | "node": ">=8.6" 1345 | }, 1346 | "funding": { 1347 | "url": "https://github.com/sponsors/jonschlinkert" 1348 | } 1349 | }, 1350 | "node_modules/prelude-ls": { 1351 | "version": "1.2.1", 1352 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 1353 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 1354 | "dev": true, 1355 | "license": "MIT", 1356 | "engines": { 1357 | "node": ">= 0.8.0" 1358 | } 1359 | }, 1360 | "node_modules/punycode": { 1361 | "version": "2.3.1", 1362 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 1363 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 1364 | "dev": true, 1365 | "license": "MIT", 1366 | "engines": { 1367 | "node": ">=6" 1368 | } 1369 | }, 1370 | "node_modules/queue-microtask": { 1371 | "version": "1.2.3", 1372 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1373 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1374 | "dev": true, 1375 | "funding": [ 1376 | { 1377 | "type": "github", 1378 | "url": "https://github.com/sponsors/feross" 1379 | }, 1380 | { 1381 | "type": "patreon", 1382 | "url": "https://www.patreon.com/feross" 1383 | }, 1384 | { 1385 | "type": "consulting", 1386 | "url": "https://feross.org/support" 1387 | } 1388 | ], 1389 | "license": "MIT" 1390 | }, 1391 | "node_modules/resolve-from": { 1392 | "version": "4.0.0", 1393 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1394 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1395 | "dev": true, 1396 | "license": "MIT", 1397 | "engines": { 1398 | "node": ">=4" 1399 | } 1400 | }, 1401 | "node_modules/reusify": { 1402 | "version": "1.1.0", 1403 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", 1404 | "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", 1405 | "dev": true, 1406 | "license": "MIT", 1407 | "engines": { 1408 | "iojs": ">=1.0.0", 1409 | "node": ">=0.10.0" 1410 | } 1411 | }, 1412 | "node_modules/rimraf": { 1413 | "version": "3.0.2", 1414 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1415 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1416 | "deprecated": "Rimraf versions prior to v4 are no longer supported", 1417 | "dev": true, 1418 | "license": "ISC", 1419 | "dependencies": { 1420 | "glob": "^7.1.3" 1421 | }, 1422 | "bin": { 1423 | "rimraf": "bin.js" 1424 | }, 1425 | "funding": { 1426 | "url": "https://github.com/sponsors/isaacs" 1427 | } 1428 | }, 1429 | "node_modules/run-parallel": { 1430 | "version": "1.2.0", 1431 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1432 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1433 | "dev": true, 1434 | "funding": [ 1435 | { 1436 | "type": "github", 1437 | "url": "https://github.com/sponsors/feross" 1438 | }, 1439 | { 1440 | "type": "patreon", 1441 | "url": "https://www.patreon.com/feross" 1442 | }, 1443 | { 1444 | "type": "consulting", 1445 | "url": "https://feross.org/support" 1446 | } 1447 | ], 1448 | "license": "MIT", 1449 | "dependencies": { 1450 | "queue-microtask": "^1.2.2" 1451 | } 1452 | }, 1453 | "node_modules/semver": { 1454 | "version": "7.7.2", 1455 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", 1456 | "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", 1457 | "dev": true, 1458 | "license": "ISC", 1459 | "bin": { 1460 | "semver": "bin/semver.js" 1461 | }, 1462 | "engines": { 1463 | "node": ">=10" 1464 | } 1465 | }, 1466 | "node_modules/shebang-command": { 1467 | "version": "2.0.0", 1468 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1469 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1470 | "dev": true, 1471 | "license": "MIT", 1472 | "dependencies": { 1473 | "shebang-regex": "^3.0.0" 1474 | }, 1475 | "engines": { 1476 | "node": ">=8" 1477 | } 1478 | }, 1479 | "node_modules/shebang-regex": { 1480 | "version": "3.0.0", 1481 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1482 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1483 | "dev": true, 1484 | "license": "MIT", 1485 | "engines": { 1486 | "node": ">=8" 1487 | } 1488 | }, 1489 | "node_modules/slash": { 1490 | "version": "3.0.0", 1491 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 1492 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 1493 | "dev": true, 1494 | "license": "MIT", 1495 | "engines": { 1496 | "node": ">=8" 1497 | } 1498 | }, 1499 | "node_modules/strip-ansi": { 1500 | "version": "6.0.1", 1501 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1502 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1503 | "dev": true, 1504 | "license": "MIT", 1505 | "dependencies": { 1506 | "ansi-regex": "^5.0.1" 1507 | }, 1508 | "engines": { 1509 | "node": ">=8" 1510 | } 1511 | }, 1512 | "node_modules/strip-json-comments": { 1513 | "version": "3.1.1", 1514 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1515 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1516 | "dev": true, 1517 | "license": "MIT", 1518 | "engines": { 1519 | "node": ">=8" 1520 | }, 1521 | "funding": { 1522 | "url": "https://github.com/sponsors/sindresorhus" 1523 | } 1524 | }, 1525 | "node_modules/supports-color": { 1526 | "version": "7.2.0", 1527 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 1528 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 1529 | "dev": true, 1530 | "license": "MIT", 1531 | "dependencies": { 1532 | "has-flag": "^4.0.0" 1533 | }, 1534 | "engines": { 1535 | "node": ">=8" 1536 | } 1537 | }, 1538 | "node_modules/text-table": { 1539 | "version": "0.2.0", 1540 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1541 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 1542 | "dev": true, 1543 | "license": "MIT" 1544 | }, 1545 | "node_modules/to-regex-range": { 1546 | "version": "5.0.1", 1547 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1548 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1549 | "dev": true, 1550 | "license": "MIT", 1551 | "dependencies": { 1552 | "is-number": "^7.0.0" 1553 | }, 1554 | "engines": { 1555 | "node": ">=8.0" 1556 | } 1557 | }, 1558 | "node_modules/ts-api-utils": { 1559 | "version": "1.4.3", 1560 | "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", 1561 | "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", 1562 | "dev": true, 1563 | "license": "MIT", 1564 | "engines": { 1565 | "node": ">=16" 1566 | }, 1567 | "peerDependencies": { 1568 | "typescript": ">=4.2.0" 1569 | } 1570 | }, 1571 | "node_modules/type-check": { 1572 | "version": "0.4.0", 1573 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 1574 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 1575 | "dev": true, 1576 | "license": "MIT", 1577 | "dependencies": { 1578 | "prelude-ls": "^1.2.1" 1579 | }, 1580 | "engines": { 1581 | "node": ">= 0.8.0" 1582 | } 1583 | }, 1584 | "node_modules/type-fest": { 1585 | "version": "0.20.2", 1586 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 1587 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 1588 | "dev": true, 1589 | "license": "(MIT OR CC0-1.0)", 1590 | "engines": { 1591 | "node": ">=10" 1592 | }, 1593 | "funding": { 1594 | "url": "https://github.com/sponsors/sindresorhus" 1595 | } 1596 | }, 1597 | "node_modules/typescript": { 1598 | "version": "5.8.3", 1599 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", 1600 | "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", 1601 | "dev": true, 1602 | "license": "Apache-2.0", 1603 | "bin": { 1604 | "tsc": "bin/tsc", 1605 | "tsserver": "bin/tsserver" 1606 | }, 1607 | "engines": { 1608 | "node": ">=14.17" 1609 | } 1610 | }, 1611 | "node_modules/uri-js": { 1612 | "version": "4.4.1", 1613 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1614 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1615 | "dev": true, 1616 | "license": "BSD-2-Clause", 1617 | "dependencies": { 1618 | "punycode": "^2.1.0" 1619 | } 1620 | }, 1621 | "node_modules/which": { 1622 | "version": "2.0.2", 1623 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1624 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1625 | "dev": true, 1626 | "license": "ISC", 1627 | "dependencies": { 1628 | "isexe": "^2.0.0" 1629 | }, 1630 | "bin": { 1631 | "node-which": "bin/node-which" 1632 | }, 1633 | "engines": { 1634 | "node": ">= 8" 1635 | } 1636 | }, 1637 | "node_modules/word-wrap": { 1638 | "version": "1.2.5", 1639 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 1640 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 1641 | "dev": true, 1642 | "license": "MIT", 1643 | "engines": { 1644 | "node": ">=0.10.0" 1645 | } 1646 | }, 1647 | "node_modules/wrappy": { 1648 | "version": "1.0.2", 1649 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1650 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1651 | "dev": true, 1652 | "license": "ISC" 1653 | }, 1654 | "node_modules/yocto-queue": { 1655 | "version": "0.1.0", 1656 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1657 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1658 | "dev": true, 1659 | "license": "MIT", 1660 | "engines": { 1661 | "node": ">=10" 1662 | }, 1663 | "funding": { 1664 | "url": "https://github.com/sponsors/sindresorhus" 1665 | } 1666 | } 1667 | } 1668 | } 1669 | -------------------------------------------------------------------------------- /e2e/projects/simple/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "simple", 3 | "private": true, 4 | "scripts": { 5 | "test": "echo \"Error: no test specified\" && exit 1" 6 | }, 7 | "devDependencies": { 8 | "@typescript-eslint/parser": "7.12.0", 9 | "eslint": "8.57.1", 10 | "typescript": "5.8.3" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /e2e/projects/simple/to-be-ignored.ts: -------------------------------------------------------------------------------- 1 | export const x = 1 2 | -------------------------------------------------------------------------------- /e2e/projects/simple/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "commonjs", 5 | "plugins": [ 6 | { "name": "typescript-eslint-language-service" } 7 | ] 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /e2e/projects/ts-eslint-plugin/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | es6: true, 5 | node: true, 6 | }, 7 | extends: ["plugin:@typescript-eslint/recommended"], 8 | parser: "@typescript-eslint/parser", 9 | parserOptions: { 10 | sourceType: "module", 11 | project: "./tsconfig.json", 12 | }, 13 | plugins: ["@typescript-eslint"], 14 | rules: { 15 | "dot-notation": "off", 16 | "no-implied-eval": "off", 17 | "@typescript-eslint/explicit-module-boundary-types": "off", 18 | "@typescript-eslint/no-unused-vars": "error", 19 | 20 | // issue 217 21 | "@typescript-eslint/await-thenable": "error", 22 | "@typescript-eslint/no-base-to-string": "error", 23 | "@typescript-eslint/no-confusing-void-expression": "error", 24 | "@typescript-eslint/dot-notation": ["error"], 25 | "@typescript-eslint/no-implied-eval": ["error"], 26 | }, 27 | }; 28 | -------------------------------------------------------------------------------- /e2e/projects/ts-eslint-plugin/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "typescript.tsdk": "node_modules/typescript/lib" 3 | } -------------------------------------------------------------------------------- /e2e/projects/ts-eslint-plugin/main.ts: -------------------------------------------------------------------------------- 1 | export function hoge() { 2 | const a = 1; 3 | return 200; 4 | } 5 | -------------------------------------------------------------------------------- /e2e/projects/ts-eslint-plugin/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ts-recommended", 3 | "private": true, 4 | "scripts": { 5 | "test": "echo \"Error: no test specified\" && exit 1" 6 | }, 7 | "devDependencies": { 8 | "@typescript-eslint/eslint-plugin": "7.12.0", 9 | "@typescript-eslint/parser": "7.12.0", 10 | "eslint": "8.57.1", 11 | "typescript": "5.8.3" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /e2e/projects/ts-eslint-plugin/reproduce_issue_217/main.ts: -------------------------------------------------------------------------------- 1 | export async function useInvalidAwait() { 2 | await "value"; 3 | } 4 | 5 | export function useImpliedEval() { 6 | setTimeout("alert(`Hi!`);", 100); 7 | } 8 | 9 | export function unexpectedToStringResult() { 10 | return "" + {}; 11 | } 12 | 13 | export function useUnneededIndexSignature() { 14 | const obj = { prop: 100 }; 15 | return obj["prop"]; 16 | } 17 | 18 | export function useVoid() { 19 | const res = alert("Are you sure?"); 20 | return res; 21 | } 22 | -------------------------------------------------------------------------------- /e2e/projects/ts-eslint-plugin/reproduce_issue_7/main.ts: -------------------------------------------------------------------------------- 1 | import { Hoge } from "./types"; 2 | export const hoge: Hoge = { }; 3 | -------------------------------------------------------------------------------- /e2e/projects/ts-eslint-plugin/reproduce_issue_7/types.ts: -------------------------------------------------------------------------------- 1 | export type Hoge = { }; 2 | -------------------------------------------------------------------------------- /e2e/projects/ts-eslint-plugin/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "commonjs", 5 | "plugins": [ 6 | { "name": "typescript-eslint-language-service" } 7 | ] 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /e2e/setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | BASE_DIR=$(cd $(dirname $0); pwd) 4 | npm link 5 | 6 | TS_VER=$(node -e "console.log(require('./package.json').devDependencies['typescript'])") 7 | TSESLINT_VER=$(node -e "console.log(require('./package.json').devDependencies['@typescript-eslint/parser'])") 8 | 9 | for dir in $(ls ${BASE_DIR}/projects); do 10 | pushd ${BASE_DIR}/projects/${dir} 11 | cat << EOF | node > PKG 12 | const json = require('./package.json'); 13 | const ret = { 14 | ...json, 15 | devDependencies: Object.keys(json.devDependencies).reduce((acc, k) => { 16 | if (k === 'typescript') { 17 | return { ...acc, typescript: "${TS_VER}" }; 18 | } 19 | if (k.startsWith('@typescript-eslint')) { 20 | return { ...acc, [k]: "${TSESLINT_VER}" }; 21 | } 22 | return acc; 23 | }, json.devDependencies), 24 | }; 25 | console.log(JSON.stringify(ret, null, 2)); 26 | EOF 27 | mv PKG package.json 28 | npm i 29 | npm link typescript-eslint-language-service 30 | popd 31 | done 32 | -------------------------------------------------------------------------------- /e2e/test/__snapshots__/e2e.test.ts.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`LanguageService plugin #getCodeFixes should return codeFixes reported by ESLint rules 1`] = ` 4 | { 5 | "body": [ 6 | { 7 | "changes": [ 8 | { 9 | "fileName": "", 10 | "textChanges": [ 11 | { 12 | "end": { 13 | "line": 1, 14 | "offset": 12, 15 | }, 16 | "newText": ";", 17 | "start": { 18 | "line": 1, 19 | "offset": 12, 20 | }, 21 | }, 22 | ], 23 | }, 24 | ], 25 | "description": "Fix: Missing semicolon.", 26 | "fixId": "semi", 27 | "fixName": "", 28 | }, 29 | ], 30 | "command": "getCodeFixes", 31 | "request_seq": 2, 32 | "seq": 0, 33 | "success": true, 34 | "type": "response", 35 | } 36 | `; 37 | 38 | exports[`LanguageService plugin #getSemanticDiagnostics should not reproduce issue #7 1`] = ` 39 | { 40 | "body": { 41 | "diagnostics": [], 42 | "file": "", 43 | }, 44 | "event": "semanticDiag", 45 | "seq": 0, 46 | "type": "event", 47 | } 48 | `; 49 | 50 | exports[`LanguageService plugin #getSemanticDiagnostics should not reproduce issue 217 1`] = ` 51 | { 52 | "body": { 53 | "diagnostics": [ 54 | { 55 | "category": "error", 56 | "code": 30010, 57 | "end": { 58 | "line": 2, 59 | "offset": 16, 60 | }, 61 | "start": { 62 | "line": 2, 63 | "offset": 3, 64 | }, 65 | "text": "[@typescript-eslint/await-thenable] Unexpected \`await\` of a non-Promise (non-"Thenable") value.", 66 | }, 67 | { 68 | "category": "error", 69 | "code": 30010, 70 | "end": { 71 | "line": 6, 72 | "offset": 29, 73 | }, 74 | "start": { 75 | "line": 6, 76 | "offset": 14, 77 | }, 78 | "text": "[@typescript-eslint/no-implied-eval] Implied eval. Consider passing a function.", 79 | }, 80 | { 81 | "category": "error", 82 | "code": 30010, 83 | "end": { 84 | "line": 10, 85 | "offset": 17, 86 | }, 87 | "start": { 88 | "line": 10, 89 | "offset": 15, 90 | }, 91 | "text": "[@typescript-eslint/no-base-to-string] '{}' will evaluate to '[object Object]' when stringified.", 92 | }, 93 | { 94 | "category": "error", 95 | "code": 30010, 96 | "end": { 97 | "line": 15, 98 | "offset": 20, 99 | }, 100 | "start": { 101 | "line": 15, 102 | "offset": 14, 103 | }, 104 | "text": "[@typescript-eslint/dot-notation] ["prop"] is better written in dot notation.", 105 | }, 106 | { 107 | "category": "error", 108 | "code": 30010, 109 | "end": { 110 | "line": 19, 111 | "offset": 37, 112 | }, 113 | "start": { 114 | "line": 19, 115 | "offset": 15, 116 | }, 117 | "text": "[@typescript-eslint/no-confusing-void-expression] Placing a void expression inside another expression is forbidden. Move it to its own statement instead.", 118 | }, 119 | ], 120 | "file": "", 121 | }, 122 | "event": "semanticDiag", 123 | "seq": 0, 124 | "type": "event", 125 | } 126 | `; 127 | 128 | exports[`LanguageService plugin #getSemanticDiagnostics should not return ESLint error when the project does not use @typescript-eslint/parser 1`] = ` 129 | { 130 | "body": { 131 | "diagnostics": [], 132 | "file": "", 133 | }, 134 | "event": "semanticDiag", 135 | "seq": 0, 136 | "type": "event", 137 | } 138 | `; 139 | 140 | exports[`LanguageService plugin #getSemanticDiagnostics should return ESLint error when the project is configured with ESLint plugins 1`] = ` 141 | { 142 | "body": { 143 | "diagnostics": [ 144 | { 145 | "category": "error", 146 | "code": 30010, 147 | "end": { 148 | "line": 2, 149 | "offset": 10, 150 | }, 151 | "start": { 152 | "line": 2, 153 | "offset": 9, 154 | }, 155 | "text": "[@typescript-eslint/no-unused-vars] 'a' is assigned a value but never used.", 156 | }, 157 | ], 158 | "file": "", 159 | }, 160 | "event": "semanticDiag", 161 | "seq": 0, 162 | "type": "event", 163 | } 164 | `; 165 | 166 | exports[`LanguageService plugin #getSemanticDiagnostics should return ESLint error when the project uses @typescript-eslint/parser 1`] = ` 167 | { 168 | "body": { 169 | "diagnostics": [ 170 | { 171 | "category": "error", 172 | "code": 30010, 173 | "end": { 174 | "line": 1, 175 | "offset": 13, 176 | }, 177 | "start": { 178 | "line": 1, 179 | "offset": 12, 180 | }, 181 | "text": "[semi] Missing semicolon.", 182 | }, 183 | ], 184 | "file": "", 185 | }, 186 | "event": "semanticDiag", 187 | "seq": 0, 188 | "type": "event", 189 | } 190 | `; 191 | 192 | exports[`LanguageService plugin #getSemanticDiagnostics should return ESLint error when the project uses @typescript-eslint/parser and be configured with 'eslint:recommended' 1`] = ` 193 | { 194 | "body": { 195 | "diagnostics": [ 196 | { 197 | "category": "error", 198 | "code": 30010, 199 | "end": { 200 | "line": 1, 201 | "offset": 10, 202 | }, 203 | "start": { 204 | "line": 1, 205 | "offset": 1, 206 | }, 207 | "text": "[no-debugger] Unexpected 'debugger' statement.", 208 | }, 209 | ], 210 | "file": "", 211 | }, 212 | "event": "semanticDiag", 213 | "seq": 0, 214 | "type": "event", 215 | } 216 | `; 217 | -------------------------------------------------------------------------------- /e2e/test/e2e.test.ts: -------------------------------------------------------------------------------- 1 | import path from "path"; 2 | import assert from "assert"; 3 | import ts from "typescript/lib/tsserverlibrary"; 4 | import { createServer, TSServer } from "../helper/server"; 5 | 6 | function findEventResponse(responses: any[], eventName: string) { 7 | return responses.find(response => response.event === eventName); 8 | } 9 | 10 | function findCommandResponse(responses: any[], commandName: string) { 11 | return responses.find(response => response.command === commandName); 12 | } 13 | 14 | function maskFileNameForDiagnostics(result: ts.server.protocol.DiagnosticEvent) { 15 | if (!result.body) return result; 16 | result.body.file = ""; 17 | return result; 18 | } 19 | 20 | function maskFileNameForCodeFixes(response: ts.server.protocol.CodeFixResponse) { 21 | if (!response.body) return response; 22 | response.body = response.body.map(b => { 23 | b.fixName = ""; 24 | b.changes = b.changes.map(c => { 25 | c.fileName = ""; 26 | return c; 27 | }); 28 | return b; 29 | }); 30 | return response; 31 | } 32 | 33 | describe("LanguageService plugin", () => { 34 | let server: TSServer; 35 | 36 | afterEach(async () => { 37 | if (server) await server.close(); 38 | }); 39 | describe("#getSemanticDiagnostics", () => { 40 | it("should not return ESLint error when the project does not use @typescript-eslint/parser", async () => { 41 | server = createServer({ projectPath: path.resolve(__dirname, "../projects/other-parser") }); 42 | const { file, fileContent } = server.readFile("./main.ts"); 43 | server.send({ command: "open", arguments: { file, fileContent, scriptKindName: "TS" } }); 44 | await server.waitEvent("projectLoadingFinish"); 45 | server.send({ command: "geterr", arguments: { files: [file], delay: 0 } }); 46 | await server.waitEvent("semanticDiag"); 47 | const found = findEventResponse(server.responses, "semanticDiag"); 48 | if (!found) { 49 | throw new assert.AssertionError(); 50 | } 51 | expect(maskFileNameForDiagnostics(found)).toMatchSnapshot(); 52 | }); 53 | 54 | it("should return ESLint error when the project uses @typescript-eslint/parser", async () => { 55 | server = createServer({ projectPath: path.resolve(__dirname, "../projects/simple") }); 56 | const { file, fileContent } = server.readFile("./main.ts"); 57 | server.send({ command: "open", arguments: { file, fileContent, scriptKindName: "TS" } }); 58 | await server.waitEvent("projectLoadingFinish"); 59 | server.send({ command: "geterr", arguments: { files: [file], delay: 0 } }); 60 | await server.waitEvent("semanticDiag"); 61 | const found = findEventResponse(server.responses, "semanticDiag"); 62 | if (!found) { 63 | throw new assert.AssertionError(); 64 | } 65 | expect(maskFileNameForDiagnostics(found)).toMatchSnapshot(); 66 | }); 67 | 68 | it("should return ESLint error when the project uses @typescript-eslint/parser and be configured with 'eslint:recommended'", async () => { 69 | server = createServer({ projectPath: path.resolve(__dirname, "../projects/eslint-recommended") }); 70 | const { file, fileContent } = server.readFile("./main.ts"); 71 | server.send({ command: "open", arguments: { file, fileContent, scriptKindName: "TS" } }); 72 | await server.waitEvent("projectLoadingFinish"); 73 | server.send({ command: "geterr", arguments: { files: [file], delay: 0 } }); 74 | await server.waitEvent("semanticDiag"); 75 | const found = findEventResponse(server.responses, "semanticDiag"); 76 | if (!found) { 77 | throw new assert.AssertionError(); 78 | } 79 | expect(maskFileNameForDiagnostics(found)).toMatchSnapshot(); 80 | }); 81 | 82 | it("should return ESLint error when the project is configured with ESLint plugins", async () => { 83 | server = createServer({ projectPath: path.resolve(__dirname, "../projects/ts-eslint-plugin") }); 84 | const { file, fileContent } = server.readFile("./main.ts"); 85 | server.send({ command: "open", arguments: { file, fileContent, scriptKindName: "TS" } }); 86 | await server.waitEvent("projectLoadingFinish"); 87 | server.send({ command: "geterr", arguments: { files: [file], delay: 0 } }); 88 | await server.waitEvent("semanticDiag"); 89 | const found = findEventResponse(server.responses, "semanticDiag"); 90 | if (!found) { 91 | throw new assert.AssertionError(); 92 | } 93 | expect(maskFileNameForDiagnostics(found)).toMatchSnapshot(); 94 | }); 95 | 96 | it("should not reproduce issue #7", async () => { 97 | server = createServer({ projectPath: path.resolve(__dirname, "../projects/ts-eslint-plugin") }); 98 | const { file, fileContent } = server.readFile("./reproduce_issue_7/main.ts"); 99 | server.send({ command: "open", arguments: { file, fileContent, scriptKindName: "TS" } }); 100 | await server.waitEvent("projectLoadingFinish"); 101 | server.send({ command: "geterr", arguments: { files: [file], delay: 0 } }); 102 | await server.waitEvent("semanticDiag"); 103 | const found = findEventResponse(server.responses, "semanticDiag"); 104 | if (!found) { 105 | throw new assert.AssertionError(); 106 | } 107 | expect(maskFileNameForDiagnostics(found)).toMatchSnapshot(); 108 | }); 109 | 110 | it("should not reproduce issue 217", async () => { 111 | server = createServer({ projectPath: path.resolve(__dirname, "../projects/ts-eslint-plugin") }); 112 | const { file, fileContent } = server.readFile("./reproduce_issue_217/main.ts"); 113 | server.send({ command: "open", arguments: { file, fileContent, scriptKindName: "TS" } }); 114 | await server.waitEvent("projectLoadingFinish"); 115 | server.send({ command: "geterr", arguments: { files: [file], delay: 0 } }); 116 | await server.waitEvent("semanticDiag"); 117 | const found = findEventResponse(server.responses, "semanticDiag"); 118 | if (!found) { 119 | throw new assert.AssertionError(); 120 | } 121 | expect(maskFileNameForDiagnostics(found)).toMatchSnapshot(); 122 | }); 123 | }); 124 | 125 | describe("#getCodeFixes", () => { 126 | it("should return codeFixes reported by ESLint rules", async () => { 127 | server = createServer({ projectPath: path.resolve(__dirname, "../projects/simple") }); 128 | const { file, fileContent } = server.readFile("./main.ts"); 129 | server.send({ command: "open", arguments: { file, fileContent, scriptKindName: "TS" } }); 130 | await server.waitEvent("projectLoadingFinish"); 131 | server.send({ 132 | command: "getCodeFixes", 133 | arguments: { file, startLine: 1, startOffset: 12, endLine: 1, endOffset: 12, errorCodes: [30010] }, 134 | }); 135 | await server.waitResponse("getCodeFixes"); 136 | const found = findCommandResponse(server.responses, "getCodeFixes"); 137 | if (!found) { 138 | throw new assert.AssertionError(); 139 | } 140 | expect(maskFileNameForCodeFixes(found)).toMatchSnapshot(); 141 | }); 142 | }); 143 | }); 144 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "typescript-eslint-language-service", 3 | "version": "5.0.5", 4 | "description": "TypeScript language service plugin for ESLint", 5 | "main": "lib/index.js", 6 | "files": [ 7 | "lib" 8 | ], 9 | "scripts": { 10 | "clean": "rimraf -g local lib \"e2e/**/*.log\"", 11 | "build": "tsc -p tsconfig.build.json", 12 | "build:local": "tsc -p tsconfig.build.json --outDir local", 13 | "lint": "eslint \"src/**/*.ts\" \"e2e/**/*.ts\"", 14 | "test": "jest", 15 | "prettier": "prettier \"*.md\" \"*.json\" \"*.yml\" \"src/**/*\" \"e2e/**/*\"", 16 | "format": "npm run prettier -- --write", 17 | "format:check": "npm run prettier -- --check", 18 | "e2e": "jest --config e2e/jest.config.json", 19 | "prepare": "husky install" 20 | }, 21 | "repository": { 22 | "type": "git", 23 | "url": "git+https://github.com/Quramy/typescript-eslint-language-service.git" 24 | }, 25 | "keywords": [ 26 | "TypeScript", 27 | "ESLint" 28 | ], 29 | "author": "Quramy", 30 | "license": "MIT", 31 | "bugs": { 32 | "url": "https://github.com/Quramy/typescript-eslint-language-service/issues" 33 | }, 34 | "peerDependencies": { 35 | "@typescript-eslint/parser": ">= 5.0.0", 36 | "eslint": ">= 8.0.0", 37 | "typescript": ">= 4.0.0" 38 | }, 39 | "homepage": "https://github.com/Quramy/typescript-eslint-language-service#readme", 40 | "devDependencies": { 41 | "@types/eslint": "8.56.12", 42 | "@types/estree": "1.0.8", 43 | "@types/jest": "29.5.14", 44 | "@types/node": "20.19.0", 45 | "@typescript-eslint/eslint-plugin": "7.12.0", 46 | "@typescript-eslint/parser": "7.12.0", 47 | "eslint": "8.57.1", 48 | "eslint-config-prettier": "9.1.0", 49 | "fretted-strings": "2.0.0", 50 | "husky": "9.1.7", 51 | "jest": "29.7.0", 52 | "prettier": "3.5.3", 53 | "pretty-quick": "4.2.2", 54 | "rimraf": "5.0.10", 55 | "ts-jest": "29.3.4", 56 | "typescript": "5.8.3" 57 | }, 58 | "jest": { 59 | "transform": { 60 | "^.+\\.ts$": "ts-jest" 61 | }, 62 | "testRegex": "(src/.*\\.test)\\.ts$", 63 | "testPathIgnorePatterns": [ 64 | "/node_modules/", 65 | "\\.d\\.ts$", 66 | "lib/.*" 67 | ], 68 | "moduleFileExtensions": [ 69 | "js", 70 | "ts", 71 | "json" 72 | ] 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "automerge": true, 3 | "automergeType": "branch", 4 | "extends": ["config:base"], 5 | "lockFileMaintenance": { "enabled": true }, 6 | "major": { 7 | "automerge": false 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/__snapshots__/eslint-adapter.test.ts.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`ESLintAdapter #getCodeFixesAtPosition shuld only delegate when input errorCodes does not include TS_LANGSERVICE_ESLINT_DIAGNOSTIC_ERROR_CODE 1`] = `[]`; 4 | 5 | exports[`ESLintAdapter #getCodeFixesAtPosition shuld only delegate when input range isn't intersected ESLint reported results 1`] = `[]`; 6 | 7 | exports[`ESLintAdapter #getCodeFixesAtPosition shuld return ESLint sourceCodeFixer result as TypeScript codeFixAction format 1`] = ` 8 | [ 9 | { 10 | "changes": [ 11 | { 12 | "fileName": "main.ts", 13 | "isNewFile": false, 14 | "textChanges": [ 15 | { 16 | "newText": ""use strict"", 17 | "span": { 18 | "length": 12, 19 | "start": 11, 20 | }, 21 | }, 22 | ], 23 | }, 24 | ], 25 | "description": "Fix: Strings must use doublequote.", 26 | "fixId": "quotes", 27 | "fixName": "quotes", 28 | }, 29 | ] 30 | `; 31 | 32 | exports[`ESLintAdapter #getSemanticDiagnostics shuld return ESLint verification result as TypeScript diagnostic format 1`] = ` 33 | [ 34 | { 35 | "category": 1, 36 | "code": 30010, 37 | "length": 0, 38 | "messageText": "[semi] Missing semicolon.", 39 | "start": 11, 40 | }, 41 | ] 42 | `; 43 | -------------------------------------------------------------------------------- /src/consts.ts: -------------------------------------------------------------------------------- 1 | export const TS_LANGSERVICE_ESLINT_DIAGNOSTIC_ERROR_CODE = 30010; 2 | -------------------------------------------------------------------------------- /src/errors.ts: -------------------------------------------------------------------------------- 1 | export class InvalidParserError extends Error { 2 | public constructor() { 3 | super("use '@typescript-eslint/parser'"); 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /src/eslint-adapter.test.ts: -------------------------------------------------------------------------------- 1 | import path from "path"; 2 | import ts from "typescript"; 3 | import extract from "fretted-strings"; 4 | import { ESLintAdapter } from "./eslint-adapter"; 5 | import { ConfigProvider } from "./eslint-config-provider"; 6 | import { Legacy } from "@eslint/eslintrc"; 7 | import type { ConfigArray } from "@eslint/eslintrc"; 8 | import { TS_LANGSERVICE_ESLINT_DIAGNOSTIC_ERROR_CODE } from "./consts"; 9 | 10 | class TestingConfigProvider implements ConfigProvider { 11 | public conf: any = { 12 | parser: new Legacy.ConfigDependency({ 13 | definition: require("@typescript-eslint/parser"), 14 | error: null, 15 | id: "@typescript-eslint/parser", 16 | filePath: path.resolve(__dirname, "../node_modules/@typescript-eslint/parser/dist/parser.js"), 17 | }), 18 | parserOptions: { ecmaVersion: "latest" }, 19 | }; 20 | public getConfigArrayForFile(): ConfigArray { 21 | return new Legacy.ConfigArray(this.conf); 22 | } 23 | } 24 | 25 | // `diagnostic.file` is so noisy for snapshot test 26 | function filterSourceFileFromDiagnosticList(diagnostics: ts.Diagnostic[]) { 27 | return diagnostics.map(d => { 28 | delete d.file; 29 | return d; 30 | }); 31 | } 32 | 33 | describe("ESLintAdapter", () => { 34 | describe("#getSemanticDiagnostics", () => { 35 | it("shuld return ESLint verification result as TypeScript diagnostic format", () => { 36 | const configProvider = new TestingConfigProvider(); 37 | configProvider.conf.rules = { 38 | semi: 2, 39 | }; 40 | const adapter = new ESLintAdapter({ 41 | getSourceFile: () => ts.createSourceFile("main.ts", "const x = 1", ts.ScriptTarget.ESNext, true), 42 | configProvider, 43 | logger: () => {}, 44 | }); 45 | const diagnostics = filterSourceFileFromDiagnosticList(adapter.getSemanticDiagnostics(() => [], "main.ts")); 46 | expect(diagnostics).toMatchSnapshot(); 47 | }); 48 | }); 49 | 50 | describe("#getCodeFixesAtPosition", () => { 51 | it("shuld only delegate when input errorCodes does not include TS_LANGSERVICE_ESLINT_DIAGNOSTIC_ERROR_CODE", () => { 52 | const configProvider = new TestingConfigProvider(); 53 | configProvider.conf.rules = { 54 | quotes: [2, "double"], 55 | }; 56 | const [content, frets] = extract( 57 | ` 58 | 'use strict'; 59 | %%% ^ ^ %%% 60 | %%% p1 p2 %%% 61 | `, 62 | ); 63 | const adapter = new ESLintAdapter({ 64 | getSourceFile: () => ts.createSourceFile("main.ts", content, ts.ScriptTarget.ESNext, true), 65 | configProvider, 66 | logger: () => {}, 67 | }); 68 | const codeFixes = adapter.getCodeFixesAtPosition(() => [], "main.ts", frets.p1.pos, frets.p2.pos, [], {}, {}); 69 | expect(codeFixes).toMatchSnapshot(); 70 | }); 71 | 72 | it("shuld only delegate when input range isn't intersected ESLint reported results", () => { 73 | const configProvider = new TestingConfigProvider(); 74 | configProvider.conf.rules = { 75 | quotes: [2, "double"], 76 | }; 77 | const [content, frets] = extract( 78 | ` 79 | 'use strict'; 80 | 81 | const hoge = 1; 82 | %%% ^ ^ %%% 83 | %%% p1 p2 %%% 84 | `, 85 | ); 86 | const adapter = new ESLintAdapter({ 87 | getSourceFile: () => ts.createSourceFile("main.ts", content, ts.ScriptTarget.ESNext, true), 88 | configProvider, 89 | logger: () => {}, 90 | }); 91 | const codeFixes = adapter.getCodeFixesAtPosition( 92 | () => [], 93 | "main.ts", 94 | frets.p1.pos, 95 | frets.p2.pos, 96 | [TS_LANGSERVICE_ESLINT_DIAGNOSTIC_ERROR_CODE], 97 | {}, 98 | {}, 99 | ); 100 | expect(codeFixes).toMatchSnapshot(); 101 | }); 102 | 103 | it("shuld return ESLint sourceCodeFixer result as TypeScript codeFixAction format", () => { 104 | const configProvider = new TestingConfigProvider(); 105 | configProvider.conf.rules = { 106 | quotes: [2, "double"], 107 | }; 108 | const [content, frets] = extract( 109 | ` 110 | 'use strict'; 111 | %%% ^ ^ %%% 112 | %%% p1 p2 %%% 113 | `, 114 | ); 115 | const adapter = new ESLintAdapter({ 116 | getSourceFile: () => ts.createSourceFile("main.ts", content, ts.ScriptTarget.ESNext, true), 117 | configProvider, 118 | logger: () => {}, 119 | }); 120 | const codeFixes = adapter.getCodeFixesAtPosition( 121 | () => [], 122 | "main.ts", 123 | frets.p1.pos, 124 | frets.p2.pos, 125 | [TS_LANGSERVICE_ESLINT_DIAGNOSTIC_ERROR_CODE], 126 | {}, 127 | {}, 128 | ); 129 | expect(codeFixes).toMatchSnapshot(); 130 | }); 131 | }); 132 | }); 133 | -------------------------------------------------------------------------------- /src/eslint-adapter.ts: -------------------------------------------------------------------------------- 1 | import path from "path"; 2 | import ts from "typescript"; 3 | import { SourceCode, Linter, ESLint } from "eslint"; 4 | import { parseForESLint, type ParserOptions } from "@typescript-eslint/parser"; 5 | 6 | import { InvalidParserError } from "./errors"; 7 | import { ConfigProvider } from "./eslint-config-provider"; 8 | import { TS_LANGSERVICE_ESLINT_DIAGNOSTIC_ERROR_CODE } from "./consts"; 9 | 10 | export function translateToDiagnosticsFromESLintResult( 11 | result: Linter.LintMessage[], 12 | sourceFile: ts.SourceFile, 13 | ): ts.Diagnostic[] { 14 | return result.map(({ message, severity, ruleId, line, column, endLine, endColumn }) => { 15 | const messageText = `[${ruleId}] ${message}`; 16 | 17 | const category: ts.DiagnosticCategory = 18 | severity === 2 19 | ? ts.DiagnosticCategory.Error 20 | : severity === 1 21 | ? ts.DiagnosticCategory.Warning 22 | : ts.DiagnosticCategory.Suggestion; 23 | 24 | /** 25 | * ESLint uses 1-started index. On the other hand, TypeScript 0-started index. 26 | * So we should minus from ESLint result's row/column to create TypeScript position. 27 | */ 28 | const start = ts.getPositionOfLineAndCharacter(sourceFile, line - 1, column - 1); 29 | const end = endLine && endColumn ? ts.getPositionOfLineAndCharacter(sourceFile, endLine - 1, endColumn - 1) : start; 30 | const length = Math.max(0, end - start); 31 | 32 | const diagnostic: ts.Diagnostic = { 33 | file: sourceFile, 34 | category, 35 | code: TS_LANGSERVICE_ESLINT_DIAGNOSTIC_ERROR_CODE, 36 | messageText, 37 | start, 38 | length, 39 | }; 40 | 41 | return diagnostic; 42 | }); 43 | } 44 | 45 | export function isIntersect( 46 | message: Linter.LintMessage, 47 | range: { start: number; end: number }, 48 | sourceFile: ts.SourceFile, 49 | ) { 50 | const { line, column, endLine, endColumn } = message; 51 | const mStart = ts.getPositionOfLineAndCharacter(sourceFile, line - 1, column - 1); 52 | const mEnd = endLine && endColumn ? ts.getPositionOfLineAndCharacter(sourceFile, endLine - 1, endColumn - 1) : mStart; 53 | return !(mEnd < range.start || mStart > range.end); 54 | } 55 | 56 | export function translateToCodeFixesFromESLintResult( 57 | result: Linter.LintMessage[], 58 | fileName: string, 59 | ): ts.CodeFixAction[] { 60 | return result.reduce((acc, { message, ruleId, fix }) => { 61 | if (!fix) { 62 | return acc; 63 | } 64 | const rid = ruleId || "eslint"; 65 | const rangeStart = fix.range[0]; 66 | const rangeLength = fix.range[1] ? fix.range[1] - fix.range[0] : 0; 67 | const codeFixAction: ts.CodeFixAction = { 68 | description: `Fix: ${message}`, 69 | fixId: rid, 70 | fixName: rid, 71 | changes: [ 72 | { 73 | fileName, 74 | isNewFile: false, 75 | textChanges: [ 76 | { 77 | span: { 78 | start: rangeStart, 79 | length: rangeLength, 80 | }, 81 | newText: fix.text, 82 | }, 83 | ], 84 | }, 85 | ], 86 | }; 87 | return [...acc, codeFixAction]; 88 | }, [] as ts.CodeFixAction[]); 89 | } 90 | 91 | export type ESLintAdapterOptions = { 92 | logger: (msg: string) => void; 93 | getSourceFile: (fileName: string) => ts.SourceFile | undefined; 94 | configProvider: ConfigProvider; 95 | }; 96 | 97 | export class ESLintAdapter { 98 | private readonly linter: Linter; 99 | private readonly logger: (msg: string) => void; 100 | private readonly configProvider: ConfigProvider; 101 | private readonly getSourceFile: (fileName: string) => ts.SourceFile | undefined; 102 | private readonly ignoredFilepathMap: Map; 103 | 104 | public constructor({ logger, configProvider, getSourceFile }: ESLintAdapterOptions) { 105 | this.linter = new Linter(); 106 | this.logger = logger; 107 | this.configProvider = configProvider; 108 | this.getSourceFile = getSourceFile; 109 | this.ignoredFilepathMap = new Map(); 110 | } 111 | 112 | private convertToESLintSourceCode(src: ts.SourceFile, filename: string, options?: ParserOptions | null) { 113 | const code = src.getFullText(); 114 | const originalOpt = options ?? {}; 115 | const { ast, scopeManager, services, visitorKeys } = parseForESLint(code, { 116 | ...originalOpt, 117 | filePath: filename, 118 | comment: true, 119 | loc: true, 120 | range: true, 121 | tokens: true, 122 | warnOnUnsupportedTypeScriptVersion: false, 123 | }); 124 | const source = new SourceCode({ 125 | text: code, 126 | ast, 127 | scopeManager, 128 | parserServices: services, 129 | visitorKeys, 130 | } as unknown as any); 131 | return source; 132 | } 133 | 134 | private getESLintResult(fileName: string, sourceFile: ts.SourceFile) { 135 | if (this.ignoredFilepathMap.get(fileName) === true) return []; 136 | const configArray = this.configProvider.getConfigArrayForFile(fileName); 137 | const configFileContent = configArray.extractConfig(fileName).toCompatibleObjectAsConfigFileContent(); 138 | if (!isParserModuleNameValid(configFileContent.parser, path.join("@typescript-eslint", "parser"))) { 139 | throw new InvalidParserError(); 140 | } 141 | const parserOptions = (configFileContent.parserOptions ? configFileContent.parserOptions : {}) as ParserOptions; 142 | const sourceCode = this.convertToESLintSourceCode(sourceFile, fileName, parserOptions); 143 | 144 | // See https://github.com/eslint/eslint/blob/v6.1.0/lib/linter/linter.js#L1130 145 | return this.linter.verify(sourceCode, configArray as any, { filename: fileName }); 146 | } 147 | 148 | public checkFileToBeIgnored(fileName: string) { 149 | if (fileName.indexOf("node_modules" + path.sep) !== -1) return; 150 | if (!fileName.endsWith(".ts") && !fileName.endsWith(".tsx")) return; 151 | Promise.resolve() 152 | .then(() => new ESLint()) 153 | .then(eslint => eslint.isPathIgnored(fileName)) 154 | .then(result => this.ignoredFilepathMap.set(fileName, result)); 155 | } 156 | 157 | public getSemanticDiagnostics( 158 | delegate: ts.LanguageService["getSemanticDiagnostics"], 159 | fileName: string, 160 | ): ReturnType { 161 | const original = delegate(fileName); 162 | try { 163 | const sourceFile = this.getSourceFile(fileName); 164 | if (!sourceFile) { 165 | return original; 166 | } 167 | const eslintResult = this.getESLintResult(fileName, sourceFile); 168 | 169 | return [...original, ...translateToDiagnosticsFromESLintResult(eslintResult, sourceFile)]; 170 | } catch (error) { 171 | if (error instanceof Error) { 172 | this.logger(error.message); 173 | if (error.stack) { 174 | this.logger(error.stack); 175 | } 176 | } else { 177 | this.logger(`${error}`); 178 | } 179 | return original; 180 | } 181 | } 182 | 183 | public getCodeFixesAtPosition( 184 | delegate: ts.LanguageService["getCodeFixesAtPosition"], 185 | fileName: string, 186 | start: number, 187 | end: number, 188 | errorCodes: number[], 189 | formatOptions: ts.FormatCodeSettings, 190 | preferences: ts.UserPreferences, 191 | ): ReturnType { 192 | const original = delegate(fileName, start, end, errorCodes, formatOptions, preferences); 193 | try { 194 | if (!errorCodes.includes(TS_LANGSERVICE_ESLINT_DIAGNOSTIC_ERROR_CODE)) { 195 | return original; 196 | } 197 | 198 | const sourceFile = this.getSourceFile(fileName); 199 | if (!sourceFile) { 200 | return original; 201 | } 202 | 203 | const eslintResult = this.getESLintResult(fileName, sourceFile); 204 | 205 | return [ 206 | ...original, 207 | ...translateToCodeFixesFromESLintResult( 208 | eslintResult.filter(r => isIntersect(r, { start, end }, sourceFile)), 209 | fileName, 210 | ), 211 | ]; 212 | } catch (error: any) { 213 | this.logger(error.message ? error.message : "unknow error"); 214 | return original; 215 | } 216 | return original; 217 | } 218 | } 219 | 220 | function isParserModuleNameValid(parserModuleSpecifier: string | undefined, parserModuleName: string) { 221 | if (!parserModuleSpecifier) return false; 222 | try { 223 | const p = require.resolve(parserModuleSpecifier); 224 | return p.indexOf(parserModuleName) !== -1; 225 | } catch (e) { 226 | return false; 227 | } 228 | } 229 | -------------------------------------------------------------------------------- /src/eslint-config-provider.test.ts: -------------------------------------------------------------------------------- 1 | import fs from "fs"; 2 | import path from "path"; 3 | import ts from "typescript"; 4 | import { ESLintConfigProvider } from "./eslint-config-provider"; 5 | 6 | const fixtureDirPath = path.resolve(__dirname, "../test-fixtures/eslnt-config-provider"); 7 | 8 | function readFile(path: string, encoding: string) { 9 | return fs.readFileSync(path, { encoding: encoding as BufferEncoding }); 10 | } 11 | 12 | class FileUpdater { 13 | public path!: string; 14 | public originalContent?: string; 15 | public callbackList: { path: string; callback: ts.FileWatcherCallback }[] = []; 16 | 17 | public init(path: string) { 18 | this.path = path; 19 | this.callbackList = []; 20 | this.originalContent = readFile(path, "utf8"); 21 | } 22 | 23 | public update(replace: (old: string) => string) { 24 | if (this.originalContent) { 25 | const newContent = replace(this.originalContent); 26 | fs.writeFileSync(this.path, newContent, "utf8"); 27 | this.callbackList 28 | .filter(({ path }) => this.path === path) 29 | .forEach(({ callback }) => { 30 | callback(this.path, ts.FileWatcherEventKind.Changed); 31 | }); 32 | } 33 | } 34 | 35 | public reset() { 36 | if (this.originalContent) { 37 | fs.writeFileSync(this.path, this.originalContent, "utf8"); 38 | delete this.originalContent; 39 | } 40 | delete (this as any).path; 41 | this.callbackList = []; 42 | } 43 | 44 | public createWatcher() { 45 | return { 46 | watchFile: (path: string, callback: ts.FileWatcherCallback) => { 47 | this.callbackList.push({ path, callback }); 48 | return { 49 | close: () => {}, 50 | } as ts.FileWatcher; 51 | }, 52 | }; 53 | } 54 | } 55 | 56 | describe("ESLintConfigProvider", () => { 57 | describe("#getConfigForFile", () => { 58 | const fileUpdater = new FileUpdater(); 59 | 60 | afterEach(() => fileUpdater.reset()); 61 | 62 | it("should load base config", () => { 63 | const prjDir = path.resolve(fixtureDirPath, "prj-with-eslintrc-yml"); 64 | const provider = new ESLintConfigProvider({ 65 | directoriesToWatch: [prjDir], 66 | host: { 67 | readFile, 68 | watchFile: fileUpdater.createWatcher().watchFile, 69 | }, 70 | }); 71 | const config = provider.getConfigForFile(path.resolve(prjDir, "main.ts")); 72 | expect(config.rules).toEqual({ curly: ["error"] }); 73 | }); 74 | 75 | it("should reload base config after changes eslintrc.yml file", () => { 76 | const prjDir = path.resolve(fixtureDirPath, "prj-with-eslintrc-yml"); 77 | fileUpdater.init(path.resolve(prjDir, ".eslintrc.yml")); 78 | const provider = new ESLintConfigProvider({ 79 | directoriesToWatch: [prjDir], 80 | host: { 81 | readFile, 82 | watchFile: fileUpdater.createWatcher().watchFile, 83 | }, 84 | }); 85 | provider.getConfigForFile(path.resolve(prjDir, "main.ts")); 86 | fileUpdater.update(s => s.replace("# TO_BE_ENABLED_AFTER ", "")); 87 | const configAfterChanges = provider.getConfigForFile(path.resolve(prjDir, "main.ts")); 88 | expect(configAfterChanges.rules).toEqual({ curly: ["error"], semi: ["error"] }); 89 | }); 90 | 91 | // FIXME 92 | // Using Node.js REPL, CascadingConfigArrayFactory#clearCache and relaod .eslintrc.js returns the updated config object. 93 | // But the reloading does not work well under thw folloiwng test case... 94 | it.skip("should reload base config after changes eslintrc.* file", () => { 95 | const prjDir = path.resolve(fixtureDirPath, "prj-with-eslintrc"); 96 | fileUpdater.init(path.resolve(prjDir, ".eslintrc.js")); 97 | const provider = new ESLintConfigProvider({ 98 | directoriesToWatch: [prjDir], 99 | host: { 100 | readFile, 101 | watchFile: fileUpdater.createWatcher().watchFile, 102 | }, 103 | }); 104 | provider.getConfigForFile(path.resolve(prjDir, "main.ts")); 105 | fileUpdater.update(s => s.replace("// TO_BE_ENABLED_AFTER ", "")); 106 | const configAfterChanges = provider.getConfigForFile(path.resolve(prjDir, "main.ts")); 107 | expect(configAfterChanges.rules).toEqual({ curly: ["error"], semi: ["error"] }); 108 | }); 109 | }); 110 | }); 111 | -------------------------------------------------------------------------------- /src/eslint-config-provider.ts: -------------------------------------------------------------------------------- 1 | import path from "path"; 2 | import ts from "typescript"; 3 | import { Legacy } from "@eslint/eslintrc"; 4 | import type { ConfigArray, CascadingConfigArrayFactory } from "@eslint/eslintrc"; 5 | 6 | function getFactroyClass() { 7 | return Legacy.CascadingConfigArrayFactory; 8 | } 9 | 10 | export type ConfigProviderHost = { 11 | readonly readFile: (fileName: string, encoding: string) => string | undefined; 12 | readonly watchFile: (path: string, callback: ts.FileWatcherCallback, pollingInterval?: number) => ts.FileWatcher; 13 | }; 14 | 15 | export type ESLintConfigProviderOptions = { 16 | host: ConfigProviderHost; 17 | log?: (msg: string) => void; 18 | directoriesToWatch: string[]; 19 | }; 20 | 21 | const ESLINTRC_SUFFIX_LIST = [ 22 | ".eslintrc.js", 23 | ".eslintrc.yaml", 24 | ".eslintrc.yml", 25 | ".eslintrc.json", 26 | ".eslintrc", 27 | "package.json", 28 | ]; 29 | 30 | export interface ConfigProvider { 31 | getConfigArrayForFile(fileName: string): ConfigArray; 32 | } 33 | 34 | export class ESLintConfigProvider implements ConfigProvider { 35 | private readonly host: ConfigProviderHost; 36 | private readonly factory: CascadingConfigArrayFactory; 37 | private readonly log: (msg: string) => void; 38 | 39 | public constructor({ host, log = () => {}, directoriesToWatch }: ESLintConfigProviderOptions) { 40 | this.host = host; 41 | this.log = log; 42 | const eslintRecommendedPath = this.resolveESLintIntrinsicConfigPath("eslint-recommended"); 43 | const eslintAllPath = this.resolveESLintIntrinsicConfigPath("eslint-all"); 44 | 45 | // 46 | // It requires the ESLint intrinsic configuration js file path when user config has "eslint:recommended" or "eslint:all" such as: 47 | // 48 | // ```yaml 49 | // extends: 50 | // - "eslint:recommended" 51 | // ``` 52 | // 53 | this.factory = new (getFactroyClass())({ 54 | eslintAllPath, 55 | eslintRecommendedPath, 56 | }); 57 | 58 | directoriesToWatch.forEach(directory => { 59 | ESLINTRC_SUFFIX_LIST.map(suffix => path.resolve(directory, suffix)).forEach(eslintrcFilepath => { 60 | this.host.watchFile(eslintrcFilepath, () => this.factory.clearCache(), 50); 61 | }); 62 | }); 63 | } 64 | 65 | public getConfigArrayForFile(fileName: string) { 66 | return this.factory.getConfigArrayForFile(fileName); 67 | } 68 | 69 | public getConfigForFile(fileName: string) { 70 | return this.factory.getConfigArrayForFile(fileName).extractConfig(fileName); 71 | } 72 | 73 | private resolveESLintIntrinsicConfigPath(name: "eslint-all" | "eslint-recommended"): string | undefined { 74 | try { 75 | // Config js files move to @eslint/js package sinse ESLint v8.35. 76 | // https://github.com/eslint/eslint/pull/16844 77 | return require.resolve(`@eslint/js/src/configs/${name}`); 78 | } catch { 79 | try { 80 | // For legacy ESLint < v8.35 81 | const fragments = require.resolve("eslint").split(path.join("node_modules", "eslint")); 82 | return path.join(...fragments.slice(0, fragments.length - 1), "node_modules", "eslint", "conf", `${name}.js`); 83 | } catch (e) { 84 | this.log(String(e)); 85 | } 86 | } 87 | return undefined; 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { pluginModuleFactory } from "./plugin-module-factory"; 2 | 3 | export = pluginModuleFactory; 4 | -------------------------------------------------------------------------------- /src/language-service-proxy-builder.ts: -------------------------------------------------------------------------------- 1 | import ts from "typescript/lib/tsserverlibrary"; 2 | 3 | export type LanguageServiceMethodWrapper = ( 4 | delegate: ts.LanguageService[K], 5 | info?: ts.server.PluginCreateInfo, 6 | ) => ts.LanguageService[K]; 7 | 8 | export class LanguageServiceProxyBuilder { 9 | private readonly wrappers: any[] = []; 10 | private readonly info: ts.server.PluginCreateInfo; 11 | 12 | public constructor(info: ts.server.PluginCreateInfo) { 13 | this.info = info; 14 | } 15 | 16 | public wrap>(name: K, wrapper: Q) { 17 | this.wrappers.push({ name, wrapper }); 18 | return this; 19 | } 20 | 21 | public build(): ts.LanguageService { 22 | const ret = this.info.languageService; 23 | this.wrappers.forEach(({ name, wrapper }) => { 24 | if (!this.info.languageService[name as keyof ts.LanguageService]) return; 25 | (ret as any)[name] = wrapper(this.info.languageService[name as keyof ts.LanguageService], this.info); 26 | }); 27 | return ret; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/plugin-module-factory.ts: -------------------------------------------------------------------------------- 1 | import path from "path"; 2 | import ts from "typescript/lib/tsserverlibrary"; 3 | import { LanguageServiceProxyBuilder } from "./language-service-proxy-builder"; 4 | import { ESLintAdapter } from "./eslint-adapter"; 5 | import { ESLintConfigProvider } from "./eslint-config-provider"; 6 | import { TS_LANGSERVICE_ESLINT_DIAGNOSTIC_ERROR_CODE } from "./consts"; 7 | 8 | function create(info: ts.server.PluginCreateInfo): ts.LanguageService { 9 | if (!!process.env["TS_ESLINT_SERVICE_DISABLED"]) return info.languageService; 10 | 11 | const { languageService, serverHost, project, config: pluginConfigObj } = info; 12 | 13 | const projectDir = path.dirname(project.getProjectName()); 14 | const logger = (msg: string) => project.projectService.logger.info(`[typescript-eslint-language-service] ${msg}`); 15 | 16 | logger("config: " + JSON.stringify(pluginConfigObj)); 17 | 18 | let watchDirs: string[]; 19 | if (Array.isArray(pluginConfigObj.watchDirs)) { 20 | watchDirs = (pluginConfigObj.watchDirs as any[]) 21 | .filter(x => typeof x === "string") 22 | .map(x => path.resolve(projectDir, x)); 23 | } else { 24 | watchDirs = [projectDir]; 25 | } 26 | 27 | const getProgram = () => { 28 | const program = languageService.getProgram(); 29 | if (!program) { 30 | throw new Error(); 31 | } 32 | return program; 33 | }; 34 | 35 | const configProvider = new ESLintConfigProvider({ 36 | directoriesToWatch: watchDirs, 37 | log: logger, 38 | host: serverHost, 39 | }); 40 | 41 | const adapter = new ESLintAdapter({ 42 | logger, 43 | configProvider, 44 | getSourceFile(fileName: string) { 45 | return getProgram().getSourceFile(fileName); 46 | }, 47 | }); 48 | 49 | const originalReadFileFn = serverHost.readFile; 50 | serverHost.readFile = (path: string, encoding?: string) => { 51 | adapter.checkFileToBeIgnored(path); 52 | return originalReadFileFn!(path, encoding); 53 | }; 54 | 55 | const proxy = new LanguageServiceProxyBuilder(info) 56 | .wrap("getSemanticDiagnostics", delegate => adapter.getSemanticDiagnostics.bind(adapter, delegate)) 57 | .wrap("getCodeFixesAtPosition", delegate => adapter.getCodeFixesAtPosition.bind(adapter, delegate)) 58 | .wrap("getSupportedCodeFixes", delegate => (filename?: string | undefined) => [ 59 | ...delegate(filename), 60 | `${TS_LANGSERVICE_ESLINT_DIAGNOSTIC_ERROR_CODE}`, 61 | ]) 62 | .build(); 63 | return proxy; 64 | } 65 | 66 | export const pluginModuleFactory: ts.server.PluginModuleFactory = ({ typescript }: { typescript: typeof ts }) => { 67 | try { 68 | // NOTE 69 | // Now ts.LanguageService does not exported method to get supported fixable codes. 70 | // So I monkey-patche to override ts.getSupportedCodeFixes til https://github.com/microsoft/TypeScript/pull/29010 is merged. 71 | const delegate = typescript.getSupportedCodeFixes; 72 | typescript.getSupportedCodeFixes = () => [...delegate(), `${TS_LANGSERVICE_ESLINT_DIAGNOSTIC_ERROR_CODE}`]; 73 | } catch { 74 | // Nothing to do 75 | } 76 | 77 | return { create }; 78 | }; 79 | -------------------------------------------------------------------------------- /src/typedef/eslint-internal.d.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * These modules are accesible, but they're not public API. 4 | * 5 | */ 6 | declare module "eslint/lib/cli-engine/ignored-paths" { 7 | export class IgnoredPaths { 8 | public constructor(options: { cwd?: string }); 9 | public contains(filepath: string, category?: "default" | "custom" | undefined): boolean; 10 | } 11 | } 12 | 13 | declare module "@eslint/eslintrc/lib/config-array/extracted-config" { 14 | import { Linter } from "eslint"; 15 | 16 | export interface InternalConfig extends Linter.Config { 17 | parser: any; 18 | plugins?: any; 19 | } 20 | 21 | export interface ExtractedConfig extends Linter.Config { 22 | toCompatibleObjectAsConfigFileContent(): Linter.Config; 23 | } 24 | } 25 | 26 | declare module "@eslint/eslintrc" { 27 | import { ExtractedConfig, InternalConfig } from "@eslint/eslintrc/lib/config-array/extracted-config"; 28 | import { CascadingConfigArrayFactory } from "@eslint/eslintrc/lib/cascading-config-array-factory"; 29 | export type { CascadingConfigArrayFactory } from "@eslint/eslintrc/lib/cascading-config-array-factory"; 30 | 31 | export class ConfigArray extends Array { 32 | public constructor(...args: T[]); 33 | public extractConfig(filename: string): ExtractedConfig; 34 | } 35 | 36 | export class ConfigDependency { 37 | public constructor(arg: any); 38 | } 39 | 40 | export const Legacy = { 41 | ConfigDependency, 42 | ConfigArray, 43 | CascadingConfigArrayFactory, 44 | }; 45 | } 46 | 47 | declare module "@eslint/eslintrc/lib/cascading-config-array-factory" { 48 | // eslint-disable-next-line 49 | import { InternalConfig } from "@eslint/eslintrc/lib/config-array/extracted-config"; 50 | import { ConfigArray } from "@eslint/eslintrc/lib/config-array/config-array"; 51 | 52 | /** 53 | * 54 | * See also https://github.com/eslint/eslint/blob/v6.1.0/lib/cascading-config-array-factory.js#L169 55 | * 56 | */ 57 | export class CascadingConfigArrayFactory { 58 | constructor(options: { eslintRecommendedPath?: string | undefined; eslintAllPath?: string | undefined }); 59 | public getConfigArrayForFile(filename: string): ConfigArray; 60 | public clearCache(): void; 61 | } 62 | } 63 | 64 | declare module "@eslint/eslintrc/lib/ignored-paths" { 65 | export class IgnoredPaths { 66 | public constructor(options: { cwd?: string }); 67 | public contains(filepath: string, category?: "default" | "custom" | undefined): boolean; 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /test-fixtures/eslnt-config-provider/prj-with-eslintrc-yml/.eslintrc.yml: -------------------------------------------------------------------------------- 1 | root: true 2 | rules: 3 | curly: error 4 | # TO_BE_ENABLED_AFTER semi: error 5 | -------------------------------------------------------------------------------- /test-fixtures/eslnt-config-provider/prj-with-eslintrc-yml/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "prj-with-eslintrc-yml", 3 | "version": "1.0.0", 4 | "private": true 5 | } 6 | -------------------------------------------------------------------------------- /test-fixtures/eslnt-config-provider/prj-with-eslintrc/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | rules: { 4 | curly: "error", 5 | // TO_BE_ENABLED_AFTER semi: "error", 6 | }, 7 | }; 8 | -------------------------------------------------------------------------------- /test-fixtures/eslnt-config-provider/prj-with-eslintrc/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "prj-with-eslintrc", 3 | "version": "1.0.0", 4 | "private": true 5 | } 6 | -------------------------------------------------------------------------------- /tsconfig.build.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "declaration": true, 5 | "sourceMap": true, 6 | "rootDir": "src", 7 | "outDir": "lib" 8 | }, 9 | "exclude": ["e2e", "node_modules", "lib", "local", "test-fixtures"] 10 | } 11 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "skipLibCheck": true, 4 | "plugins": [{ "name": "../../local/index.js" }], 5 | /* Basic Options */ 6 | // "incremental": true, /* Enable incremental compilation */ 7 | "target": "es2019" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */, 8 | "module": "nodenext" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, 9 | // "lib": [], /* Specify library files to be included in the compilation. */ 10 | // "allowJs": true, /* Allow javascript files to be compiled. */ 11 | // "checkJs": true, /* Report errors in .js files. */ 12 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 13 | // "declaration": true, /* Generates corresponding '.d.ts' file. */ 14 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ 15 | // "sourceMap": true, /* Generates corresponding '.map' file. */ 16 | // "outFile": "./", /* Concatenate and emit output to single file. */ 17 | // "outDir": "./", /* Redirect output structure to the directory. */ 18 | // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 19 | // "composite": true, /* Enable project compilation */ 20 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ 21 | // "removeComments": true, /* Do not emit comments to output. */ 22 | // "noEmit": true, /* Do not emit outputs. */ 23 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 24 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 25 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 26 | 27 | /* Strict Type-Checking Options */ 28 | "strict": true /* Enable all strict type-checking options. */, 29 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ 30 | // "strictNullChecks": true, /* Enable strict null checks. */ 31 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */ 32 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ 33 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ 34 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 35 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 36 | 37 | /* Additional Checks */ 38 | "noUnusedLocals": true /* Report errors on unused locals. */, 39 | "noUnusedParameters": true /* Report errors on unused parameters. */, 40 | "noImplicitReturns": true /* Report error when not all code paths in function return a value. */, 41 | "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */, 42 | 43 | /* Module Resolution Options */ 44 | "moduleResolution": "nodenext" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */, 45 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 46 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 47 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 48 | // "typeRoots": [], /* List of folders to include type definitions from. */ 49 | // "types": [], /* Type declaration files to be included in compilation. */ 50 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 51 | "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ 52 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 53 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 54 | 55 | /* Source Map Options */ 56 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 57 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 58 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 59 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 60 | 61 | /* Experimental Options */ 62 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ 63 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ 64 | } 65 | } 66 | --------------------------------------------------------------------------------