├── .node-version ├── .gitignore ├── renovate.json ├── bench-vscode ├── package.json ├── README.md ├── bench.sh ├── .oxlintrc.json └── eslint.config.mjs ├── bench-vue ├── package.json ├── bench.sh ├── README.md ├── .oxlintrc.json └── eslint.config.mjs ├── bench-sentry ├── package.json ├── .oxlintrc.json ├── bench.sh └── eslint.config.mjs ├── package.json ├── bench-all.sh ├── .github └── workflows │ └── ci.yml ├── init.sh ├── bar-graph.svg ├── README.md └── pnpm-lock.yaml /.node-version: -------------------------------------------------------------------------------- 1 | 20 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json 3 | tmp 4 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": ["github>Boshen/renovate"] 4 | } 5 | -------------------------------------------------------------------------------- /bench-vscode/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bench-vscode", 3 | "version": "0.0.0", 4 | "license": "MIT", 5 | "private": true, 6 | "description": "Benchmark for VSCode codebase with standard linting rules" 7 | } -------------------------------------------------------------------------------- /bench-vue/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bench-vue", 3 | "version": "0.0.0", 4 | "license": "MIT", 5 | "private": true, 6 | "description": "Benchmark for Vue Core codebase with type-aware linting rules" 7 | } -------------------------------------------------------------------------------- /bench-sentry/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bench-sentry", 3 | "version": "0.0.0", 4 | "license": "MIT", 5 | "private": true, 6 | "description": "Benchmark for Sentry codebase comparing Oxlint vs ESLint with type-aware linting" 7 | } 8 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bench-javascript-linter", 3 | "version": "0.0.0", 4 | "license": "MIT", 5 | "private": true, 6 | "packageManager": "pnpm@10.25.0", 7 | "devDependencies": { 8 | "@biomejs/biome": "^2.3.8", 9 | "@typescript-eslint/eslint-plugin": "^8.48.0", 10 | "@typescript-eslint/parser": "^8.48.0", 11 | "eslint": "^9.39.1", 12 | "oxlint": "^1.30.0", 13 | "oxlint-tsgolint": "^0.10.0", 14 | "typescript": "^5.9.3" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /bench-sentry/.oxlintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/oxlint/configuration_schema.json", 3 | "categories": { "correctness": "off" }, 4 | "rules": { 5 | "@typescript-eslint/await-thenable": "error", 6 | "@typescript-eslint/consistent-type-exports": "error", 7 | "@typescript-eslint/no-array-delete": "error", 8 | "@typescript-eslint/no-base-to-string": "error", 9 | "@typescript-eslint/no-for-in-array": "error", 10 | "@typescript-eslint/no-unnecessary-type-assertion": "error", 11 | "@typescript-eslint/prefer-optional-chain": "error", 12 | "@typescript-eslint/no-meaningless-void-operator": "error" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /bench-vue/bench.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | cd "$(dirname "$0")/.." 4 | 5 | VUE_CORE_TEST_DIR="$(pwd)/tmp/vue-core" 6 | 7 | echo "============================================" 8 | echo "Vue Core Benchmark - Type-Aware Rules" 9 | echo "============================================" 10 | echo "" 11 | 12 | echo "Oxlint vs TypeScript ESLint with type-aware rules" 13 | echo "-------------------------------------------" 14 | 15 | OXC="./node_modules/.bin/oxlint -c bench-vue/.oxlintrc.json --type-aware ${VUE_CORE_TEST_DIR}" 16 | ESLINT="./node_modules/.bin/eslint -c bench-vue/eslint.config.mjs ${VUE_CORE_TEST_DIR}" 17 | 18 | hyperfine -w 1 -i \ 19 | -n oxc "${OXC}" \ 20 | -n eslint "${ESLINT}" 21 | -------------------------------------------------------------------------------- /bench-vscode/README.md: -------------------------------------------------------------------------------- 1 | # VSCode Benchmark 2 | 3 | Benchmarks for linting the Microsoft VSCode codebase with standard JavaScript/TypeScript rules. 4 | 5 | ## Setup 6 | 7 | ```bash 8 | # From the root directory 9 | ../init.sh # Clone VSCode repo and install dependencies 10 | ``` 11 | 12 | ## Run Benchmark 13 | 14 | ```bash 15 | ./bench.sh 16 | ``` 17 | 18 | ## Benchmarks Included 19 | 20 | 1. **Oxlint vs Biome** - Single rule comparison (no-debugger) 21 | 2. **Oxlint vs ESLint** - Full ruleset comparison with standard JS/TS rules 22 | 23 | ## Configuration Files 24 | 25 | - `.oxlintrc.json` - Oxlint configuration with standard rules 26 | - `eslint.config.mjs` - ESLint configuration with equivalent rules -------------------------------------------------------------------------------- /bench-sentry/bench.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | cd "$(dirname "$0")/.." 4 | 5 | SENTRY_TEST_DIR="$(pwd)/tmp/sentry/static" 6 | SENTRY_TSCONFIG="$(pwd)/tmp/sentry/tsconfig.json" 7 | 8 | echo "============================================" 9 | echo "Sentry Benchmark - Type-Aware Linting" 10 | echo "============================================" 11 | echo "" 12 | 13 | echo "Oxlint vs TypeScript ESLint with type-aware rules" 14 | echo "-------------------------------------------" 15 | 16 | OXC="./node_modules/.bin/oxlint -c bench-sentry/.oxlintrc.json --tsconfig ${SENTRY_TSCONFIG} --type-aware ${SENTRY_TEST_DIR}" 17 | ESLINT="./node_modules/.bin/eslint -c bench-sentry/eslint.config.mjs ${SENTRY_TEST_DIR}" 18 | 19 | hyperfine -w 1 -i \ 20 | -n oxc "${OXC}" \ 21 | -n eslint "${ESLINT}" 22 | -------------------------------------------------------------------------------- /bench-all.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | echo "============================================" 4 | echo "Running All JavaScript Linter Benchmarks" 5 | echo "============================================" 6 | echo "" 7 | 8 | # Run VSCode benchmarks 9 | echo "Running VSCode benchmarks..." 10 | echo "" 11 | cd bench-vscode 12 | chmod +x bench.sh 13 | ./bench.sh 14 | cd .. 15 | 16 | echo "" 17 | echo "" 18 | 19 | # Run Vue benchmarks 20 | echo "Running Vue Core benchmarks..." 21 | echo "" 22 | cd bench-vue 23 | chmod +x bench.sh 24 | ./bench.sh 25 | cd .. 26 | 27 | echo "" 28 | echo "" 29 | 30 | # Run Sentry benchmarks 31 | echo "Running Sentry benchmarks..." 32 | echo "" 33 | cd bench-sentry 34 | chmod +x bench.sh 35 | ./bench.sh 36 | cd .. 37 | 38 | echo "" 39 | echo "============================================" 40 | echo "All benchmarks completed!" 41 | echo "============================================" -------------------------------------------------------------------------------- /bench-vue/README.md: -------------------------------------------------------------------------------- 1 | # Vue Core Benchmark 2 | 3 | Benchmarks for linting the Vue.js Core codebase with type-aware TypeScript rules. 4 | 5 | ## Setup 6 | 7 | ```bash 8 | # From the root directory 9 | ../init.sh # Clone Vue Core repo and install dependencies 10 | ``` 11 | 12 | ## Run Benchmark 13 | 14 | ```bash 15 | ./bench.sh 16 | ``` 17 | 18 | ## Benchmarks Included 19 | 20 | **Oxlint vs TypeScript ESLint** - Type-aware rules comparison 21 | 22 | ## Configuration Files 23 | 24 | - `.oxlintrc.json` - Oxlint configuration with type-aware rules 25 | - `eslint.config.mjs` - TypeScript ESLint configuration with equivalent type-aware rules 26 | 27 | ## Type-Aware Rules 28 | 29 | This benchmark focuses on computationally expensive type-aware rules that require TypeScript type information, including: 30 | - `@typescript-eslint/await-thenable` 31 | - `@typescript-eslint/no-floating-promises` 32 | - `@typescript-eslint/no-misused-promises` 33 | - `@typescript-eslint/unbound-method` 34 | - And more... -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | permissions: {} 4 | 5 | on: 6 | workflow_dispatch: 7 | pull_request: 8 | types: 9 | - opened 10 | - synchronize 11 | paths-ignore: &paths-ignore 12 | - "**/*.md" 13 | - "!.github/workflows/ci.yml" 14 | push: 15 | branches: 16 | - main 17 | paths-ignore: *paths-ignore 18 | 19 | concurrency: 20 | group: ${{ github.workflow }}-${{ github.ref }} 21 | cancel-in-progress: true 22 | 23 | defaults: 24 | run: 25 | shell: bash 26 | 27 | jobs: 28 | ci: 29 | name: CI 30 | runs-on: ubuntu-latest 31 | steps: 32 | - uses: taiki-e/checkout-action@b13d20b7cda4e2f325ef19895128f7ff735c0b3d # v1.3.1 33 | 34 | - uses: oxc-project/setup-node@141eb77546de6702f92d320926403fe3f9f6a6f2 # v1.0.5 35 | 36 | - name: Check scripts are executable 37 | run: | 38 | test -x init.sh 39 | test -x bench-all.sh 40 | test -x bench-vscode/bench.sh 41 | test -x bench-vue/bench.sh 42 | -------------------------------------------------------------------------------- /bench-vscode/bench.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | VSCODE_TEST_DIR="../tmp/vscode/src" 4 | 5 | echo "============================================" 6 | echo "VSCode Benchmark" 7 | echo "============================================" 8 | echo "" 9 | 10 | echo "1. Oxlint vs Biome with single rule (no-debugger)" 11 | echo "-------------------------------------------" 12 | 13 | OXC="../node_modules/.bin/oxlint -A all -D debugger ${VSCODE_TEST_DIR}" 14 | BIOME="../node_modules/.bin/biome lint --only=suspicious/noDebugger ${VSCODE_TEST_DIR}" 15 | 16 | hyperfine -w 1 -i \ 17 | -n oxc "${OXC}" \ 18 | -n biome "${BIOME}" 19 | 20 | echo "" 21 | echo "2. Oxlint vs ESLint with standard rules" 22 | echo "-------------------------------------------" 23 | 24 | OXC="../node_modules/.bin/oxlint -c .oxlintrc.json ${VSCODE_TEST_DIR}" 25 | ESLINT="../node_modules/.bin/eslint -c eslint.config.mjs ${VSCODE_TEST_DIR}" 26 | 27 | hyperfine -w 1 -i \ 28 | -n oxc "${OXC}" \ 29 | -n oxc-single-thread "${OXC} --threads=1" \ 30 | -n eslint "${ESLINT}" -------------------------------------------------------------------------------- /bench-sentry/eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import typescriptEslint from '@typescript-eslint/eslint-plugin'; 2 | import tsParser from '@typescript-eslint/parser'; 3 | 4 | /** 5 | * ESLint config for Sentry benchmark - Type-Aware Rules 6 | * Based on https://github.com/getsentry/sentry/blob/main/eslint.config.mjs 7 | */ 8 | export default [ 9 | { 10 | files: ['**/*.ts', '**/*.tsx', '**/*.mts', '**/*.cts', '**/*.js', '**/*.mjs', '**/*.cjs'], 11 | plugins: { 12 | '@typescript-eslint': typescriptEslint, 13 | }, 14 | languageOptions: { 15 | parser: tsParser, 16 | parserOptions: { 17 | projectService: { 18 | // allowDefaultProject: [] 19 | }, 20 | }, 21 | }, 22 | rules: { 23 | // Type-aware rules from Sentry's eslint.config.mjs 24 | '@typescript-eslint/await-thenable': 'error', 25 | '@typescript-eslint/consistent-type-exports': 'error', 26 | '@typescript-eslint/no-array-delete': 'error', 27 | '@typescript-eslint/no-base-to-string': 'error', 28 | '@typescript-eslint/no-for-in-array': 'error', 29 | '@typescript-eslint/no-unnecessary-type-assertion': 'error', 30 | '@typescript-eslint/prefer-optional-chain': 'error', 31 | '@typescript-eslint/no-meaningless-void-operator': 'error', 32 | }, 33 | }, 34 | ]; 35 | -------------------------------------------------------------------------------- /bench-vue/.oxlintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "categories": { 3 | "correctness": "off" 4 | }, 5 | "rules": { 6 | "@typescript-eslint/await-thenable": "error", 7 | "@typescript-eslint/no-array-delete": "error", 8 | "@typescript-eslint/no-base-to-string": "error", 9 | "@typescript-eslint/no-deprecated": "error", 10 | "@typescript-eslint/no-duplicate-type-constituents": "error", 11 | "@typescript-eslint/no-floating-promises": "error", 12 | "@typescript-eslint/no-for-in-array": "error", 13 | "@typescript-eslint/no-implied-eval": "error", 14 | "@typescript-eslint/no-misused-promises": "error", 15 | "@typescript-eslint/no-redundant-type-constituents": "error", 16 | "@typescript-eslint/no-unnecessary-type-assertion": "error", 17 | "@typescript-eslint/no-unsafe-argument": "error", 18 | "@typescript-eslint/no-unsafe-assignment": "error", 19 | "@typescript-eslint/no-unsafe-call": "error", 20 | "@typescript-eslint/no-unsafe-enum-comparison": "error", 21 | "@typescript-eslint/no-unsafe-member-access": "error", 22 | "@typescript-eslint/no-unsafe-return": "error", 23 | "@typescript-eslint/no-unsafe-unary-minus": "error", 24 | "@typescript-eslint/only-throw-error": "error", 25 | "@typescript-eslint/prefer-promise-reject-errors": "error", 26 | "@typescript-eslint/require-await": "error", 27 | "@typescript-eslint/restrict-plus-operands": "error", 28 | "@typescript-eslint/restrict-template-expressions": "error", 29 | "@typescript-eslint/unbound-method": "error" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /init.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | echo "============================================" 4 | echo "Initializing JavaScript Linter Benchmarks" 5 | echo "============================================" 6 | echo "" 7 | 8 | # Create tmp directory for repos 9 | mkdir -p tmp 10 | pushd tmp 11 | 12 | # Clone VSCode repository 13 | if [ ! -d "vscode" ]; then 14 | echo "Cloning VSCode repository..." 15 | git clone --depth=1 git@github.com:microsoft/vscode.git 16 | else 17 | echo "VSCode repository already exists, skipping..." 18 | fi 19 | 20 | # Clone Vue Core repository 21 | if [ ! -d "vue-core" ]; then 22 | echo "Cloning Vue Core repository..." 23 | git clone --depth=1 git@github.com:vuejs/core.git vue-core 24 | else 25 | echo "Vue Core repository already exists, skipping..." 26 | fi 27 | 28 | # Clone Sentry repository 29 | if [ ! -d "sentry" ]; then 30 | echo "Cloning Sentry repository..." 31 | git clone --depth=1 git@github.com:getsentry/sentry.git sentry 32 | else 33 | echo "Sentry repository already exists, skipping..." 34 | fi 35 | 36 | popd 37 | 38 | # Install dependencies 39 | echo "" 40 | echo "Installing dependencies..." 41 | pnpm install 42 | 43 | # Clean up old eslint configs in VSCode 44 | echo "" 45 | echo "Cleaning up old ESLint configs in VSCode..." 46 | rm -rf ./tmp/vscode/.eslintrc.json 47 | rm -rf ./tmp/vscode/**/.eslintrc.json 48 | 49 | echo "" 50 | echo "============================================" 51 | echo "Initialization complete!" 52 | echo "============================================" 53 | echo "" 54 | echo "You can now run benchmarks with:" 55 | echo " ./bench-all.sh # Run all benchmarks" 56 | echo " cd bench-vscode && ./bench.sh # Run VSCode benchmark only" 57 | echo " cd bench-vue && ./bench.sh # Run Vue benchmark only" 58 | echo " cd bench-sentry && ./bench.sh # Run Sentry benchmark only" 59 | -------------------------------------------------------------------------------- /bench-vscode/.oxlintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/oxlint/configuration_schema.json", 3 | "categories": {"correctness": "off"}, 4 | "rules": { 5 | "for-direction": "error", 6 | "no-async-promise-executor": "error", 7 | "no-caller": "error", 8 | "no-class-assign": "error", 9 | "no-compare-neg-zero": "error", 10 | "no-cond-assign": "error", 11 | "no-const-assign": "error", 12 | "no-constant-binary-expression": "error", 13 | "no-constant-condition": "error", 14 | "no-control-regex": "error", 15 | "no-debugger": "error", 16 | "no-delete-var": "error", 17 | "no-dupe-class-members": "error", 18 | "no-dupe-else-if": "error", 19 | "no-dupe-keys": "error", 20 | "no-duplicate-case": "error", 21 | "no-empty-character-class": "error", 22 | "no-empty-pattern": "error", 23 | "no-empty-static-block": "error", 24 | "no-eval": "error", 25 | "no-ex-assign": "error", 26 | "no-extra-boolean-cast": "error", 27 | "no-func-assign": "error", 28 | "no-global-assign": "error", 29 | "no-import-assign": "error", 30 | "no-invalid-regexp": "error", 31 | "no-irregular-whitespace": "error", 32 | "no-loss-of-precision": "error", 33 | "no-new-native-nonconstructor": "error", 34 | "no-nonoctal-decimal-escape": "error", 35 | "no-obj-calls": "error", 36 | "no-self-assign": "error", 37 | "no-setter-return": "error", 38 | "no-shadow-restricted-names": "error", 39 | "no-sparse-arrays": "error", 40 | "no-this-before-super": "error", 41 | "no-unsafe-finally": "error", 42 | "no-unsafe-negation": "error", 43 | "no-unsafe-optional-chaining": "error", 44 | "no-unused-labels": "error", 45 | "no-unused-private-class-members": "error", 46 | "no-unused-vars": "error", 47 | "no-useless-backreference": "error", 48 | "no-useless-catch": "error", 49 | "no-useless-escape": "error", 50 | "no-useless-rename": "error", 51 | "no-with": "error", 52 | "require-yield": "error", 53 | "use-isnan": "error", 54 | "valid-typeof": "error", 55 | "@typescript-eslint/no-duplicate-enum-values": "error", 56 | "@typescript-eslint/no-extra-non-null-assertion": "error", 57 | "@typescript-eslint/no-misused-new": "error", 58 | "@typescript-eslint/no-non-null-asserted-optional-chain": "error", 59 | "@typescript-eslint/no-this-alias": "error", 60 | "@typescript-eslint/no-unnecessary-parameter-property-assignment": "error", 61 | "@typescript-eslint/no-unsafe-declaration-merging": "error", 62 | "@typescript-eslint/no-useless-empty-export": "error", 63 | "@typescript-eslint/no-wrapper-object-types": "error", 64 | "@typescript-eslint/prefer-as-const": "error", 65 | "@typescript-eslint/triple-slash-reference": "error" 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /bar-graph.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Linter Benchmark 7 | 8 | 9 | oxlint 10 | 11 | 12 | eslint 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 0 36 | 5 37 | 10 38 | 15 39 | 20 40 | 25 41 | vscode repo 42 | 43 | 44 | time (seconds) 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /bench-vscode/eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import typescriptEslint from '@typescript-eslint/eslint-plugin'; 2 | import tsParser from '@typescript-eslint/parser'; 3 | 4 | export default [ 5 | { 6 | plugins: { 7 | '@typescript-eslint': typescriptEslint, 8 | }, 9 | 10 | languageOptions: { 11 | parser: tsParser, 12 | }, 13 | 14 | rules: { 15 | 'for-direction': 'error', 16 | 'no-async-promise-executor': 'error', 17 | 'no-caller': 'error', 18 | 'no-class-assign': 'error', 19 | 'no-compare-neg-zero': 'error', 20 | 'no-cond-assign': 'error', 21 | 'no-const-assign': 'error', 22 | 'no-constant-binary-expression': 'error', 23 | 'no-constant-condition': 'error', 24 | 'no-control-regex': 'error', 25 | 'no-debugger': 'error', 26 | 'no-delete-var': 'error', 27 | 'no-dupe-class-members': 'error', 28 | 'no-dupe-else-if': 'error', 29 | 'no-dupe-keys': 'error', 30 | 'no-duplicate-case': 'error', 31 | 'no-empty-character-class': 'error', 32 | 'no-empty-pattern': 'error', 33 | 'no-empty-static-block': 'error', 34 | 'no-eval': 'error', 35 | 'no-ex-assign': 'error', 36 | 'no-extra-boolean-cast': 'error', 37 | 'no-func-assign': 'error', 38 | 'no-global-assign': 'error', 39 | 'no-import-assign': 'error', 40 | 'no-invalid-regexp': 'error', 41 | 'no-irregular-whitespace': 'error', 42 | 'no-loss-of-precision': 'error', 43 | 'no-new-native-nonconstructor': 'error', 44 | 'no-nonoctal-decimal-escape': 'error', 45 | 'no-obj-calls': 'error', 46 | 'no-self-assign': 'error', 47 | 'no-setter-return': 'error', 48 | 'no-shadow-restricted-names': 'error', 49 | 'no-sparse-arrays': 'error', 50 | 'no-this-before-super': 'error', 51 | 'no-unsafe-finally': 'error', 52 | 'no-unsafe-negation': 'error', 53 | 'no-unsafe-optional-chaining': 'error', 54 | 'no-unused-labels': 'error', 55 | 'no-unused-private-class-members': 'error', 56 | '@typescript-eslint/no-unused-vars': 'error', 57 | 'no-useless-backreference': 'error', 58 | 'no-useless-catch': 'error', 59 | 'no-useless-escape': 'error', 60 | 'no-useless-rename': 'error', 61 | 'no-with': 'error', 62 | 'require-yield': 'error', 63 | 'use-isnan': 'error', 64 | 'valid-typeof': 'error', 65 | '@typescript-eslint/no-duplicate-enum-values': 'error', 66 | '@typescript-eslint/no-extra-non-null-assertion': 'error', 67 | '@typescript-eslint/no-misused-new': 'error', 68 | '@typescript-eslint/no-non-null-asserted-optional-chain': 'error', 69 | '@typescript-eslint/no-this-alias': 'error', 70 | '@typescript-eslint/no-unnecessary-parameter-property-assignment': 'error', 71 | '@typescript-eslint/no-unsafe-declaration-merging': 'error', 72 | '@typescript-eslint/no-useless-empty-export': 'error', 73 | '@typescript-eslint/no-wrapper-object-types': 'error', 74 | '@typescript-eslint/prefer-as-const': 'error', 75 | '@typescript-eslint/triple-slash-reference': 'error', 76 | }, 77 | }, 78 | 79 | { 80 | files: ['**/*.js', '**/*.ts', '**/*.tsx', '**/*.mts', '**/*.cts'], 81 | }, 82 | ]; 83 | -------------------------------------------------------------------------------- /bench-vue/eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import typescriptEslint from '@typescript-eslint/eslint-plugin'; 2 | import tsParser from '@typescript-eslint/parser'; 3 | 4 | /** 5 | * @satisfies {import('eslint').ESLint.ConfigData[]} 6 | */ 7 | export default [ 8 | { 9 | files: ['**/*.ts', '**/*.tsx', '**/*.mts', '**/*.cts', '**/*.js', '**/*.mjs', '**/*.cjs'], 10 | plugins: { 11 | '@typescript-eslint': typescriptEslint, 12 | }, 13 | languageOptions: { 14 | parser: tsParser, 15 | parserOptions: { 16 | projectService: { 17 | // Why is this such a big lint? 18 | // When using `projectService`, it traverses up the tree looking for a 19 | // `tsconfig.json`. However, not all files we want to lint are included 20 | // in the `tsconfig.json` file. For example, `*.test.ts` files might be excluded etc. 21 | // To get around this, and lint these files, we use `allowDefaultProject`, which allows us to specify 22 | // additional files to lint. However, as this is slow, typescript-eslint disallows certain glob patterns 23 | // (any pattern containing `**`). This means that this list has to be on the longer side to cover all files we want to lint. 24 | // 25 | // There are alternative solutions to this problem, such as: 26 | // 1. Creating a catch-all `tsconfig.json` file that includes all files we want to lint. 27 | // - This is not ideal, as we are trying to compare to oxlint, so the less configuration we have (oxlint can be run directly via cmd line), the better. 28 | // 2. Skipping linting these files 29 | // - This is not ideal, as this might mean that bugs slip through. 30 | allowDefaultProject: [ 31 | 'tmp/vue-core/*.cjs', 32 | 'tmp/vue-core/*.js', 33 | 'tmp/vue-core/*.mjs', 34 | 'tmp/vue-core/*.ts', 35 | 'tmp/vue-core/packages/runtime-core/src/apiAsyncComponent.ts', 36 | 'tmp/vue-core/packages/runtime-core/src/apiasynccomponent.ts', 37 | 'tmp/vue-core/packages-private/sfc-playground/src/download/template/main.js', 38 | 'tmp/vue-core/packages-private/sfc-playground/src/download/template/vite.config.js', 39 | 'tmp/vue-core/packages-private/sfc-playground/src/vue-dev-proxy-prod.ts', 40 | 'tmp/vue-core/packages-private/sfc-playground/src/vue-dev-proxy.ts', 41 | 'tmp/vue-core/packages/compiler-core/index.js', 42 | 'tmp/vue-core/packages/compiler-dom/index.js', 43 | 'tmp/vue-core/packages/compiler-dom/src/decodeHtmlBrowser.ts', 44 | 'tmp/vue-core/packages/compiler-dom/src/decodeHtmlBrowser.ts', 45 | 'tmp/vue-core/packages/reactivity/__benchmarks__/*.bench.ts', 46 | 'tmp/vue-core/packages/reactivity/index.js', 47 | 'tmp/vue-core/packages/runtime-core/index.js', 48 | 'tmp/vue-core/packages/runtime-core/src/apiAsyncComponent.ts', 49 | 'tmp/vue-core/packages/runtime-core/src/apiAsyncComponent.ts', 50 | 'tmp/vue-core/packages/runtime-core/src/apiAsyncComponent.ts', 51 | 'tmp/vue-core/packages/runtime-core/types/globalComponents.d.ts', 52 | 'tmp/vue-core/packages/runtime-core/types/scriptSetupHelpers.d.ts', 53 | 'tmp/vue-core/packages/runtime-dom/index.js', 54 | 'tmp/vue-core/packages/runtime-test/index.js', 55 | 'tmp/vue-core/packages/server-renderer/index.js', 56 | 'tmp/vue-core/packages/shared/index.js', 57 | 'tmp/vue-core/packages/vue-compat/index.js', 58 | 'tmp/vue-core/packages/vue/compiler-sfc/index.browser.js', 59 | 'tmp/vue-core/packages/vue/compiler-sfc/index.browser.mjs', 60 | 'tmp/vue-core/packages/vue/compiler-sfc/index.d.mts', 61 | 'tmp/vue-core/packages/vue/compiler-sfc/index.d.ts', 62 | 'tmp/vue-core/packages/vue/compiler-sfc/index.js', 63 | 'tmp/vue-core/packages/vue/compiler-sfc/index.mjs', 64 | 'tmp/vue-core/packages/vue/compiler-sfc/register-ts.js', 65 | 'tmp/vue-core/packages/vue/index.js', 66 | 'tmp/vue-core/packages/vue/index.mjs', 67 | 'tmp/vue-core/packages/vue/jsx-runtime/index.js', 68 | 'tmp/vue-core/packages/vue/jsx-runtime/index.mjs', 69 | 'tmp/vue-core/packages/vue/jsx.d.ts', 70 | 'tmp/vue-core/packages/vue/server-renderer/index.d.mts', 71 | 'tmp/vue-core/packages/vue/server-renderer/index.d.ts', 72 | 'tmp/vue-core/packages/vue/server-renderer/index.js', 73 | 'tmp/vue-core/packages/vue/server-renderer/index.mjs', 74 | 'tmp/vue-core/scripts/*.js', 75 | ], 76 | maximumDefaultProjectFileMatchCount_THIS_WILL_SLOW_DOWN_LINTING: 1_000_000, 77 | }, 78 | }, 79 | }, 80 | rules: { 81 | '@typescript-eslint/await-thenable': 'error', 82 | '@typescript-eslint/no-array-delete': 'error', 83 | '@typescript-eslint/no-base-to-string': 'error', 84 | '@typescript-eslint/no-deprecated': 'error', 85 | '@typescript-eslint/no-duplicate-type-constituents': 'error', 86 | '@typescript-eslint/no-floating-promises': 'error', 87 | '@typescript-eslint/no-for-in-array': 'error', 88 | '@typescript-eslint/no-implied-eval': 'error', 89 | '@typescript-eslint/no-misused-promises': 'error', 90 | '@typescript-eslint/no-redundant-type-constituents': 'error', 91 | '@typescript-eslint/no-unnecessary-type-assertion': 'error', 92 | '@typescript-eslint/no-unsafe-argument': 'error', 93 | '@typescript-eslint/no-unsafe-assignment': 'error', 94 | '@typescript-eslint/no-unsafe-call': 'error', 95 | '@typescript-eslint/no-unsafe-enum-comparison': 'error', 96 | '@typescript-eslint/no-unsafe-member-access': 'error', 97 | '@typescript-eslint/no-unsafe-return': 'error', 98 | '@typescript-eslint/no-unsafe-unary-minus': 'error', 99 | '@typescript-eslint/only-throw-error': 'error', 100 | '@typescript-eslint/prefer-promise-reject-errors': 'error', 101 | '@typescript-eslint/require-await': 'error', 102 | '@typescript-eslint/restrict-plus-operands': 'error', 103 | '@typescript-eslint/restrict-template-expressions': 'error', 104 | '@typescript-eslint/unbound-method': 'error', 105 | }, 106 | }, 107 | ]; 108 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Benchmark for Oxc, Biome and ESLint 2 | 3 | This repository contains four separate benchmarks: 4 | 5 | - **bench-vscode**: Benchmarks on VSCode codebase with standard linting rules 6 | - **bench-vue**: Benchmarks on Vue Core codebase with type-aware linting rules 7 | - **bench-sentry**: Benchmarks on Sentry codebase with type-aware linting rules 8 | 9 | ## Summary 10 | 11 | Oxlint is 50x - 100x faster than ESLint depending on the number of CPU cores. 12 | 13 | Oxlint is ~2x faster than Biome. 14 | 15 | ## Setup 16 | 17 | Each benchmark is in its own directory: 18 | 19 | - [bench-vscode](./bench-vscode) - VSCode codebase benchmarks 20 | - [bench-vue](./bench-vue) - Vue Core codebase benchmarks 21 | - [bench-sentry](./bench-sentry) - Sentry codebase benchmarks (type-aware) 22 | 23 | ## VSCode Benchmark Results 24 | 25 | ### Oxlint vs Biome 26 | 27 | ### MacBook Pro M2 Max 28 | 29 | ``` 30 | Benchmark 1: oxc 31 | Time (mean ± σ): 138.6 ms ± 2.1 ms [User: 673.9 ms, System: 163.2 ms] 32 | Range (min … max): 133.9 ms … 143.2 ms 20 runs 33 | 34 | Warning: Ignoring non-zero exit code. 35 | 36 | Benchmark 2: biome 37 | Time (mean ± σ): 377.2 ms ± 6.3 ms [User: 2827.2 ms, System: 340.6 ms] 38 | Range (min … max): 372.0 ms … 393.9 ms 10 runs 39 | 40 | Warning: Ignoring non-zero exit code. 41 | 42 | Summary 43 | oxc ran 44 | 2.72 ± 0.06 times faster than biome 45 | ``` 46 | 47 | ### Macbook Pro M4 Max, 64 GB 48 | 49 | ``` 50 | Benchmark 1: oxc 51 | Time (mean ± σ): 98.2 ms ± 20.5 ms [User: 514.3 ms, System: 186.3 ms] 52 | Range (min … max): 91.4 ms … 208.2 ms 31 runs 53 | 54 | Warning: Ignoring non-zero exit code. 55 | Warning: Statistical outliers were detected. Consider re-running this benchmark on a quiet system without any interferences from other programs. It might help to use the '--warmup' or '--prepare' options. 56 | 57 | Benchmark 2: biome 58 | Time (mean ± σ): 244.5 ms ± 18.0 ms [User: 2047.0 ms, System: 392.9 ms] 59 | Range (min … max): 232.4 ms … 299.9 ms 12 runs 60 | 61 | Warning: Ignoring non-zero exit code. 62 | 63 | Summary 64 | oxc ran 65 | 2.49 ± 0.55 times faster than biome 66 | ``` 67 | 68 | ### Macbook Air M3, 24 GB, 8 core (4 performance cores, 4 efficiency cores) 69 | 70 | ``` 71 | Benchmark 1: oxc 72 | Time (mean ± σ): 150.7 ms ± 2.9 ms [User: 640.7 ms, System: 152.2 ms] 73 | Range (min … max): 146.8 ms … 158.8 ms 20 runs 74 | 75 | Warning: Ignoring non-zero exit code. 76 | 77 | Benchmark 2: biome 78 | Time (mean ± σ): 498.8 ms ± 4.1 ms [User: 2729.6 ms, System: 315.9 ms] 79 | Range (min … max): 492.7 ms … 507.8 ms 10 runs 80 | 81 | Warning: Ignoring non-zero exit code. 82 | 83 | Summary 84 | oxc ran 85 | 3.31 ± 0.07 times faster than biome 86 | ``` 87 | 88 | ### Oxlint vs ESLint v9 89 | 90 | ### MacBook Pro M2 Max 12 Cores (8 performance and 4 efficiency) 91 | 92 | ``` 93 | Benchmark 1: oxc 94 | Time (mean ± σ): 499.6 ms ± 9.0 ms [User: 2485.7 ms, System: 165.2 ms] 95 | Range (min … max): 489.6 ms … 516.1 ms 10 runs 96 | 97 | Warning: Ignoring non-zero exit code. 98 | 99 | Benchmark 2: oxc-single-thread 100 | Time (mean ± σ): 1.824 s ± 0.035 s [User: 2.079 s, System: 0.134 s] 101 | Range (min … max): 1.789 s … 1.903 s 10 runs 102 | 103 | Warning: Ignoring non-zero exit code. 104 | 105 | Benchmark 3: eslint 106 | Time (mean ± σ): 31.025 s ± 0.744 s [User: 48.279 s, System: 2.224 s] 107 | Range (min … max): 30.556 s … 33.030 s 10 runs 108 | 109 | Warning: Ignoring non-zero exit code. 110 | 111 | Summary 112 | oxc ran 113 | 3.65 ± 0.10 times faster than oxc-single-thread 114 | 62.10 ± 1.86 times faster than eslint 115 | ``` 116 | 117 | ### Macbook Pro M4 Max, 64 GB 118 | 119 | ``` 120 | Benchmark 1: oxc 121 | Time (mean ± σ): 177.2 ms ± 9.7 ms [User: 1428.0 ms, System: 125.4 ms] 122 | Range (min … max): 163.6 ms … 193.0 ms 17 runs 123 | 124 | Warning: Ignoring non-zero exit code. 125 | 126 | Benchmark 2: eslint 127 | Time (mean ± σ): 20.957 s ± 0.377 s [User: 33.216 s, System: 1.722 s] 128 | Range (min … max): 20.132 s … 21.376 s 10 runs 129 | 130 | Warning: Ignoring non-zero exit code. 131 | 132 | Summary 133 | oxc ran 134 | 118.25 ± 6.78 times faster than eslint 135 | ``` 136 | 137 | ### Macbook Air M3, 24 GB, 8 core (4 performance cores, 4 efficiency cores) 138 | 139 | ``` 140 | Benchmark 1: oxc 141 | Time (mean ± σ): 477.3 ms ± 12.8 ms [User: 2370.8 ms, System: 152.6 ms] 142 | Range (min … max): 451.6 ms … 499.2 ms 10 runs 143 | 144 | Warning: Ignoring non-zero exit code. 145 | 146 | Benchmark 2: oxc-single-thread 147 | Time (mean ± σ): 1.616 s ± 0.013 s [User: 1.848 s, System: 0.111 s] 148 | Range (min … max): 1.606 s … 1.642 s 10 runs 149 | 150 | Warning: Ignoring non-zero exit code. 151 | 152 | Benchmark 3: eslint 153 | Time (mean ± σ): 28.682 s ± 0.303 s [User: 45.572 s, System: 1.748 s] 154 | Range (min … max): 28.318 s … 29.345 s 10 runs 155 | 156 | Warning: Ignoring non-zero exit code. 157 | 158 | Summary 159 | oxc ran 160 | 3.38 ± 0.09 times faster than oxc-single-thread 161 | 60.09 ± 1.73 times faster than eslint 162 | ``` 163 | 164 | ## Vue Core Benchmark Results 165 | 166 | ### Type-Aware Rules Performance 167 | 168 | Oxlint with type-aware rules vs TypeScript ESLint on Vue Core codebase. 169 | 170 | ### MacBook Pro M2 Max 12 Cores (8 performance and 4 efficiency) 171 | 172 | ``` 173 | ./bench.sh 174 | ============================================ 175 | Vue Core Benchmark - Type-Aware Rules 176 | ============================================ 177 | 178 | Oxlint vs TypeScript ESLint with type-aware rules 179 | ------------------------------------------- 180 | Benchmark 1: oxc 181 | Time (mean ± σ): 2.531 s ± 0.055 s [User: 4.919 s, System: 0.588 s] 182 | Range (min … max): 2.462 s … 2.648 s 10 runs 183 | 184 | Warning: Ignoring non-zero exit code. 185 | 186 | Benchmark 2: eslint 187 | ⠇ Performing warmup runs ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ETA 00:00:00 ^R 188 | Time (mean ± σ): 20.800 s ± 0.130 s [User: 26.686 s, System: 3.096 s] 189 | Range (min … max): 20.605 s … 21.055 s 10 runs 190 | 191 | Warning: Ignoring non-zero exit code. 192 | 193 | Summary 194 | oxc ran 195 | 8.22 ± 0.19 times faster than eslint 196 | ``` 197 | 198 | ## Sentry Benchmark Results 199 | 200 | ### Type-Aware Rules Performance 201 | 202 | Oxlint with type-aware rules vs TypeScript ESLint on Sentry codebase. 203 | 204 | ### MacBook Pro M2 Max 12 Cores (8 performance and 4 efficiency) 205 | 206 | ``` 207 | ./bench.sh 208 | ============================================ 209 | Sentry Benchmark - Type-Aware Linting 210 | ============================================ 211 | 212 | Oxlint vs TypeScript ESLint with type-aware rules 213 | ------------------------------------------- 214 | Benchmark 1: oxc 215 | Time (mean ± σ): 4.448 s ± 0.076 s [User: 11.435 s, System: 2.521 s] 216 | Range (min … max): 4.373 s … 4.555 s 10 runs 217 | 218 | Warning: Ignoring non-zero exit code. 219 | 220 | Benchmark 2: eslint 221 | Time (mean ± σ): 55.070 s ± 0.766 s [User: 84.407 s, System: 9.776 s] 222 | Range (min … max): 53.952 s … 56.260 s 10 runs 223 | 224 | Warning: Ignoring non-zero exit code. 225 | 226 | Summary 227 | oxc ran 228 | 12.38 ± 0.27 times faster than eslint 229 | ``` 230 | 231 | ## Run 232 | 233 | ### Run all benchmarks 234 | 235 | ```bash 236 | # Initialize repos and dependencies 237 | ./init.sh 238 | 239 | # Run all benchmarks 240 | ./bench-all.sh 241 | ``` 242 | 243 | ### Run individual benchmarks 244 | 245 | #### VSCode benchmark 246 | 247 | ```bash 248 | cd bench-vscode 249 | ./bench.sh 250 | ``` 251 | 252 | #### Vue benchmark 253 | 254 | ```bash 255 | cd bench-vue 256 | ./bench.sh 257 | ``` 258 | 259 | #### Outline benchmark 260 | 261 | ```bash 262 | cd bench-outline 263 | ./bench.sh 264 | ``` 265 | 266 | #### Sentry benchmark 267 | 268 | ```bash 269 | cd bench-sentry 270 | ./bench.sh 271 | ``` 272 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@biomejs/biome': 12 | specifier: ^2.3.8 13 | version: 2.3.8 14 | '@typescript-eslint/eslint-plugin': 15 | specifier: ^8.48.0 16 | version: 8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3) 17 | '@typescript-eslint/parser': 18 | specifier: ^8.48.0 19 | version: 8.49.0(eslint@9.39.1)(typescript@5.9.3) 20 | eslint: 21 | specifier: ^9.39.1 22 | version: 9.39.1 23 | oxlint: 24 | specifier: ^1.30.0 25 | version: 1.34.0(oxlint-tsgolint@0.10.0) 26 | oxlint-tsgolint: 27 | specifier: ^0.10.0 28 | version: 0.10.0 29 | typescript: 30 | specifier: ^5.9.3 31 | version: 5.9.3 32 | 33 | packages: 34 | 35 | '@biomejs/biome@2.3.8': 36 | resolution: {integrity: sha512-Qjsgoe6FEBxWAUzwFGFrB+1+M8y/y5kwmg5CHac+GSVOdmOIqsAiXM5QMVGZJ1eCUCLlPZtq4aFAQ0eawEUuUA==} 37 | engines: {node: '>=14.21.3'} 38 | hasBin: true 39 | 40 | '@biomejs/cli-darwin-arm64@2.3.8': 41 | resolution: {integrity: sha512-HM4Zg9CGQ3txTPflxD19n8MFPrmUAjaC7PQdLkugeeC0cQ+PiVrd7i09gaBS/11QKsTDBJhVg85CEIK9f50Qww==} 42 | engines: {node: '>=14.21.3'} 43 | cpu: [arm64] 44 | os: [darwin] 45 | 46 | '@biomejs/cli-darwin-x64@2.3.8': 47 | resolution: {integrity: sha512-lUDQ03D7y/qEao7RgdjWVGCu+BLYadhKTm40HkpJIi6kn8LSv5PAwRlew/DmwP4YZ9ke9XXoTIQDO1vAnbRZlA==} 48 | engines: {node: '>=14.21.3'} 49 | cpu: [x64] 50 | os: [darwin] 51 | 52 | '@biomejs/cli-linux-arm64-musl@2.3.8': 53 | resolution: {integrity: sha512-PShR4mM0sjksUMyxbyPNMxoKFPVF48fU8Qe8Sfx6w6F42verbwRLbz+QiKNiDPRJwUoMG1nPM50OBL3aOnTevA==} 54 | engines: {node: '>=14.21.3'} 55 | cpu: [arm64] 56 | os: [linux] 57 | 58 | '@biomejs/cli-linux-arm64@2.3.8': 59 | resolution: {integrity: sha512-Uo1OJnIkJgSgF+USx970fsM/drtPcQ39I+JO+Fjsaa9ZdCN1oysQmy6oAGbyESlouz+rzEckLTF6DS7cWse95g==} 60 | engines: {node: '>=14.21.3'} 61 | cpu: [arm64] 62 | os: [linux] 63 | 64 | '@biomejs/cli-linux-x64-musl@2.3.8': 65 | resolution: {integrity: sha512-YGLkqU91r1276uwSjiUD/xaVikdxgV1QpsicT0bIA1TaieM6E5ibMZeSyjQ/izBn4tKQthUSsVZacmoJfa3pDA==} 66 | engines: {node: '>=14.21.3'} 67 | cpu: [x64] 68 | os: [linux] 69 | 70 | '@biomejs/cli-linux-x64@2.3.8': 71 | resolution: {integrity: sha512-QDPMD5bQz6qOVb3kiBui0zKZXASLo0NIQ9JVJio5RveBEFgDgsvJFUvZIbMbUZT3T00M/1wdzwWXk4GIh0KaAw==} 72 | engines: {node: '>=14.21.3'} 73 | cpu: [x64] 74 | os: [linux] 75 | 76 | '@biomejs/cli-win32-arm64@2.3.8': 77 | resolution: {integrity: sha512-H4IoCHvL1fXKDrTALeTKMiE7GGWFAraDwBYFquE/L/5r1927Te0mYIGseXi4F+lrrwhSWbSGt5qPFswNoBaCxg==} 78 | engines: {node: '>=14.21.3'} 79 | cpu: [arm64] 80 | os: [win32] 81 | 82 | '@biomejs/cli-win32-x64@2.3.8': 83 | resolution: {integrity: sha512-RguzimPoZWtBapfKhKjcWXBVI91tiSprqdBYu7tWhgN8pKRZhw24rFeNZTNf6UiBfjCYCi9eFQs/JzJZIhuK4w==} 84 | engines: {node: '>=14.21.3'} 85 | cpu: [x64] 86 | os: [win32] 87 | 88 | '@eslint-community/eslint-utils@4.9.0': 89 | resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} 90 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 91 | peerDependencies: 92 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 93 | 94 | '@eslint-community/regexpp@4.12.2': 95 | resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} 96 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 97 | 98 | '@eslint/config-array@0.21.1': 99 | resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} 100 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 101 | 102 | '@eslint/config-helpers@0.4.2': 103 | resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} 104 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 105 | 106 | '@eslint/core@0.17.0': 107 | resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} 108 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 109 | 110 | '@eslint/eslintrc@3.3.3': 111 | resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} 112 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 113 | 114 | '@eslint/js@9.39.1': 115 | resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==} 116 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 117 | 118 | '@eslint/object-schema@2.1.7': 119 | resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} 120 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 121 | 122 | '@eslint/plugin-kit@0.4.1': 123 | resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} 124 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 125 | 126 | '@humanfs/core@0.19.1': 127 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 128 | engines: {node: '>=18.18.0'} 129 | 130 | '@humanfs/node@0.16.7': 131 | resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} 132 | engines: {node: '>=18.18.0'} 133 | 134 | '@humanwhocodes/module-importer@1.0.1': 135 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 136 | engines: {node: '>=12.22'} 137 | 138 | '@humanwhocodes/retry@0.4.3': 139 | resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} 140 | engines: {node: '>=18.18'} 141 | 142 | '@oxlint-tsgolint/darwin-arm64@0.10.0': 143 | resolution: {integrity: sha512-mhBF/pjey0UdLL1ocU46Fqta+uJuRfqrLfDpcViRg17BtDiUNd8JY9iN2FOoS2HGSCAgCUjZ0AZkwkHwFs/VTw==} 144 | cpu: [arm64] 145 | os: [darwin] 146 | 147 | '@oxlint-tsgolint/darwin-x64@0.10.0': 148 | resolution: {integrity: sha512-roLi34mw/i1z+NS7luboix55SXyhVv38dNUTcRDkk+0lNPzI9ngrM+1y1N2oBSUmz5o9OZGnfJJ7BSGCw/fFEQ==} 149 | cpu: [x64] 150 | os: [darwin] 151 | 152 | '@oxlint-tsgolint/linux-arm64@0.10.0': 153 | resolution: {integrity: sha512-HL9NThPH1V2F6l9XhwNmhQZUknN4m4yQYEvQFFGfZTYN6cvEEBIiqfF4KvBUg8c0xadMbQlW+Ug7/ybA9Nn+CA==} 154 | cpu: [arm64] 155 | os: [linux] 156 | 157 | '@oxlint-tsgolint/linux-x64@0.10.0': 158 | resolution: {integrity: sha512-Tw8QNq8ab+4+qE5krvJyMA66v6XE3GoiISRD5WmJ7YOxUnu//jSw/bBm7OYf/TNEZyeV0BTR7zXzhT5R+VFWlQ==} 159 | cpu: [x64] 160 | os: [linux] 161 | 162 | '@oxlint-tsgolint/win32-arm64@0.10.0': 163 | resolution: {integrity: sha512-LTogmTRwpwQqVaH1Ama8Wd5/VVZWBSF8v5qTbeT628+1F5Kt1V5eHBvyFh4oN18UCZlgqrh7DqkDhsieXUaC8Q==} 164 | cpu: [arm64] 165 | os: [win32] 166 | 167 | '@oxlint-tsgolint/win32-x64@0.10.0': 168 | resolution: {integrity: sha512-ygqxx8EmNWy9/wCQS5uXq9k/o2EyYNwNxY1ZHNzlmZC/kV06Aemx5OBDafefawBNqH7xTZPfccUrjdiy+QlTrw==} 169 | cpu: [x64] 170 | os: [win32] 171 | 172 | '@oxlint/darwin-arm64@1.34.0': 173 | resolution: {integrity: sha512-euz3Dtp5/UE9axFkQnllOWp3gOwoqaxfZPUUwiW8HBelqhI9PRMVIfQ/akmwl+G5XixQZIgXkXQ5SJxnb1+Qww==} 174 | cpu: [arm64] 175 | os: [darwin] 176 | 177 | '@oxlint/darwin-x64@1.34.0': 178 | resolution: {integrity: sha512-XpmNviE5KOnHkhmQPwJJIBs+mJkr0qItTZBN4dz+O3p9gWN+gCqi3CBP71RiVahZw4qAEQSgY4wro+z0kx+erg==} 179 | cpu: [x64] 180 | os: [darwin] 181 | 182 | '@oxlint/linux-arm64-gnu@1.34.0': 183 | resolution: {integrity: sha512-aCPdoEUGsJGF9y88vDYoaugG4IEGwSBa+usyuAvEVl3vTfuTmE0RDQEC1Z+WnJ3J/cIEpbgKOzS12VwbzFicjg==} 184 | cpu: [arm64] 185 | os: [linux] 186 | 187 | '@oxlint/linux-arm64-musl@1.34.0': 188 | resolution: {integrity: sha512-cMo72LQBFmdnVLRKLAHD94ZUBq5Z+aA9Y+RKzkjhCmJuef5ZAfKC24TJD/6c5LxGYzkwwmyySoQAHq5B69i3PQ==} 189 | cpu: [arm64] 190 | os: [linux] 191 | 192 | '@oxlint/linux-x64-gnu@1.34.0': 193 | resolution: {integrity: sha512-+9xFhhkqgNIysEh+uHvcba8v4UtL1YzxuyDS2wTLdWrkGvIllCx5WjJItt3K/AhwatciksgNEXSo2Hh4fcQRog==} 194 | cpu: [x64] 195 | os: [linux] 196 | 197 | '@oxlint/linux-x64-musl@1.34.0': 198 | resolution: {integrity: sha512-qa7TL2DfEDdMeSP5UiU5JMs6D2PW7ZJAQ0WZYTgqDV8BlZ6nMkIYVBVIk3QPxIfkyxvfJVbG1RB3PkSWDcfwpA==} 199 | cpu: [x64] 200 | os: [linux] 201 | 202 | '@oxlint/win32-arm64@1.34.0': 203 | resolution: {integrity: sha512-mSJumUveg1S3DiOgvsrVNAGuvenBbbC/zsfT1qhltT+GLhJ7RPBK2I/jz0fTdE+I7M9/as8yc0XJ/eY23y2amA==} 204 | cpu: [arm64] 205 | os: [win32] 206 | 207 | '@oxlint/win32-x64@1.34.0': 208 | resolution: {integrity: sha512-izsDDt5WY4FSISCkPRLUYQD1aRaaEJkPLtEZe3DlioSUdUVAdvVbE+BGllFqR16DWfTTwO/6K4jDeooxQzTMjw==} 209 | cpu: [x64] 210 | os: [win32] 211 | 212 | '@types/estree@1.0.8': 213 | resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 214 | 215 | '@types/json-schema@7.0.15': 216 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 217 | 218 | '@typescript-eslint/eslint-plugin@8.49.0': 219 | resolution: {integrity: sha512-JXij0vzIaTtCwu6SxTh8qBc66kmf1xs7pI4UOiMDFVct6q86G0Zs7KRcEoJgY3Cav3x5Tq0MF5jwgpgLqgKG3A==} 220 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 221 | peerDependencies: 222 | '@typescript-eslint/parser': ^8.49.0 223 | eslint: ^8.57.0 || ^9.0.0 224 | typescript: '>=4.8.4 <6.0.0' 225 | 226 | '@typescript-eslint/parser@8.49.0': 227 | resolution: {integrity: sha512-N9lBGA9o9aqb1hVMc9hzySbhKibHmB+N3IpoShyV6HyQYRGIhlrO5rQgttypi+yEeKsKI4idxC8Jw6gXKD4THA==} 228 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 229 | peerDependencies: 230 | eslint: ^8.57.0 || ^9.0.0 231 | typescript: '>=4.8.4 <6.0.0' 232 | 233 | '@typescript-eslint/project-service@8.49.0': 234 | resolution: {integrity: sha512-/wJN0/DKkmRUMXjZUXYZpD1NEQzQAAn9QWfGwo+Ai8gnzqH7tvqS7oNVdTjKqOcPyVIdZdyCMoqN66Ia789e7g==} 235 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 236 | peerDependencies: 237 | typescript: '>=4.8.4 <6.0.0' 238 | 239 | '@typescript-eslint/scope-manager@8.49.0': 240 | resolution: {integrity: sha512-npgS3zi+/30KSOkXNs0LQXtsg9ekZ8OISAOLGWA/ZOEn0ZH74Ginfl7foziV8DT+D98WfQ5Kopwqb/PZOaIJGg==} 241 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 242 | 243 | '@typescript-eslint/tsconfig-utils@8.49.0': 244 | resolution: {integrity: sha512-8prixNi1/6nawsRYxet4YOhnbW+W9FK/bQPxsGB1D3ZrDzbJ5FXw5XmzxZv82X3B+ZccuSxo/X8q9nQ+mFecWA==} 245 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 246 | peerDependencies: 247 | typescript: '>=4.8.4 <6.0.0' 248 | 249 | '@typescript-eslint/type-utils@8.49.0': 250 | resolution: {integrity: sha512-KTExJfQ+svY8I10P4HdxKzWsvtVnsuCifU5MvXrRwoP2KOlNZ9ADNEWWsQTJgMxLzS5VLQKDjkCT/YzgsnqmZg==} 251 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 252 | peerDependencies: 253 | eslint: ^8.57.0 || ^9.0.0 254 | typescript: '>=4.8.4 <6.0.0' 255 | 256 | '@typescript-eslint/types@8.49.0': 257 | resolution: {integrity: sha512-e9k/fneezorUo6WShlQpMxXh8/8wfyc+biu6tnAqA81oWrEic0k21RHzP9uqqpyBBeBKu4T+Bsjy9/b8u7obXQ==} 258 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 259 | 260 | '@typescript-eslint/typescript-estree@8.49.0': 261 | resolution: {integrity: sha512-jrLdRuAbPfPIdYNppHJ/D0wN+wwNfJ32YTAm10eJVsFmrVpXQnDWBn8niCSMlWjvml8jsce5E/O+86IQtTbJWA==} 262 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 263 | peerDependencies: 264 | typescript: '>=4.8.4 <6.0.0' 265 | 266 | '@typescript-eslint/utils@8.49.0': 267 | resolution: {integrity: sha512-N3W7rJw7Rw+z1tRsHZbK395TWSYvufBXumYtEGzypgMUthlg0/hmCImeA8hgO2d2G4pd7ftpxxul2J8OdtdaFA==} 268 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 269 | peerDependencies: 270 | eslint: ^8.57.0 || ^9.0.0 271 | typescript: '>=4.8.4 <6.0.0' 272 | 273 | '@typescript-eslint/visitor-keys@8.49.0': 274 | resolution: {integrity: sha512-LlKaciDe3GmZFphXIc79THF/YYBugZ7FS1pO581E/edlVVNbZKDy93evqmrfQ9/Y4uN0vVhX4iuchq26mK/iiA==} 275 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 276 | 277 | acorn-jsx@5.3.2: 278 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 279 | peerDependencies: 280 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 281 | 282 | acorn@8.15.0: 283 | resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} 284 | engines: {node: '>=0.4.0'} 285 | hasBin: true 286 | 287 | ajv@6.12.6: 288 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 289 | 290 | ansi-styles@4.3.0: 291 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 292 | engines: {node: '>=8'} 293 | 294 | argparse@2.0.1: 295 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 296 | 297 | balanced-match@1.0.2: 298 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 299 | 300 | brace-expansion@1.1.12: 301 | resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} 302 | 303 | brace-expansion@2.0.2: 304 | resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} 305 | 306 | callsites@3.1.0: 307 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 308 | engines: {node: '>=6'} 309 | 310 | chalk@4.1.2: 311 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 312 | engines: {node: '>=10'} 313 | 314 | color-convert@2.0.1: 315 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 316 | engines: {node: '>=7.0.0'} 317 | 318 | color-name@1.1.4: 319 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 320 | 321 | concat-map@0.0.1: 322 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 323 | 324 | cross-spawn@7.0.6: 325 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 326 | engines: {node: '>= 8'} 327 | 328 | debug@4.4.3: 329 | resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} 330 | engines: {node: '>=6.0'} 331 | peerDependencies: 332 | supports-color: '*' 333 | peerDependenciesMeta: 334 | supports-color: 335 | optional: true 336 | 337 | deep-is@0.1.4: 338 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 339 | 340 | escape-string-regexp@4.0.0: 341 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 342 | engines: {node: '>=10'} 343 | 344 | eslint-scope@8.4.0: 345 | resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} 346 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 347 | 348 | eslint-visitor-keys@3.4.3: 349 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 350 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 351 | 352 | eslint-visitor-keys@4.2.1: 353 | resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} 354 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 355 | 356 | eslint@9.39.1: 357 | resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==} 358 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 359 | hasBin: true 360 | peerDependencies: 361 | jiti: '*' 362 | peerDependenciesMeta: 363 | jiti: 364 | optional: true 365 | 366 | espree@10.4.0: 367 | resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} 368 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 369 | 370 | esquery@1.6.0: 371 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 372 | engines: {node: '>=0.10'} 373 | 374 | esrecurse@4.3.0: 375 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 376 | engines: {node: '>=4.0'} 377 | 378 | estraverse@5.3.0: 379 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 380 | engines: {node: '>=4.0'} 381 | 382 | esutils@2.0.3: 383 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 384 | engines: {node: '>=0.10.0'} 385 | 386 | fast-deep-equal@3.1.3: 387 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 388 | 389 | fast-json-stable-stringify@2.1.0: 390 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 391 | 392 | fast-levenshtein@2.0.6: 393 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 394 | 395 | fdir@6.5.0: 396 | resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} 397 | engines: {node: '>=12.0.0'} 398 | peerDependencies: 399 | picomatch: ^3 || ^4 400 | peerDependenciesMeta: 401 | picomatch: 402 | optional: true 403 | 404 | file-entry-cache@8.0.0: 405 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 406 | engines: {node: '>=16.0.0'} 407 | 408 | find-up@5.0.0: 409 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 410 | engines: {node: '>=10'} 411 | 412 | flat-cache@4.0.1: 413 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 414 | engines: {node: '>=16'} 415 | 416 | flatted@3.3.3: 417 | resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} 418 | 419 | glob-parent@6.0.2: 420 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 421 | engines: {node: '>=10.13.0'} 422 | 423 | globals@14.0.0: 424 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 425 | engines: {node: '>=18'} 426 | 427 | has-flag@4.0.0: 428 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 429 | engines: {node: '>=8'} 430 | 431 | ignore@5.3.2: 432 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 433 | engines: {node: '>= 4'} 434 | 435 | ignore@7.0.5: 436 | resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} 437 | engines: {node: '>= 4'} 438 | 439 | import-fresh@3.3.1: 440 | resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 441 | engines: {node: '>=6'} 442 | 443 | imurmurhash@0.1.4: 444 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 445 | engines: {node: '>=0.8.19'} 446 | 447 | is-extglob@2.1.1: 448 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 449 | engines: {node: '>=0.10.0'} 450 | 451 | is-glob@4.0.3: 452 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 453 | engines: {node: '>=0.10.0'} 454 | 455 | isexe@2.0.0: 456 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 457 | 458 | js-yaml@4.1.1: 459 | resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} 460 | hasBin: true 461 | 462 | json-buffer@3.0.1: 463 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 464 | 465 | json-schema-traverse@0.4.1: 466 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 467 | 468 | json-stable-stringify-without-jsonify@1.0.1: 469 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 470 | 471 | keyv@4.5.4: 472 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 473 | 474 | levn@0.4.1: 475 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 476 | engines: {node: '>= 0.8.0'} 477 | 478 | locate-path@6.0.0: 479 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 480 | engines: {node: '>=10'} 481 | 482 | lodash.merge@4.6.2: 483 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 484 | 485 | minimatch@3.1.2: 486 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 487 | 488 | minimatch@9.0.5: 489 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 490 | engines: {node: '>=16 || 14 >=14.17'} 491 | 492 | ms@2.1.3: 493 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 494 | 495 | natural-compare@1.4.0: 496 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 497 | 498 | optionator@0.9.4: 499 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 500 | engines: {node: '>= 0.8.0'} 501 | 502 | oxlint-tsgolint@0.10.0: 503 | resolution: {integrity: sha512-LDDSIu5J/4D4gFUuQQIEQpAC6maNEbMg4nC8JL/+Pe0cUDR86dtVZ09E2x5MwCh8f9yfktoaxt5x6UIVyzrajg==} 504 | hasBin: true 505 | 506 | oxlint@1.34.0: 507 | resolution: {integrity: sha512-Ni0N8wAiKlgaYkI/Yz4VrutfVIZgd2shDtS+loQxyBTwO8YUAnk3+g7OQ1cyI/aatHiFwvFNfV/uvZyHUtyPpA==} 508 | engines: {node: ^20.19.0 || >=22.12.0} 509 | hasBin: true 510 | peerDependencies: 511 | oxlint-tsgolint: '>=0.9.2' 512 | peerDependenciesMeta: 513 | oxlint-tsgolint: 514 | optional: true 515 | 516 | p-limit@3.1.0: 517 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 518 | engines: {node: '>=10'} 519 | 520 | p-locate@5.0.0: 521 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 522 | engines: {node: '>=10'} 523 | 524 | parent-module@1.0.1: 525 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 526 | engines: {node: '>=6'} 527 | 528 | path-exists@4.0.0: 529 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 530 | engines: {node: '>=8'} 531 | 532 | path-key@3.1.1: 533 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 534 | engines: {node: '>=8'} 535 | 536 | picomatch@4.0.3: 537 | resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 538 | engines: {node: '>=12'} 539 | 540 | prelude-ls@1.2.1: 541 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 542 | engines: {node: '>= 0.8.0'} 543 | 544 | punycode@2.3.1: 545 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 546 | engines: {node: '>=6'} 547 | 548 | resolve-from@4.0.0: 549 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 550 | engines: {node: '>=4'} 551 | 552 | semver@7.7.3: 553 | resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} 554 | engines: {node: '>=10'} 555 | hasBin: true 556 | 557 | shebang-command@2.0.0: 558 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 559 | engines: {node: '>=8'} 560 | 561 | shebang-regex@3.0.0: 562 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 563 | engines: {node: '>=8'} 564 | 565 | strip-json-comments@3.1.1: 566 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 567 | engines: {node: '>=8'} 568 | 569 | supports-color@7.2.0: 570 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 571 | engines: {node: '>=8'} 572 | 573 | tinyglobby@0.2.15: 574 | resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} 575 | engines: {node: '>=12.0.0'} 576 | 577 | ts-api-utils@2.1.0: 578 | resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} 579 | engines: {node: '>=18.12'} 580 | peerDependencies: 581 | typescript: '>=4.8.4' 582 | 583 | type-check@0.4.0: 584 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 585 | engines: {node: '>= 0.8.0'} 586 | 587 | typescript@5.9.3: 588 | resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} 589 | engines: {node: '>=14.17'} 590 | hasBin: true 591 | 592 | uri-js@4.4.1: 593 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 594 | 595 | which@2.0.2: 596 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 597 | engines: {node: '>= 8'} 598 | hasBin: true 599 | 600 | word-wrap@1.2.5: 601 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 602 | engines: {node: '>=0.10.0'} 603 | 604 | yocto-queue@0.1.0: 605 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 606 | engines: {node: '>=10'} 607 | 608 | snapshots: 609 | 610 | '@biomejs/biome@2.3.8': 611 | optionalDependencies: 612 | '@biomejs/cli-darwin-arm64': 2.3.8 613 | '@biomejs/cli-darwin-x64': 2.3.8 614 | '@biomejs/cli-linux-arm64': 2.3.8 615 | '@biomejs/cli-linux-arm64-musl': 2.3.8 616 | '@biomejs/cli-linux-x64': 2.3.8 617 | '@biomejs/cli-linux-x64-musl': 2.3.8 618 | '@biomejs/cli-win32-arm64': 2.3.8 619 | '@biomejs/cli-win32-x64': 2.3.8 620 | 621 | '@biomejs/cli-darwin-arm64@2.3.8': 622 | optional: true 623 | 624 | '@biomejs/cli-darwin-x64@2.3.8': 625 | optional: true 626 | 627 | '@biomejs/cli-linux-arm64-musl@2.3.8': 628 | optional: true 629 | 630 | '@biomejs/cli-linux-arm64@2.3.8': 631 | optional: true 632 | 633 | '@biomejs/cli-linux-x64-musl@2.3.8': 634 | optional: true 635 | 636 | '@biomejs/cli-linux-x64@2.3.8': 637 | optional: true 638 | 639 | '@biomejs/cli-win32-arm64@2.3.8': 640 | optional: true 641 | 642 | '@biomejs/cli-win32-x64@2.3.8': 643 | optional: true 644 | 645 | '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1)': 646 | dependencies: 647 | eslint: 9.39.1 648 | eslint-visitor-keys: 3.4.3 649 | 650 | '@eslint-community/regexpp@4.12.2': {} 651 | 652 | '@eslint/config-array@0.21.1': 653 | dependencies: 654 | '@eslint/object-schema': 2.1.7 655 | debug: 4.4.3 656 | minimatch: 3.1.2 657 | transitivePeerDependencies: 658 | - supports-color 659 | 660 | '@eslint/config-helpers@0.4.2': 661 | dependencies: 662 | '@eslint/core': 0.17.0 663 | 664 | '@eslint/core@0.17.0': 665 | dependencies: 666 | '@types/json-schema': 7.0.15 667 | 668 | '@eslint/eslintrc@3.3.3': 669 | dependencies: 670 | ajv: 6.12.6 671 | debug: 4.4.3 672 | espree: 10.4.0 673 | globals: 14.0.0 674 | ignore: 5.3.2 675 | import-fresh: 3.3.1 676 | js-yaml: 4.1.1 677 | minimatch: 3.1.2 678 | strip-json-comments: 3.1.1 679 | transitivePeerDependencies: 680 | - supports-color 681 | 682 | '@eslint/js@9.39.1': {} 683 | 684 | '@eslint/object-schema@2.1.7': {} 685 | 686 | '@eslint/plugin-kit@0.4.1': 687 | dependencies: 688 | '@eslint/core': 0.17.0 689 | levn: 0.4.1 690 | 691 | '@humanfs/core@0.19.1': {} 692 | 693 | '@humanfs/node@0.16.7': 694 | dependencies: 695 | '@humanfs/core': 0.19.1 696 | '@humanwhocodes/retry': 0.4.3 697 | 698 | '@humanwhocodes/module-importer@1.0.1': {} 699 | 700 | '@humanwhocodes/retry@0.4.3': {} 701 | 702 | '@oxlint-tsgolint/darwin-arm64@0.10.0': 703 | optional: true 704 | 705 | '@oxlint-tsgolint/darwin-x64@0.10.0': 706 | optional: true 707 | 708 | '@oxlint-tsgolint/linux-arm64@0.10.0': 709 | optional: true 710 | 711 | '@oxlint-tsgolint/linux-x64@0.10.0': 712 | optional: true 713 | 714 | '@oxlint-tsgolint/win32-arm64@0.10.0': 715 | optional: true 716 | 717 | '@oxlint-tsgolint/win32-x64@0.10.0': 718 | optional: true 719 | 720 | '@oxlint/darwin-arm64@1.34.0': 721 | optional: true 722 | 723 | '@oxlint/darwin-x64@1.34.0': 724 | optional: true 725 | 726 | '@oxlint/linux-arm64-gnu@1.34.0': 727 | optional: true 728 | 729 | '@oxlint/linux-arm64-musl@1.34.0': 730 | optional: true 731 | 732 | '@oxlint/linux-x64-gnu@1.34.0': 733 | optional: true 734 | 735 | '@oxlint/linux-x64-musl@1.34.0': 736 | optional: true 737 | 738 | '@oxlint/win32-arm64@1.34.0': 739 | optional: true 740 | 741 | '@oxlint/win32-x64@1.34.0': 742 | optional: true 743 | 744 | '@types/estree@1.0.8': {} 745 | 746 | '@types/json-schema@7.0.15': {} 747 | 748 | '@typescript-eslint/eslint-plugin@8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)': 749 | dependencies: 750 | '@eslint-community/regexpp': 4.12.2 751 | '@typescript-eslint/parser': 8.49.0(eslint@9.39.1)(typescript@5.9.3) 752 | '@typescript-eslint/scope-manager': 8.49.0 753 | '@typescript-eslint/type-utils': 8.49.0(eslint@9.39.1)(typescript@5.9.3) 754 | '@typescript-eslint/utils': 8.49.0(eslint@9.39.1)(typescript@5.9.3) 755 | '@typescript-eslint/visitor-keys': 8.49.0 756 | eslint: 9.39.1 757 | ignore: 7.0.5 758 | natural-compare: 1.4.0 759 | ts-api-utils: 2.1.0(typescript@5.9.3) 760 | typescript: 5.9.3 761 | transitivePeerDependencies: 762 | - supports-color 763 | 764 | '@typescript-eslint/parser@8.49.0(eslint@9.39.1)(typescript@5.9.3)': 765 | dependencies: 766 | '@typescript-eslint/scope-manager': 8.49.0 767 | '@typescript-eslint/types': 8.49.0 768 | '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3) 769 | '@typescript-eslint/visitor-keys': 8.49.0 770 | debug: 4.4.3 771 | eslint: 9.39.1 772 | typescript: 5.9.3 773 | transitivePeerDependencies: 774 | - supports-color 775 | 776 | '@typescript-eslint/project-service@8.49.0(typescript@5.9.3)': 777 | dependencies: 778 | '@typescript-eslint/tsconfig-utils': 8.49.0(typescript@5.9.3) 779 | '@typescript-eslint/types': 8.49.0 780 | debug: 4.4.3 781 | typescript: 5.9.3 782 | transitivePeerDependencies: 783 | - supports-color 784 | 785 | '@typescript-eslint/scope-manager@8.49.0': 786 | dependencies: 787 | '@typescript-eslint/types': 8.49.0 788 | '@typescript-eslint/visitor-keys': 8.49.0 789 | 790 | '@typescript-eslint/tsconfig-utils@8.49.0(typescript@5.9.3)': 791 | dependencies: 792 | typescript: 5.9.3 793 | 794 | '@typescript-eslint/type-utils@8.49.0(eslint@9.39.1)(typescript@5.9.3)': 795 | dependencies: 796 | '@typescript-eslint/types': 8.49.0 797 | '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3) 798 | '@typescript-eslint/utils': 8.49.0(eslint@9.39.1)(typescript@5.9.3) 799 | debug: 4.4.3 800 | eslint: 9.39.1 801 | ts-api-utils: 2.1.0(typescript@5.9.3) 802 | typescript: 5.9.3 803 | transitivePeerDependencies: 804 | - supports-color 805 | 806 | '@typescript-eslint/types@8.49.0': {} 807 | 808 | '@typescript-eslint/typescript-estree@8.49.0(typescript@5.9.3)': 809 | dependencies: 810 | '@typescript-eslint/project-service': 8.49.0(typescript@5.9.3) 811 | '@typescript-eslint/tsconfig-utils': 8.49.0(typescript@5.9.3) 812 | '@typescript-eslint/types': 8.49.0 813 | '@typescript-eslint/visitor-keys': 8.49.0 814 | debug: 4.4.3 815 | minimatch: 9.0.5 816 | semver: 7.7.3 817 | tinyglobby: 0.2.15 818 | ts-api-utils: 2.1.0(typescript@5.9.3) 819 | typescript: 5.9.3 820 | transitivePeerDependencies: 821 | - supports-color 822 | 823 | '@typescript-eslint/utils@8.49.0(eslint@9.39.1)(typescript@5.9.3)': 824 | dependencies: 825 | '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) 826 | '@typescript-eslint/scope-manager': 8.49.0 827 | '@typescript-eslint/types': 8.49.0 828 | '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3) 829 | eslint: 9.39.1 830 | typescript: 5.9.3 831 | transitivePeerDependencies: 832 | - supports-color 833 | 834 | '@typescript-eslint/visitor-keys@8.49.0': 835 | dependencies: 836 | '@typescript-eslint/types': 8.49.0 837 | eslint-visitor-keys: 4.2.1 838 | 839 | acorn-jsx@5.3.2(acorn@8.15.0): 840 | dependencies: 841 | acorn: 8.15.0 842 | 843 | acorn@8.15.0: {} 844 | 845 | ajv@6.12.6: 846 | dependencies: 847 | fast-deep-equal: 3.1.3 848 | fast-json-stable-stringify: 2.1.0 849 | json-schema-traverse: 0.4.1 850 | uri-js: 4.4.1 851 | 852 | ansi-styles@4.3.0: 853 | dependencies: 854 | color-convert: 2.0.1 855 | 856 | argparse@2.0.1: {} 857 | 858 | balanced-match@1.0.2: {} 859 | 860 | brace-expansion@1.1.12: 861 | dependencies: 862 | balanced-match: 1.0.2 863 | concat-map: 0.0.1 864 | 865 | brace-expansion@2.0.2: 866 | dependencies: 867 | balanced-match: 1.0.2 868 | 869 | callsites@3.1.0: {} 870 | 871 | chalk@4.1.2: 872 | dependencies: 873 | ansi-styles: 4.3.0 874 | supports-color: 7.2.0 875 | 876 | color-convert@2.0.1: 877 | dependencies: 878 | color-name: 1.1.4 879 | 880 | color-name@1.1.4: {} 881 | 882 | concat-map@0.0.1: {} 883 | 884 | cross-spawn@7.0.6: 885 | dependencies: 886 | path-key: 3.1.1 887 | shebang-command: 2.0.0 888 | which: 2.0.2 889 | 890 | debug@4.4.3: 891 | dependencies: 892 | ms: 2.1.3 893 | 894 | deep-is@0.1.4: {} 895 | 896 | escape-string-regexp@4.0.0: {} 897 | 898 | eslint-scope@8.4.0: 899 | dependencies: 900 | esrecurse: 4.3.0 901 | estraverse: 5.3.0 902 | 903 | eslint-visitor-keys@3.4.3: {} 904 | 905 | eslint-visitor-keys@4.2.1: {} 906 | 907 | eslint@9.39.1: 908 | dependencies: 909 | '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) 910 | '@eslint-community/regexpp': 4.12.2 911 | '@eslint/config-array': 0.21.1 912 | '@eslint/config-helpers': 0.4.2 913 | '@eslint/core': 0.17.0 914 | '@eslint/eslintrc': 3.3.3 915 | '@eslint/js': 9.39.1 916 | '@eslint/plugin-kit': 0.4.1 917 | '@humanfs/node': 0.16.7 918 | '@humanwhocodes/module-importer': 1.0.1 919 | '@humanwhocodes/retry': 0.4.3 920 | '@types/estree': 1.0.8 921 | ajv: 6.12.6 922 | chalk: 4.1.2 923 | cross-spawn: 7.0.6 924 | debug: 4.4.3 925 | escape-string-regexp: 4.0.0 926 | eslint-scope: 8.4.0 927 | eslint-visitor-keys: 4.2.1 928 | espree: 10.4.0 929 | esquery: 1.6.0 930 | esutils: 2.0.3 931 | fast-deep-equal: 3.1.3 932 | file-entry-cache: 8.0.0 933 | find-up: 5.0.0 934 | glob-parent: 6.0.2 935 | ignore: 5.3.2 936 | imurmurhash: 0.1.4 937 | is-glob: 4.0.3 938 | json-stable-stringify-without-jsonify: 1.0.1 939 | lodash.merge: 4.6.2 940 | minimatch: 3.1.2 941 | natural-compare: 1.4.0 942 | optionator: 0.9.4 943 | transitivePeerDependencies: 944 | - supports-color 945 | 946 | espree@10.4.0: 947 | dependencies: 948 | acorn: 8.15.0 949 | acorn-jsx: 5.3.2(acorn@8.15.0) 950 | eslint-visitor-keys: 4.2.1 951 | 952 | esquery@1.6.0: 953 | dependencies: 954 | estraverse: 5.3.0 955 | 956 | esrecurse@4.3.0: 957 | dependencies: 958 | estraverse: 5.3.0 959 | 960 | estraverse@5.3.0: {} 961 | 962 | esutils@2.0.3: {} 963 | 964 | fast-deep-equal@3.1.3: {} 965 | 966 | fast-json-stable-stringify@2.1.0: {} 967 | 968 | fast-levenshtein@2.0.6: {} 969 | 970 | fdir@6.5.0(picomatch@4.0.3): 971 | optionalDependencies: 972 | picomatch: 4.0.3 973 | 974 | file-entry-cache@8.0.0: 975 | dependencies: 976 | flat-cache: 4.0.1 977 | 978 | find-up@5.0.0: 979 | dependencies: 980 | locate-path: 6.0.0 981 | path-exists: 4.0.0 982 | 983 | flat-cache@4.0.1: 984 | dependencies: 985 | flatted: 3.3.3 986 | keyv: 4.5.4 987 | 988 | flatted@3.3.3: {} 989 | 990 | glob-parent@6.0.2: 991 | dependencies: 992 | is-glob: 4.0.3 993 | 994 | globals@14.0.0: {} 995 | 996 | has-flag@4.0.0: {} 997 | 998 | ignore@5.3.2: {} 999 | 1000 | ignore@7.0.5: {} 1001 | 1002 | import-fresh@3.3.1: 1003 | dependencies: 1004 | parent-module: 1.0.1 1005 | resolve-from: 4.0.0 1006 | 1007 | imurmurhash@0.1.4: {} 1008 | 1009 | is-extglob@2.1.1: {} 1010 | 1011 | is-glob@4.0.3: 1012 | dependencies: 1013 | is-extglob: 2.1.1 1014 | 1015 | isexe@2.0.0: {} 1016 | 1017 | js-yaml@4.1.1: 1018 | dependencies: 1019 | argparse: 2.0.1 1020 | 1021 | json-buffer@3.0.1: {} 1022 | 1023 | json-schema-traverse@0.4.1: {} 1024 | 1025 | json-stable-stringify-without-jsonify@1.0.1: {} 1026 | 1027 | keyv@4.5.4: 1028 | dependencies: 1029 | json-buffer: 3.0.1 1030 | 1031 | levn@0.4.1: 1032 | dependencies: 1033 | prelude-ls: 1.2.1 1034 | type-check: 0.4.0 1035 | 1036 | locate-path@6.0.0: 1037 | dependencies: 1038 | p-locate: 5.0.0 1039 | 1040 | lodash.merge@4.6.2: {} 1041 | 1042 | minimatch@3.1.2: 1043 | dependencies: 1044 | brace-expansion: 1.1.12 1045 | 1046 | minimatch@9.0.5: 1047 | dependencies: 1048 | brace-expansion: 2.0.2 1049 | 1050 | ms@2.1.3: {} 1051 | 1052 | natural-compare@1.4.0: {} 1053 | 1054 | optionator@0.9.4: 1055 | dependencies: 1056 | deep-is: 0.1.4 1057 | fast-levenshtein: 2.0.6 1058 | levn: 0.4.1 1059 | prelude-ls: 1.2.1 1060 | type-check: 0.4.0 1061 | word-wrap: 1.2.5 1062 | 1063 | oxlint-tsgolint@0.10.0: 1064 | optionalDependencies: 1065 | '@oxlint-tsgolint/darwin-arm64': 0.10.0 1066 | '@oxlint-tsgolint/darwin-x64': 0.10.0 1067 | '@oxlint-tsgolint/linux-arm64': 0.10.0 1068 | '@oxlint-tsgolint/linux-x64': 0.10.0 1069 | '@oxlint-tsgolint/win32-arm64': 0.10.0 1070 | '@oxlint-tsgolint/win32-x64': 0.10.0 1071 | 1072 | oxlint@1.34.0(oxlint-tsgolint@0.10.0): 1073 | optionalDependencies: 1074 | '@oxlint/darwin-arm64': 1.34.0 1075 | '@oxlint/darwin-x64': 1.34.0 1076 | '@oxlint/linux-arm64-gnu': 1.34.0 1077 | '@oxlint/linux-arm64-musl': 1.34.0 1078 | '@oxlint/linux-x64-gnu': 1.34.0 1079 | '@oxlint/linux-x64-musl': 1.34.0 1080 | '@oxlint/win32-arm64': 1.34.0 1081 | '@oxlint/win32-x64': 1.34.0 1082 | oxlint-tsgolint: 0.10.0 1083 | 1084 | p-limit@3.1.0: 1085 | dependencies: 1086 | yocto-queue: 0.1.0 1087 | 1088 | p-locate@5.0.0: 1089 | dependencies: 1090 | p-limit: 3.1.0 1091 | 1092 | parent-module@1.0.1: 1093 | dependencies: 1094 | callsites: 3.1.0 1095 | 1096 | path-exists@4.0.0: {} 1097 | 1098 | path-key@3.1.1: {} 1099 | 1100 | picomatch@4.0.3: {} 1101 | 1102 | prelude-ls@1.2.1: {} 1103 | 1104 | punycode@2.3.1: {} 1105 | 1106 | resolve-from@4.0.0: {} 1107 | 1108 | semver@7.7.3: {} 1109 | 1110 | shebang-command@2.0.0: 1111 | dependencies: 1112 | shebang-regex: 3.0.0 1113 | 1114 | shebang-regex@3.0.0: {} 1115 | 1116 | strip-json-comments@3.1.1: {} 1117 | 1118 | supports-color@7.2.0: 1119 | dependencies: 1120 | has-flag: 4.0.0 1121 | 1122 | tinyglobby@0.2.15: 1123 | dependencies: 1124 | fdir: 6.5.0(picomatch@4.0.3) 1125 | picomatch: 4.0.3 1126 | 1127 | ts-api-utils@2.1.0(typescript@5.9.3): 1128 | dependencies: 1129 | typescript: 5.9.3 1130 | 1131 | type-check@0.4.0: 1132 | dependencies: 1133 | prelude-ls: 1.2.1 1134 | 1135 | typescript@5.9.3: {} 1136 | 1137 | uri-js@4.4.1: 1138 | dependencies: 1139 | punycode: 2.3.1 1140 | 1141 | which@2.0.2: 1142 | dependencies: 1143 | isexe: 2.0.0 1144 | 1145 | word-wrap@1.2.5: {} 1146 | 1147 | yocto-queue@0.1.0: {} 1148 | --------------------------------------------------------------------------------