diff --git a/.eslintrc.cjs b/.eslintrc.cjs
deleted file mode 100644
index 35c942fbfe5..00000000000
--- a/.eslintrc.cjs
+++ /dev/null
@@ -1,198 +0,0 @@
-// @ts-check
-const { defineConfig } = require('eslint-define-config');
-const { readGitignoreFiles } = require('eslint-gitignore');
-
-///
-///
-///
-///
-///
-
-module.exports = defineConfig({
- ignorePatterns: [
- ...readGitignoreFiles(),
- '.eslintrc.cjs', // Skip self linting
- ],
- root: true,
- env: {
- browser: true,
- node: true,
- },
- reportUnusedDisableDirectives: true,
- extends: [
- 'eslint:recommended',
- 'plugin:@typescript-eslint/strict-type-checked',
- 'plugin:prettier/recommended',
- 'plugin:deprecation/recommended',
- 'plugin:jsdoc/recommended-typescript-error',
- 'plugin:unicorn/recommended',
- ],
- parserOptions: {
- project: ['./tsconfig.json'],
- warnOnUnsupportedTypeScriptVersion: false,
- },
- rules: {
- eqeqeq: ['error', 'always', { null: 'ignore' }],
- 'logical-assignment-operators': 'error',
- 'no-else-return': 'error',
- 'no-restricted-globals': ['error', 'Intl'],
- 'prefer-exponentiation-operator': 'error',
- 'prefer-template': 'error',
-
- 'unicorn/import-style': 'off', // subjective & doesn't do anything for us
- 'unicorn/no-array-callback-reference': 'off', // reduces readability
- 'unicorn/no-nested-ternary': 'off', // incompatible with prettier
- 'unicorn/no-null': 'off', // incompatible with TypeScript
- 'unicorn/no-zero-fractions': 'off', // deactivated to raise awareness of floating operations
- 'unicorn/number-literal-case': 'off', // incompatible with prettier
- 'unicorn/numeric-separators-style': 'off', // "magic numbers" may carry specific meaning
- 'unicorn/prefer-string-raw': 'off', // The additional prefix doesn't help readability
- 'unicorn/prefer-ternary': 'off', // ternaries aren't always better
-
- // TODO @Shinigami92 2023-09-23: The following rules currently conflict with our code.
- // Each rule should be checked whether it should be enabled/configured and the problems fixed, or stay disabled permanently.
- 'unicorn/better-regex': 'off',
- 'unicorn/consistent-function-scoping': 'off',
- 'unicorn/no-object-as-default-parameter': 'off',
- 'unicorn/prefer-export-from': 'off',
- 'unicorn/prefer-string-slice': 'off',
- 'unicorn/prevent-abbreviations': 'off',
-
- '@typescript-eslint/array-type': [
- 'error',
- { default: 'array-simple', readonly: 'generic' },
- ],
- '@typescript-eslint/consistent-type-exports': 'error',
- '@typescript-eslint/consistent-type-imports': 'error',
- '@typescript-eslint/explicit-module-boundary-types': 'error',
- '@typescript-eslint/naming-convention': [
- 'error',
- {
- format: ['PascalCase'],
- selector: ['class', 'interface', 'typeAlias', 'enumMember'],
- leadingUnderscore: 'forbid',
- trailingUnderscore: 'forbid',
- },
- {
- format: ['PascalCase'],
- selector: ['typeParameter'],
- prefix: ['T'],
- leadingUnderscore: 'forbid',
- trailingUnderscore: 'forbid',
- },
- ],
- '@typescript-eslint/no-confusing-void-expression': [
- 'error',
- {
- ignoreArrowShorthand: true,
- },
- ],
- '@typescript-eslint/no-inferrable-types': [
- 'error',
- { ignoreParameters: true },
- ],
- '@typescript-eslint/no-unnecessary-condition': 'off', // requires `strictNullChecks` to be enabled
- '@typescript-eslint/no-unsafe-assignment': 'off',
- '@typescript-eslint/no-unsafe-call': 'off',
- '@typescript-eslint/no-unsafe-member-access': 'off',
- '@typescript-eslint/padding-line-between-statements': [
- 'error',
- { blankLine: 'always', prev: 'block-like', next: '*' },
- ],
- '@typescript-eslint/prefer-regexp-exec': 'error',
- '@typescript-eslint/restrict-plus-operands': [
- 'error',
- {
- allowAny: false,
- allowBoolean: false,
- allowNullish: false,
- allowNumberAndString: true,
- allowRegExp: false,
- },
- ],
- '@typescript-eslint/restrict-template-expressions': [
- 'error',
- { allowNumber: true, allowBoolean: true },
- ],
- '@typescript-eslint/switch-exhaustiveness-check': [
- 'error',
- { requireDefaultForNonUnion: true },
- ],
- '@typescript-eslint/unbound-method': 'off',
- '@typescript-eslint/unified-signatures': 'off', // incompatible with our api docs generation
-
- 'jsdoc/require-jsdoc': 'off', // Enabled only for src/**/*.ts
- 'jsdoc/require-returns': 'off',
- 'jsdoc/sort-tags': [
- 'error',
- {
- tagSequence: [
- { tags: ['template'] },
- { tags: ['internal'] },
- { tags: ['param'] },
- { tags: ['returns'] },
- { tags: ['throws'] },
- { tags: ['see'] },
- { tags: ['example'] },
- { tags: ['since'] },
- { tags: ['default'] },
- { tags: ['deprecated'] },
- ],
- },
- ],
- 'jsdoc/tag-lines': 'off',
- },
- settings: {
- jsdoc: {
- mode: 'typescript',
- },
- },
- overrides: [
- {
- files: ['src/**/*.ts'],
- rules: {
- 'jsdoc/require-jsdoc': 'error',
- },
- },
- {
- files: ['src/locale/**/*.ts'],
- rules: {
- 'unicorn/filename-case': 'off', // our locale files have a custom naming scheme
- },
- },
- {
- files: ['src/definitions/**/*.ts', 'src/locales/**/*.ts'],
- rules: {
- 'unicorn/filename-case': [
- 'error',
- {
- case: 'snakeCase',
- },
- ],
- 'unicorn/text-encoding-identifier-case': 'off',
- },
- },
- {
- files: ['test/**/*.spec.ts'],
- extends: ['plugin:vitest/recommended'],
- rules: {
- 'deprecation/deprecation': 'off',
-
- '@typescript-eslint/restrict-template-expressions': [
- 'error',
- {
- allowNumber: true,
- allowBoolean: true,
- allowAny: true,
- },
- ],
-
- 'vitest/expect-expect': 'off',
- 'vitest/no-alias-methods': 'error',
- 'vitest/prefer-each': 'error',
- 'vitest/prefer-to-have-length': 'error',
- 'vitest/valid-expect': ['error', { maxArgs: 2 }],
- },
- },
- ],
-});
diff --git a/eslint.config.js b/eslint.config.js
new file mode 100644
index 00000000000..c098ca80264
--- /dev/null
+++ b/eslint.config.js
@@ -0,0 +1,274 @@
+// @ts-check
+import eslint from '@eslint/js';
+import { readGitignoreFiles } from 'eslint-gitignore';
+import eslintPluginDeprecation from 'eslint-plugin-deprecation';
+import eslintPluginJsdoc from 'eslint-plugin-jsdoc';
+import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended';
+import eslintPluginUnicorn from 'eslint-plugin-unicorn';
+import vitest from 'eslint-plugin-vitest';
+import tseslint from 'typescript-eslint';
+
+export default tseslint.config(
+ //#region global
+ {
+ ignores: [
+ ...readGitignoreFiles(),
+ // Skip self linting
+ 'eslint.config.js',
+ // Skip some files that don't need linting right now
+ '.github/workflows/commentCodeGeneration.ts',
+ '.prettierrc.js',
+ 'docs/.vitepress/components/shims.d.ts',
+ 'docs/.vitepress/shared/utils/slugify.ts',
+ 'docs/.vitepress/theme/index.ts',
+ ],
+ },
+ {
+ linterOptions: {
+ reportUnusedDisableDirectives: 'error',
+ },
+ },
+ //#endregion
+
+ //#region eslint (js)
+ eslint.configs.recommended,
+ {
+ rules: {
+ eqeqeq: ['error', 'always', { null: 'ignore' }],
+ 'logical-assignment-operators': 'error',
+ 'no-else-return': 'error',
+ 'no-restricted-globals': ['error', 'Intl'],
+ 'prefer-exponentiation-operator': 'error',
+ 'prefer-template': 'error',
+ },
+ },
+ //#endregion
+
+ //#region typescript-eslint
+ ...tseslint.configs.strictTypeChecked,
+ {
+ plugins: {
+ '@typescript-eslint': tseslint.plugin,
+ },
+ languageOptions: {
+ parser: tseslint.parser,
+ parserOptions: {
+ project: true,
+ warnOnUnsupportedTypeScriptVersion: false,
+ },
+ },
+ rules: {
+ '@typescript-eslint/array-type': [
+ 'error',
+ { default: 'array-simple', readonly: 'generic' },
+ ],
+ '@typescript-eslint/consistent-type-exports': 'error',
+ '@typescript-eslint/consistent-type-imports': 'error',
+ '@typescript-eslint/explicit-module-boundary-types': 'error',
+ '@typescript-eslint/naming-convention': [
+ 'error',
+ {
+ format: ['PascalCase'],
+ selector: ['class', 'interface', 'typeAlias', 'enumMember'],
+ leadingUnderscore: 'forbid',
+ trailingUnderscore: 'forbid',
+ },
+ {
+ format: ['PascalCase'],
+ selector: ['typeParameter'],
+ prefix: ['T'],
+ leadingUnderscore: 'forbid',
+ trailingUnderscore: 'forbid',
+ },
+ ],
+ '@typescript-eslint/no-confusing-void-expression': [
+ 'error',
+ {
+ ignoreArrowShorthand: true,
+ },
+ ],
+ '@typescript-eslint/no-inferrable-types': [
+ 'error',
+ { ignoreParameters: true },
+ ],
+ '@typescript-eslint/no-unnecessary-condition': 'off', // requires `strictNullChecks` to be enabled
+ '@typescript-eslint/no-unsafe-assignment': 'off',
+ '@typescript-eslint/no-unsafe-call': 'off',
+ '@typescript-eslint/no-unsafe-member-access': 'off',
+ '@typescript-eslint/padding-line-between-statements': [
+ 'error',
+ { blankLine: 'always', prev: 'block-like', next: '*' },
+ ],
+ '@typescript-eslint/prefer-regexp-exec': 'error',
+ '@typescript-eslint/restrict-plus-operands': [
+ 'error',
+ {
+ allowAny: false,
+ allowBoolean: false,
+ allowNullish: false,
+ allowNumberAndString: true,
+ allowRegExp: false,
+ },
+ ],
+ '@typescript-eslint/restrict-template-expressions': [
+ 'error',
+ { allowNumber: true, allowBoolean: true },
+ ],
+ '@typescript-eslint/switch-exhaustiveness-check': [
+ 'error',
+ { requireDefaultForNonUnion: true },
+ ],
+ '@typescript-eslint/unbound-method': 'off',
+ '@typescript-eslint/unified-signatures': 'off', // incompatible with our api docs generation
+ },
+ },
+ //#endregion
+
+ //#region deprecation
+ {
+ plugins: {
+ deprecation: eslintPluginDeprecation,
+ },
+ languageOptions: {
+ parser: tseslint.parser,
+ parserOptions: {
+ project: true,
+ warnOnUnsupportedTypeScriptVersion: false,
+ },
+ },
+ rules: {
+ // TODO @Shinigami92 2024-04-08: Add eslint-plugin-deprecation later
+ // https://github.com/gund/eslint-plugin-deprecation/issues/78
+ // 'deprecation/deprecation': 'error',
+ },
+ },
+ //#endregion
+
+ //#region unicorn
+ // @ts-expect-error: Ignore for now
+ eslintPluginUnicorn.configs['flat/recommended'],
+ {
+ rules: {
+ 'unicorn/import-style': 'off', // subjective & doesn't do anything for us
+ 'unicorn/no-array-callback-reference': 'off', // reduces readability
+ 'unicorn/no-nested-ternary': 'off', // incompatible with prettier
+ 'unicorn/no-null': 'off', // incompatible with TypeScript
+ 'unicorn/no-zero-fractions': 'off', // deactivated to raise awareness of floating operations
+ 'unicorn/number-literal-case': 'off', // incompatible with prettier
+ 'unicorn/numeric-separators-style': 'off', // "magic numbers" may carry specific meaning
+ 'unicorn/prefer-string-raw': 'off', // The additional prefix doesn't help readability
+ 'unicorn/prefer-ternary': 'off', // ternaries aren't always better
+
+ // TODO @Shinigami92 2023-09-23: The following rules currently conflict with our code.
+ // Each rule should be checked whether it should be enabled/configured and the problems fixed, or stay disabled permanently.
+ 'unicorn/better-regex': 'off',
+ 'unicorn/consistent-function-scoping': 'off',
+ 'unicorn/no-object-as-default-parameter': 'off',
+ 'unicorn/prefer-export-from': 'off',
+ 'unicorn/prefer-string-raw': 'off',
+ 'unicorn/prefer-string-slice': 'off',
+ 'unicorn/prevent-abbreviations': 'off',
+ },
+ },
+ //#endregion
+
+ //#region jsdoc
+ eslintPluginJsdoc.configs['flat/recommended-typescript-error'],
+ {
+ rules: {
+ 'jsdoc/require-jsdoc': 'off', // Enabled only for src/**/*.ts
+ 'jsdoc/require-returns': 'off',
+ 'jsdoc/sort-tags': [
+ 'error',
+ {
+ tagSequence: [
+ { tags: ['template'] },
+ { tags: ['internal'] },
+ { tags: ['param'] },
+ { tags: ['returns'] },
+ { tags: ['throws'] },
+ { tags: ['see'] },
+ { tags: ['example'] },
+ { tags: ['since'] },
+ { tags: ['default'] },
+ { tags: ['deprecated'] },
+ ],
+ },
+ ],
+ 'jsdoc/tag-lines': 'off',
+ },
+ settings: {
+ jsdoc: {
+ mode: 'typescript',
+ },
+ },
+ },
+ //#endregion
+
+ //#region vitest
+ // TODO @Shinigami92 2024-04-08: Add vitest later
+ // https://github.com/veritem/eslint-plugin-vitest/issues/413
+ //#endregion
+
+ //#region prettier
+ eslintPluginPrettierRecommended,
+ //#endregion,
+
+ //#region overrides
+ {
+ files: ['src/**/*.ts'],
+ rules: {
+ 'jsdoc/require-jsdoc': 'error',
+ },
+ },
+ {
+ files: ['src/locale/**/*.ts'],
+ rules: {
+ 'unicorn/filename-case': 'off', // our locale files have a custom naming scheme
+ },
+ },
+ {
+ files: ['src/definitions/**/*.ts', 'src/locales/**/*.ts'],
+ rules: {
+ 'unicorn/filename-case': [
+ 'error',
+ {
+ case: 'snakeCase',
+ },
+ ],
+ 'unicorn/text-encoding-identifier-case': 'off',
+ },
+ },
+ {
+ files: ['test/**/*.spec.ts', 'test/**/*.spec.d.ts'],
+ plugins: {
+ vitest,
+ },
+ rules: {
+ 'deprecation/deprecation': 'off',
+
+ '@typescript-eslint/restrict-template-expressions': [
+ 'error',
+ {
+ allowNumber: true,
+ allowBoolean: true,
+ allowAny: true,
+ },
+ ],
+
+ ...vitest.configs.recommended.rules,
+
+ 'vitest/expect-expect': 'off',
+ 'vitest/no-alias-methods': 'error',
+ 'vitest/prefer-each': 'error',
+ 'vitest/prefer-to-have-length': 'error',
+ 'vitest/valid-expect': ['error', { maxArgs: 2 }],
+ },
+ settings: {
+ vitest: {
+ typecheck: true,
+ },
+ },
+ }
+ //#endregion
+);
diff --git a/package.json b/package.json
index a76ba5efb97..aec44b0d6b5 100644
--- a/package.json
+++ b/package.json
@@ -76,7 +76,7 @@
"docs:serve": "vitepress serve docs --port 5173",
"docs:diff": "tsx ./scripts/diff.ts",
"format": "prettier --cache --write .",
- "lint": "eslint --cache --cache-strategy content --report-unused-disable-directives .",
+ "lint": "eslint --cache --cache-strategy content .",
"ts-check": "tsc",
"test": "vitest",
"test:update-snapshots": "vitest run -u",
@@ -97,12 +97,11 @@
"@eslint-types/prettier": "5.1.3",
"@eslint-types/typescript-eslint": "7.5.0",
"@eslint-types/unicorn": "52.0.0",
+ "@eslint/js": "9.7.0",
"@types/node": "20.14.10",
"@types/sanitize-html": "2.11.0",
"@types/semver": "7.5.8",
"@types/validator": "13.12.0",
- "@typescript-eslint/eslint-plugin": "7.16.1",
- "@typescript-eslint/parser": "7.16.1",
"@vitest/coverage-v8": "2.0.3",
"@vitest/ui": "2.0.3",
"@vueuse/core": "10.11.0",
@@ -127,6 +126,7 @@
"tsup": "8.1.0",
"tsx": "4.16.2",
"typescript": "5.5.3",
+ "typescript-eslint": "7.16.1",
"validator": "13.12.0",
"vite": "5.3.4",
"vitepress": "1.3.1",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 828dd8c249c..530e13fdecb 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -29,6 +29,9 @@ importers:
'@eslint-types/unicorn':
specifier: 52.0.0
version: 52.0.0
+ '@eslint/js':
+ specifier: 9.7.0
+ version: 9.7.0
'@types/node':
specifier: 20.14.10
version: 20.14.10
@@ -41,12 +44,6 @@ importers:
'@types/validator':
specifier: 13.12.0
version: 13.12.0
- '@typescript-eslint/eslint-plugin':
- specifier: 7.16.1
- version: 7.16.1(@typescript-eslint/parser@7.16.1(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3)
- '@typescript-eslint/parser':
- specifier: 7.16.1
- version: 7.16.1(eslint@9.7.0)(typescript@5.5.3)
'@vitest/coverage-v8':
specifier: 2.0.3
version: 2.0.3(vitest@2.0.3(@types/node@20.14.10)(@vitest/ui@2.0.3)(jsdom@23.2.0))
@@ -88,7 +85,7 @@ importers:
version: 54.0.0(eslint@9.7.0)
eslint-plugin-vitest:
specifier: 0.5.4
- version: 0.5.4(@typescript-eslint/eslint-plugin@7.16.1(@typescript-eslint/parser@7.16.1(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3)(vitest@2.0.3(@types/node@20.14.10)(@vitest/ui@2.0.3)(jsdom@23.2.0))
+ version: 0.5.4(eslint@9.7.0)(typescript@5.5.3)(vitest@2.0.3(@types/node@20.14.10)(@vitest/ui@2.0.3)(jsdom@23.2.0))
npm-run-all2:
specifier: 6.2.2
version: 6.2.2
@@ -119,6 +116,9 @@ importers:
typescript:
specifier: 5.5.3
version: 5.5.3
+ typescript-eslint:
+ specifier: 7.16.1
+ version: 7.16.1(eslint@9.7.0)(typescript@5.5.3)
validator:
specifier: 13.12.0
version: 13.12.0
@@ -446,10 +446,6 @@ packages:
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
- '@eslint-community/regexpp@4.10.1':
- resolution: {integrity: sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==}
- engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
-
'@eslint-community/regexpp@4.11.0':
resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
@@ -2838,7 +2834,6 @@ packages:
engines: {node: '>=0.6.0', teleport: '>=0.2.0'}
deprecated: |-
You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.
-
(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)
qs@6.10.4:
@@ -3363,6 +3358,16 @@ packages:
typedarray@0.0.6:
resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
+ typescript-eslint@7.16.1:
+ resolution: {integrity: sha512-889oE5qELj65q/tGeOSvlreNKhimitFwZqQ0o7PcWC7/lgRkAMknznsCsV8J8mZGTP/Z+cIbX8accf2DE33hrA==}
+ engines: {node: ^18.18.0 || >=20.0.0}
+ peerDependencies:
+ eslint: ^8.56.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
typescript@5.5.3:
resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==}
engines: {node: '>=14.17'}
@@ -3967,8 +3972,6 @@ snapshots:
eslint: 9.7.0
eslint-visitor-keys: 3.4.3
- '@eslint-community/regexpp@4.10.1': {}
-
'@eslint-community/regexpp@4.11.0': {}
'@eslint-types/deprecation@2.0.0-1': {}
@@ -4229,7 +4232,7 @@ snapshots:
'@typescript-eslint/eslint-plugin@7.16.1(@typescript-eslint/parser@7.16.1(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3)':
dependencies:
- '@eslint-community/regexpp': 4.10.1
+ '@eslint-community/regexpp': 4.11.0
'@typescript-eslint/parser': 7.16.1(eslint@9.7.0)(typescript@5.5.3)
'@typescript-eslint/scope-manager': 7.16.1
'@typescript-eslint/type-utils': 7.16.1(eslint@9.7.0)(typescript@5.5.3)
@@ -5442,12 +5445,11 @@ snapshots:
transitivePeerDependencies:
- supports-color
- eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@7.16.1(@typescript-eslint/parser@7.16.1(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3)(vitest@2.0.3(@types/node@20.14.10)(@vitest/ui@2.0.3)(jsdom@23.2.0)):
+ eslint-plugin-vitest@0.5.4(eslint@9.7.0)(typescript@5.5.3)(vitest@2.0.3(@types/node@20.14.10)(@vitest/ui@2.0.3)(jsdom@23.2.0)):
dependencies:
'@typescript-eslint/utils': 7.13.0(eslint@9.7.0)(typescript@5.5.3)
eslint: 9.7.0
optionalDependencies:
- '@typescript-eslint/eslint-plugin': 7.16.1(@typescript-eslint/parser@7.16.1(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3)
vitest: 2.0.3(@types/node@20.14.10)(@vitest/ui@2.0.3)(jsdom@23.2.0)
transitivePeerDependencies:
- supports-color
@@ -7154,6 +7156,17 @@ snapshots:
typedarray@0.0.6: {}
+ typescript-eslint@7.16.1(eslint@9.7.0)(typescript@5.5.3):
+ dependencies:
+ '@typescript-eslint/eslint-plugin': 7.16.1(@typescript-eslint/parser@7.16.1(eslint@9.7.0)(typescript@5.5.3))(eslint@9.7.0)(typescript@5.5.3)
+ '@typescript-eslint/parser': 7.16.1(eslint@9.7.0)(typescript@5.5.3)
+ '@typescript-eslint/utils': 7.16.1(eslint@9.7.0)(typescript@5.5.3)
+ eslint: 9.7.0
+ optionalDependencies:
+ typescript: 5.5.3
+ transitivePeerDependencies:
+ - supports-color
+
typescript@5.5.3: {}
uglify-js@3.18.0: