diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 14c96ea10c..5f4b7a9d0a 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -17,11 +17,7 @@ "postStartCommand": "FX_PROFILER_HOST=\"0.0.0.0\" yarn start", "customizations": { "vscode": { - "extensions": [ - "dbaeumer.vscode-eslint", - "oxc.oxc-vscode", - "stylelint.vscode-stylelint" - ], + "extensions": ["oxc.oxc-vscode", "stylelint.vscode-stylelint"], "settings": { "editor.formatOnSave": true, "editor.defaultFormatter": "oxc.oxc-vscode" diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 0000000000..65124fa6a3 --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,540 @@ +// Oxlint configuration for the Firefox Profiler. +// +// All lint categories are switched off, so only the rules listed here run. +// +// Rules that oxlint doesn't implement natively come from ESLint plugins, loaded +// through `jsPlugins`. eslint-plugin-react is loaded as `react-js` so that it +// doesn't clash with oxlint's native `react` plugin. jsPlugins support is still +// in alpha, so an oxlint upgrade may require changes here. +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "ignorePatterns": [ + "src/profile-logic/import/proto/**", + "src/types/libdef/npm/**", + "profiler-cli/dist/**", + "res/**", + "dist/**", + "node-tools-dist/**", + "docs-user/**", + "coverage/**" + ], + "plugins": ["typescript", "react", "import", "jest"], + "categories": { + "correctness": "off", + "suspicious": "off", + "pedantic": "off", + "perf": "off", + "style": "off", + "restriction": "off", + "nursery": "off" + }, + "env": { + "browser": true, + "es2024": true, + "node": true + }, + "globals": { + "AVAILABLE_STAGING_LOCALES": "readonly" + }, + "settings": { + "react": { + "version": "19.0" + }, + // Used by import-js/no-unresolved. + "import/resolver": { + "alias": { + "map": [ + ["firefox-profiler", "./src"], + ["firefox-profiler-res", "./res"] + ], + "extensions": [".js", ".ts", ".tsx", ".jpg"] + } + } + }, + "options": { + "typeAware": true, + "reportUnusedDisableDirectives": "error" + }, + "rules": { + "array-callback-return": [ + "error", + { + "allowImplicit": false, + "checkForEach": false, + "allowVoid": false + } + ], + "curly": ["error", "all"], + "default-case": ["error", {}], + "eqeqeq": "error", + "for-direction": "error", + "import/named": "error", + "import/no-duplicates": "error", + "no-alert": "error", + "no-array-constructor": "error", + "no-async-promise-executor": "error", + "no-caller": "error", + "no-case-declarations": "error", + "no-compare-neg-zero": "error", + "no-cond-assign": ["error", "except-parens"], + "no-console": [ + "error", + { + "allow": ["log", "warn", "error"] + } + ], + "no-constant-binary-expression": "error", + "no-constant-condition": [ + "error", + { + "checkLoops": false + } + ], + "no-control-regex": "error", + "no-debugger": "error", + "no-delete-var": "error", + "no-dupe-else-if": "error", + "no-duplicate-case": "error", + "no-else-return": [ + "error", + { + "allowElseIf": true + } + ], + "no-empty": [ + "error", + { + "allowEmptyCatch": false + } + ], + "no-empty-character-class": "error", + "no-empty-pattern": [ + "error", + { + "allowObjectPatternsAsParameters": false + } + ], + "no-empty-static-block": "error", + "no-eval": [ + "error", + { + "allowIndirect": false + } + ], + "no-ex-assign": "error", + "no-extend-native": [ + "error", + { + "exceptions": [] + } + ], + "no-extra-bind": "error", + "no-extra-boolean-cast": ["error", {}], + "no-extra-label": "error", + "no-fallthrough": "error", + "no-global-assign": [ + "error", + { + "exceptions": [] + } + ], + "no-implied-eval": "error", + "no-invalid-regexp": ["error", {}], + "no-irregular-whitespace": [ + "error", + { + "skipComments": false, + "skipJSXText": false, + "skipRegExps": false, + "skipStrings": true, + "skipTemplates": false + } + ], + "no-loss-of-precision": "error", + "no-misleading-character-class": [ + "error", + { + "allowEscape": false + } + ], + "no-nested-ternary": "error", + "no-nonoctal-decimal-escape": "error", + "no-prototype-builtins": "error", + "no-regex-spaces": "error", + "no-self-assign": [ + "error", + { + "props": true + } + ], + "no-self-compare": "error", + "no-shadow-restricted-names": [ + "error", + { + "reportGlobalThis": false + } + ], + "no-sparse-arrays": "error", + "no-throw-literal": "error", + "no-unexpected-multiline": "error", + "no-unmodified-loop-condition": "error", + "no-unsafe-finally": "error", + "no-unsafe-optional-chaining": [ + "error", + { + "disallowArithmeticOperators": false + } + ], + "no-unused-expressions": [ + "error", + { + "allowShortCircuit": false, + "allowTaggedTemplates": false, + "allowTernary": false + } + ], + "no-unused-labels": "error", + "no-unused-private-class-members": "error", + // Prefix a name with an underscore to mark it as intentionally unused. + "no-unused-vars": [ + "error", + { + "args": "all", + "argsIgnorePattern": "^_", + "caughtErrors": "all", + "caughtErrorsIgnorePattern": "^_", + "destructuredArrayIgnorePattern": "^_", + "varsIgnorePattern": "^_", + "ignoreRestSiblings": true + } + ], + "no-useless-backreference": "error", + "no-useless-call": "error", + "no-useless-catch": "error", + "no-useless-computed-key": [ + "error", + { + "enforceForClassMembers": true + } + ], + "no-useless-concat": "error", + "no-useless-constructor": "error", + "no-useless-escape": [ + "error", + { + "allowRegexCharacters": [] + } + ], + "no-useless-rename": [ + "error", + { + "ignoreDestructuring": false, + "ignoreImport": false, + "ignoreExport": false + } + ], + "no-useless-return": "error", + "no-var": "error", + "no-void": [ + "error", + { + "allowAsStatement": false + } + ], + "no-with": "error", + "prefer-const": [ + "error", + { + "destructuring": "any", + "ignoreReadBeforeAssign": false + } + ], + "prefer-promise-reject-errors": [ + "error", + { + "allowEmptyReject": false + } + ], + "prefer-rest-params": "error", + "prefer-spread": "error", + "react-js/jsx-no-bind": "error", + "react-js/jsx-no-leaked-render": "error", + "react-js/no-access-state-in-setstate": "error", + "react-js/no-deprecated": "error", + "react-js/no-typos": "error", + "react-js/no-unused-class-component-methods": "error", + "react-js/no-unused-state": "error", + + // react-js/no-unused-prop-types is not enabled: it mistakes functions with + // destructured parameters for function components. + // See https://github.com/yannickcr/eslint-plugin-react/issues/1561 + + "react/button-has-type": "error", + "react/display-name": "error", + "react/jsx-curly-brace-presence": [ + "error", + { + "props": "never", + "children": "never" + } + ], + "react/jsx-key": "error", + "react/jsx-no-comment-textnodes": "error", + "react/jsx-no-duplicate-props": "error", + "react/jsx-no-target-blank": "error", + "react/jsx-no-undef": "error", + "react/no-children-prop": "error", + "react/no-danger": "error", + "react/no-danger-with-children": "error", + "react/no-direct-mutation-state": "error", + "react/no-find-dom-node": "error", + "react/no-is-mounted": "error", + "react/no-redundant-should-component-update": "error", + "react/no-render-return-value": "error", + "react/no-string-refs": "error", + "react/no-this-in-sfc": "error", + "react/no-unescaped-entities": "error", + "react/no-unknown-property": "error", + "react/no-will-update-set-state": "error", + "react/require-render-return": "error", + "require-yield": "error", + // Allow @ts-expect-error annotations with descriptions. Don't allow + // @ts-ignore or @ts-nocheck: we want to be notified when the error goes + // away so that the annotation can be removed. @ts-check is allowed even + // without a description. + "typescript/ban-ts-comment": [ + "error", + { + "ts-expect-error": "allow-with-description", + "ts-ignore": true, + "ts-nocheck": true, + "ts-check": false + } + ], + // Use `import type` everywhere we can. + "typescript/consistent-type-imports": "error", + "typescript/no-duplicate-enum-values": "error", + "typescript/no-extra-non-null-assertion": "error", + "typescript/no-misused-new": "error", + "typescript/no-namespace": "error", + "typescript/no-non-null-asserted-optional-chain": "error", + "typescript/no-this-alias": "error", + "typescript/no-unnecessary-type-constraint": "error", + "typescript/no-unsafe-declaration-merging": "error", + "typescript/no-unsafe-function-type": "error", + "typescript/no-wrapper-object-types": "error", + "typescript/prefer-as-const": "error", + "typescript/prefer-namespace-keyword": "error", + "typescript/triple-slash-reference": "error", + "use-isnan": [ + "error", + { + "enforceForIndexOf": false, + "enforceForSwitchCase": true + } + ], + "valid-typeof": [ + "error", + { + "requireStringLiterals": false + } + ], + + // The following rules are off by default. They are listed to record why + // they stay off. + + // Allow `as any` escape hatches. + "typescript/no-explicit-any": "off", + // The TypeScript FAQ disapproves of this rule. + "typescript/no-empty-object-type": "off", + // TypeScript imports react-jsx into .tsx files for us. + "react/react-in-jsx-scope": "off", + + // The "no-unsafe" rules complain about using "any" freely. + "typescript/no-unsafe-argument": "off", + "typescript/no-unsafe-assignment": "off", + "typescript/no-unsafe-call": "off", + "typescript/no-unsafe-member-access": "off", + "typescript/no-unsafe-return": "off", + + // False positives when narrowing return types, see + // https://github.com/typescript-eslint/typescript-eslint/issues/6951 + // (`yarn lint-fix` can make `yarn ts` fail). + "typescript/no-unnecessary-type-assertion": "off", + + // Consider enabling these in the future. + "typescript/await-thenable": "off", + "typescript/no-array-delete": "off", + "typescript/no-base-to-string": "off", + "typescript/no-floating-promises": "off", + "typescript/no-misused-promises": "off", + "typescript/no-redundant-type-constituents": "off", + "typescript/only-throw-error": "off", + "typescript/prefer-promise-reject-errors": "off", + "typescript/require-await": "off", + "typescript/restrict-plus-operands": "off", + "typescript/restrict-template-expressions": "off", + "typescript/unbound-method": "off" + }, + "overrides": [ + // Type-aware rules. These need type information, so they only run on + // TypeScript files. + { + "files": ["**/*.ts", "**/*.tsx"], + "rules": { + "typescript/consistent-return": [ + "error", + { + "treatUndefinedAsUnspecified": false + } + ], + "typescript/dot-notation": [ + "error", + { + "allowKeywords": true, + "allowPattern": "" + } + ], + "typescript/no-duplicate-type-constituents": "error", + "typescript/no-for-in-array": "error", + "typescript/no-implied-eval": "error", + "typescript/no-unsafe-enum-comparison": "error", + "typescript/no-unsafe-unary-minus": "error", + // Only reports an `await` whose presence or absence changes which errors + // a surrounding try/catch sees. + "typescript/return-await": ["error", "error-handling-correctness-only"] + } + }, + // Checks for JavaScript files that TypeScript or type-aware rules provide + // for TypeScript files. oxlint only implements consistent-return and + // dot-notation as type-aware rules, so use ESLint's own implementations. + // For TypeScript files, tsc reports unresolved imports (TS2307). + { + "files": ["**/*.js", "**/*.mjs", "**/*.cjs"], + "rules": { + "eslint-js/consistent-return": [ + "error", + { + "treatUndefinedAsUnspecified": false + } + ], + "eslint-js/dot-notation": [ + "error", + { + "allowKeywords": true + } + ], + "import-js/no-unresolved": "error" + } + }, + // For non-test files, only allow import, no require(). Test files use + // require() for JSON fixtures. + { + "files": ["src/**/*.ts", "src/**/*.tsx"], + "rules": { + "typescript/no-require-imports": "error" + } + }, + { + "files": ["src/test/**/*", "profiler-cli/src/test/**/*"], + "env": { + "jest": true + }, + "rules": { + "jest-dom/prefer-checked": "error", + "jest-dom/prefer-empty": "error", + "jest-dom/prefer-enabled-disabled": "error", + "jest-dom/prefer-focus": "error", + "jest-dom/prefer-in-document": "error", + "jest-dom/prefer-required": "error", + "jest-dom/prefer-to-have-attribute": "error", + "jest-dom/prefer-to-have-class": "error", + "jest-dom/prefer-to-have-style": "error", + "jest-dom/prefer-to-have-text-content": "error", + "jest-dom/prefer-to-have-value": "error", + "jest-formatting/padding-around-describe-blocks": "error", + "jest/expect-expect": "error", + "jest/no-alias-methods": "error", + "jest/no-commented-out-tests": "error", + "jest/no-conditional-expect": "error", + "jest/no-deprecated-functions": "error", + "jest/no-disabled-tests": "error", + "jest/no-done-callback": "error", + "jest/no-export": "error", + "jest/no-focused-tests": "error", + "jest/no-identical-title": "error", + "jest/no-interpolation-in-snapshots": "error", + "jest/no-jasmine-globals": "error", + "jest/no-mocks-import": "error", + "jest/no-standalone-expect": "error", + "jest/no-test-prefixes": "error", + "jest/padding-around-test-blocks": "error", + "jest/valid-describe-callback": "error", + "jest/valid-expect": "error", + "jest/valid-expect-in-promise": "error", + "react-js/jsx-no-bind": "off", + "testing-library/await-async-events": "error", + "testing-library/await-async-queries": "error", + "testing-library/await-async-utils": "error", + "testing-library/no-await-sync-events": "error", + "testing-library/no-await-sync-queries": "error", + "testing-library/no-debugging-utils": "error", + "testing-library/no-dom-import": "error", + "testing-library/no-global-regexp-flag-in-query": "error", + "testing-library/no-manual-cleanup": "error", + "testing-library/no-promise-in-fire-event": "error", + "testing-library/no-render-in-lifecycle": "error", + "testing-library/no-unnecessary-act": "error", + "testing-library/no-wait-for-multiple-assertions": "error", + "testing-library/no-wait-for-side-effects": "error", + "testing-library/no-wait-for-snapshot": "error", + "testing-library/prefer-explicit-assert": [ + "error", + { + "includeFindQueries": false + } + ], + "testing-library/prefer-find-by": "error", + "testing-library/prefer-presence-queries": "error", + "testing-library/prefer-query-by-disappearance": "error", + "testing-library/prefer-screen-queries": "error", + "typescript/no-require-imports": "off", + + // The following rules are off by default. They are listed to record + // why they stay off. + + // TypeScript already checks test titles. + "jest/valid-title": "off", + // A purely stylistic rule. + "testing-library/render-result-naming-convention": "off", + // `container` and direct node access (e.g. firstChild) still have + // legitimate uses in our tests. + "testing-library/no-container": "off", + "testing-library/no-node-access": "off" + } + }, + { + "files": ["__mocks__/**/*"], + "env": { + "jest": true + } + } + ], + "jsPlugins": [ + "eslint-plugin-testing-library", + "eslint-plugin-jest-dom", + "eslint-plugin-jest-formatting", + { + "name": "react-js", + "specifier": "eslint-plugin-react" + }, + { + "name": "import-js", + "specifier": "eslint-plugin-import" + }, + { + "name": "eslint-js", + "specifier": "./scripts/lib/oxlint-eslint-core-rules.mjs" + } + ] +} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index efdfad31d1..4ad96b80f5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -77,7 +77,7 @@ When working on a new feature and code changes, it's important that things work - Locally when running - `yarn test-all` - Test all the things! - `yarn test` - Run the tests in [`./src/test/`](./src/test/). - - `yarn lint` - Run oxfmt, stylelint, and eslint to check for correct code formatting. + - `yarn lint` - Run oxfmt, stylelint, and oxlint to check for correct code formatting. - `yarn ts` - Check for TypeScript type correctness. - `yarn license-check` - Check the dependencies' licenses. - `git push` and `git commit` diff --git a/eslint.config.mjs b/eslint.config.mjs deleted file mode 100644 index d2c4d5e66b..0000000000 --- a/eslint.config.mjs +++ /dev/null @@ -1,312 +0,0 @@ -import { defineConfig } from 'eslint/config'; -import js from '@eslint/js'; -import tseslint from 'typescript-eslint'; -import tsParser from '@typescript-eslint/parser'; -import reactPlugin from 'eslint-plugin-react'; -import importPlugin from 'eslint-plugin-import'; -import jestPlugin from 'eslint-plugin-jest'; -import testingLibraryPlugin from 'eslint-plugin-testing-library'; -import jestFormattingPlugin from 'eslint-plugin-jest-formatting'; -import jestDomPlugin from 'eslint-plugin-jest-dom'; -import globals from 'globals'; - -export default defineConfig( - // Global ignores - { - ignores: [ - 'src/profile-logic/import/proto/**', - 'src/types/libdef/npm/**', - 'profiler-cli/dist/**', - 'res/**', - 'dist/**', - 'node-tools-dist/**', - 'docs-user/**', - 'coverage/**', - ], - }, - - // Base JavaScript config - js.configs.recommended, - - // TypeScript config with type checking - ...tseslint.configs.recommendedTypeChecked, - - // React config - reactPlugin.configs.flat.recommended, - - // Custom configuration for all files - { - files: ['**/*.js', '**/*.mjs', '**/*.cjs', '**/*.ts', '**/*.tsx'], - languageOptions: { - globals: { - ...globals.browser, - ...globals.es2024, - ...globals.node, - AVAILABLE_STAGING_LOCALES: true, - }, - parser: tsParser, - parserOptions: { - ecmaVersion: 2024, - sourceType: 'module', - ecmaFeatures: { - jsx: true, - }, - // Note: projectService is enabled for TypeScript files only, below - }, - }, - plugins: { - import: importPlugin, - }, - settings: { - react: { - pragma: 'React', - version: '18.0', - }, - 'import/resolver': { - alias: { - map: [ - ['firefox-profiler', './src'], - ['firefox-profiler-res', './res'], - ], - extensions: ['.js', '.ts', '.tsx', '.jpg'], - }, - }, - }, - rules: { - // Plugin rules: - 'import/no-duplicates': 'error', - 'import/no-unresolved': 'error', - 'import/named': 'error', - 'react/button-has-type': 'error', - 'react/no-access-state-in-setstate': 'error', - 'react/no-danger': 'error', - 'react/no-did-mount-set-state': 'error', - 'react/no-did-update-set-state': 'error', - 'react/no-will-update-set-state': 'error', - 'react/no-redundant-should-component-update': 'error', - 'react/no-unused-class-component-methods': 'error', - 'react/no-this-in-sfc': 'error', - 'react/no-typos': 'error', - // TypeScript provides enough coverage over the prop types. - 'react/prop-types': 'off', - 'react/jsx-curly-brace-presence': [ - 'error', - { props: 'never', children: 'never' }, - ], - // `no-unused-prop-types` is buggy when we use destructuring parameters in - // functions as it misunderstands them as functional components. - // See https://github.com/yannickcr/eslint-plugin-react/issues/1561 - // 'react/no-unused-prop-types': 'error', - 'react/no-unused-state': 'error', - 'react/jsx-no-bind': 'error', - 'react/jsx-no-leaked-render': 'error', - - // overriding recommended rules - 'no-constant-condition': ['error', { checkLoops: false }], - 'no-console': ['error', { allow: ['log', 'warn', 'error'] }], - - // possible errors - 'array-callback-return': 'error', - 'consistent-return': 'error', - curly: 'error', - 'default-case': 'error', - 'dot-notation': 'error', - eqeqeq: 'error', - 'for-direction': 'error', - 'no-alert': 'error', - 'no-caller': 'error', - 'no-eval': 'error', - 'no-extend-native': 'error', - 'no-extra-bind': 'error', - 'no-extra-label': 'error', - 'no-implied-eval': 'error', - 'no-invalid-this': 'error', - 'no-return-await': 'error', - 'no-self-compare': 'error', - 'no-throw-literal': 'error', - 'no-unmodified-loop-condition': 'error', - 'no-useless-call': 'error', - 'no-useless-computed-key': 'error', - 'no-useless-concat': 'error', - 'no-useless-constructor': 'error', - 'no-useless-rename': 'error', - 'no-useless-return': 'error', - 'no-var': 'error', - 'no-void': 'error', - 'no-with': 'error', - 'prefer-const': 'error', - 'prefer-promise-reject-errors': 'error', - 'prefer-rest-params': 'error', - 'prefer-spread': 'error', - 'no-else-return': 'error', - 'no-nested-ternary': 'error', - - '@typescript-eslint/no-unused-vars': [ - 'error', - { - args: 'all', - argsIgnorePattern: '^_', - caughtErrors: 'all', - caughtErrorsIgnorePattern: '^_', - destructuredArrayIgnorePattern: '^_', - varsIgnorePattern: '^_', - ignoreRestSiblings: true, - }, - ], - - // Use `import type` everywhere we can. - '@typescript-eslint/consistent-type-imports': 'error', - // Allow `as any` escape hatches - '@typescript-eslint/no-explicit-any': 'off', - // Disable a rule that the TypeScript FAQ disapproves of - '@typescript-eslint/no-empty-object-type': 'off', - // TypeScript imports react-jsx into .tsx files for us - 'react/react-in-jsx-scope': 'off', - // Allow @ts-expect-error annotations with descriptions. - '@typescript-eslint/ban-ts-comment': [ - 'error', - { - // Allow @ts-expect-error annotations with descriptions. - 'ts-expect-error': 'allow-with-description', - // Don't allow @ts-ignore or @ts-nocheck because we want to be notified - // when the error goes away so we can remove the annotation - use - // @ts-expect-error instead - 'ts-ignore': true, - 'ts-nocheck': true, - 'ts-check': false, // allow even without description - }, - ], - '@typescript-eslint/no-require-imports': 'off', - - // Disable "no-unsafe" checks which complain about using "any" freely. - '@typescript-eslint/no-unsafe-member-access': 'off', - '@typescript-eslint/no-unsafe-assignment': 'off', - '@typescript-eslint/no-unsafe-call': 'off', - '@typescript-eslint/no-unsafe-argument': 'off', - '@typescript-eslint/no-unsafe-return': 'off', - - // Disable this one due to false positives when narrowing return types, - // see https://github.com/typescript-eslint/typescript-eslint/issues/6951 - // (it can make `yarn ts` fail after `yarn lint-fix`) - '@typescript-eslint/no-unnecessary-type-assertion': 'off', - - // Consider enabling these in the future - '@typescript-eslint/unbound-method': 'off', - '@typescript-eslint/only-throw-error': 'off', - '@typescript-eslint/no-floating-promises': 'off', - '@typescript-eslint/require-await': 'off', - '@typescript-eslint/no-redundant-type-constituents': 'off', - '@typescript-eslint/no-misused-promises': 'off', - '@typescript-eslint/await-thenable': 'off', - '@typescript-eslint/restrict-plus-operands': 'off', - '@typescript-eslint/no-base-to-string': 'off', - '@typescript-eslint/restrict-template-expressions': 'off', - '@typescript-eslint/prefer-promise-reject-errors': 'off', - '@typescript-eslint/no-array-delete': 'off', - }, - linterOptions: { - // This property is specified both here in addition to the command line in - // package.json. - // The reason is that the property only warns but the command line option - // outputs errors, but the property is useful so that we have the information - // directly in editors. - reportUnusedDisableDirectives: true, - }, - }, - - // Enable type-aware lints for TypeScript files. - { - files: ['**/*.ts', '**/*.tsx'], - languageOptions: { - parserOptions: { - projectService: true, - tsconfigRootDir: import.meta.dirname, - }, - }, - }, - - // Explicitly disable type-aware rules for JS files, to avoid the following error: - // > You have used a rule which requires type information, but don't have - // > parserOptions set to generate type information for this file. - { - files: ['**/*.js', '**/*.mjs', '**/*.cjs'], - ...tseslint.configs.disableTypeChecked, - }, - - // For non-test files, only allow import, no require(). (For test files we - // allow require() because we use it for JSON fixtures.) - { - files: ['src/**/*.ts', 'src/**/*.tsx'], - rules: { - '@typescript-eslint/no-require-imports': 'error', - }, - }, - - // Test files override - { - files: ['src/test/**/*', 'profiler-cli/src/test/**/*'], - languageOptions: { - globals: { - ...globals.jest, - }, - }, - plugins: { - jest: jestPlugin, - 'testing-library': testingLibraryPlugin, - 'jest-formatting': jestFormattingPlugin, - 'jest-dom': jestDomPlugin, - }, - rules: { - // Jest recommended rules - ...jestPlugin.configs.recommended.rules, - - // Testing Library recommended rules - ...testingLibraryPlugin.configs.react.rules, - - // Jest DOM recommended rules - ...jestDomPlugin.configs.recommended.rules, - - 'react/jsx-no-bind': 'off', - // This rule isn't useful because we use TypeScript. - 'jest/valid-title': 'off', - - // Allow require(), for example for importing JSON files. - '@typescript-eslint/no-require-imports': 'off', - - // Adding more errors now - 'testing-library/no-manual-cleanup': 'error', - 'testing-library/no-wait-for-snapshot': 'error', - 'testing-library/prefer-explicit-assert': [ - 'error', - { includeFindQueries: false }, - ], - 'testing-library/prefer-presence-queries': 'error', - - // Disable some rules that are in the "recommended" part. - // This is a purely stylistic rule - 'testing-library/render-result-naming-convention': 'off', - // This disallows using `container`, but this is still useful for us sometimes - 'testing-library/no-container': 'off', - // This disallows using direct Node properties (eg: firstChild), but we have - // legitimate uses: - 'testing-library/no-node-access': 'off', - // Disable until https://github.com/testing-library/eslint-plugin-testing-library/issues/359 - // is fixed. - 'testing-library/await-async-query': 'off', - - // Individual jest-formatting rules so that we format only test and describe blocks - 'jest-formatting/padding-around-describe-blocks': 'error', - 'jest-formatting/padding-around-test-blocks': 'error', - }, - }, - - // __mocks__ directory configuration - { - files: ['__mocks__/**/*'], - languageOptions: { - globals: { - ...globals.jest, - }, - }, - } -); diff --git a/package.json b/package.json index ca4a98199f..83647a04f2 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "publish-cli": "node scripts/publish-profiler-cli.mjs", "lint": "node bin/output-fixing-commands.js run-p lint-js lint-css fmt-check", "lint-fix": "run-p lint-fix-js lint-fix-css fmt", - "lint-js": "node bin/output-fixing-commands.js eslint . --report-unused-disable-directives --cache --cache-strategy content", + "lint-js": "node bin/output-fixing-commands.js oxlint --type-aware", "lint-fix-js": "yarn lint-js --fix", "lint-css": "node bin/output-fixing-commands.js stylelint \"src/**/*.css\" \"res/**/*.css\"", "lint-fix-css": "yarn lint-css --fix", @@ -126,7 +126,6 @@ "@babel/preset-env": "^8.0.7", "@babel/preset-react": "^8.0.1", "@babel/preset-typescript": "^8.0.7", - "@eslint/js": "^9.39.5", "@testing-library/dom": "^10.4.2", "@testing-library/jest-dom": "^7.0.1", "@testing-library/react": "^16.3.3", @@ -139,8 +138,6 @@ "@types/react-dom": "^19.3.0", "@types/redux-logger": "^3.0.6", "@types/tgwf__co2": "^0.14.2", - "@typescript-eslint/eslint-plugin": "^8.71.1", - "@typescript-eslint/parser": "^8.71.1", "alex": "^11.0.1", "babel-jest": "^30.5.2", "babel-plugin-module-resolver": "^5.0.3", @@ -156,14 +153,12 @@ "eslint": "^9.39.5", "eslint-import-resolver-alias": "^1.1.2", "eslint-plugin-import": "^2.32.0", - "eslint-plugin-jest": "^29.17.0", "eslint-plugin-jest-dom": "^5.10.1", "eslint-plugin-jest-formatting": "^3.1.0", "eslint-plugin-react": "^7.37.5", "eslint-plugin-testing-library": "^7.16.2", "fake-indexeddb": "^6.2.5", "fetch-mock": "^12.6.0", - "globals": "^17.13.0", "husky": "^9.1.7", "jest": "^30.5.2", "jest-environment-jsdom": "^30.5.2", @@ -173,6 +168,8 @@ "npm-run-all2": "^8.0.4", "open": "^11.0.4", "oxfmt": "^0.72.0", + "oxlint": "1.85.0", + "oxlint-tsgolint": "^7.0.2002", "patch-package": "^8.0.1", "postcss": "^8.5.29", "postinstall-postinstall": "^2.1.0", @@ -180,8 +177,7 @@ "stylelint": "^17.16.0", "stylelint-config-idiomatic-order": "^10.0.0", "stylelint-config-standard": "^40.0.0", - "typescript": "^6.0.3", - "typescript-eslint": "^8.71.1", + "typescript": "7.0.2", "workbox-cli": "^7.4.1", "yargs": "^18.2.0" }, diff --git a/scripts/lib/oxlint-eslint-core-rules.mjs b/scripts/lib/oxlint-eslint-core-rules.mjs new file mode 100644 index 0000000000..0307020bd6 --- /dev/null +++ b/scripts/lib/oxlint-eslint-core-rules.mjs @@ -0,0 +1,17 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// An oxlint JS plugin that exposes some of ESLint's core rules. oxlint only +// implements these as type-aware rules, which can't run on JavaScript files. +// .oxlintrc.json enables them for JavaScript files only. +import { builtinRules } from 'eslint/use-at-your-own-risk'; + +const RULE_NAMES = ['consistent-return', 'dot-notation']; + +export default { + meta: { name: 'eslint-js' }, + rules: Object.fromEntries( + RULE_NAMES.map((name) => [name, builtinRules.get(name)]) + ), +}; diff --git a/src/components/app/AppLocalizationProvider.tsx b/src/components/app/AppLocalizationProvider.tsx index 2b85f1fc97..b40e71f78a 100644 --- a/src/components/app/AppLocalizationProvider.tsx +++ b/src/components/app/AppLocalizationProvider.tsx @@ -244,7 +244,7 @@ export class AppLocalizationProvider extends React.PureComponent< }; // Used by the global togglePseudoStrategy function for console access - // eslint-disable-next-line react/no-unused-class-component-methods + // oxlint-disable-next-line react-js/no-unused-class-component-methods togglePseudoStrategy = (pseudoStrategy: PseudoStrategy) => { this.setState({ pseudoStrategy }); }; diff --git a/src/components/flame-graph/ConnectedFlameGraph.tsx b/src/components/flame-graph/ConnectedFlameGraph.tsx index 17d8e1a46f..0946313b55 100644 --- a/src/components/flame-graph/ConnectedFlameGraph.tsx +++ b/src/components/flame-graph/ConnectedFlameGraph.tsx @@ -94,7 +94,8 @@ class ConnectedFlameGraphImpl { _flameGraph: React.RefObject = React.createRef(); - // eslint-disable-next-line react/no-unused-class-component-methods -- called via ConnectedFlameGraphHandle ref from FlameGraphViewImpl + // Called via ConnectedFlameGraphHandle ref from FlameGraphViewImpl. + // oxlint-disable-next-line react-js/no-unused-class-component-methods focus() { this._flameGraph.current?.focus(); } diff --git a/src/components/flame-graph/FlameGraph.tsx b/src/components/flame-graph/FlameGraph.tsx index a6999b3ad5..f91b111817 100644 --- a/src/components/flame-graph/FlameGraph.tsx +++ b/src/components/flame-graph/FlameGraph.tsx @@ -108,7 +108,7 @@ export class FlameGraph }; /* This method is called from ConnectedFlameGraph. */ - /* eslint-disable-next-line react/no-unused-class-component-methods */ + // oxlint-disable-next-line react-js/no-unused-class-component-methods focus = () => { if (this._viewport) { this._viewport.focus(); diff --git a/src/components/shared/ButtonWithPanel/ArrowPanel.tsx b/src/components/shared/ButtonWithPanel/ArrowPanel.tsx index 109ac54b84..dfb3b5eb15 100644 --- a/src/components/shared/ButtonWithPanel/ArrowPanel.tsx +++ b/src/components/shared/ButtonWithPanel/ArrowPanel.tsx @@ -36,7 +36,7 @@ export class ArrowPanel extends React.PureComponent { /* These 2 methods are called from other components. /* See https://github.com/firefox-devtools/profiler/issues/1888 and * https://github.com/firefox-devtools/profiler/issues/1641 */ - /* eslint-disable-next-line react/no-unused-class-component-methods */ + // oxlint-disable-next-line react-js/no-unused-class-component-methods open() { if (this.state.open) { return; @@ -45,7 +45,7 @@ export class ArrowPanel extends React.PureComponent { this.setState({ open: true }); } - /* eslint-disable-next-line react/no-unused-class-component-methods */ + // oxlint-disable-next-line react-js/no-unused-class-component-methods close() { this.setState((state) => { if (!state.open) { diff --git a/src/components/shared/TrackSearchField.tsx b/src/components/shared/TrackSearchField.tsx index 1519c5e6f4..28afea7f8d 100644 --- a/src/components/shared/TrackSearchField.tsx +++ b/src/components/shared/TrackSearchField.tsx @@ -20,7 +20,7 @@ export class TrackSearchField extends React.PureComponent { }; /* This is called from TrackContextMenu directly */ - /* eslint-disable-next-line react/no-unused-class-component-methods */ + // oxlint-disable-next-line react-js/no-unused-class-component-methods focus = () => { if (this.searchFieldInput.current) { this.searchFieldInput.current.focus(); diff --git a/src/components/shared/TreeView.tsx b/src/components/shared/TreeView.tsx index 3b49a9cef1..5bc2fb4eb9 100644 --- a/src/components/shared/TreeView.tsx +++ b/src/components/shared/TreeView.tsx @@ -794,7 +794,7 @@ export class TreeView< ); /* This method is used by users of this component. */ - /* eslint-disable-next-line react/no-unused-class-component-methods */ + // oxlint-disable-next-line react-js/no-unused-class-component-methods scrollSelectionIntoView() { const { selectedNodeId, tree } = this.props; const list = this._list; // this temp variable so that flow knows that it's non-null later @@ -1112,7 +1112,7 @@ export class TreeView< }; /* This method is used by users of this component. */ - /* eslint-disable-next-line react/no-unused-class-component-methods */ + // oxlint-disable-next-line react-js/no-unused-class-component-methods focus() { if (this._list) { this._list.focus(); diff --git a/src/components/shared/VirtualList.tsx b/src/components/shared/VirtualList.tsx index bd01924cf2..0f6a130efb 100644 --- a/src/components/shared/VirtualList.tsx +++ b/src/components/shared/VirtualList.tsx @@ -380,7 +380,7 @@ export class VirtualList extends React.PureComponent< * * offsetX is how much the horizontal position is offset by fixed columns, if applicable. */ /* This method is used by users of this component. */ - /* eslint-disable-next-line react/no-unused-class-component-methods */ + // oxlint-disable-next-line react-js/no-unused-class-component-methods scrollItemIntoView( itemIndex: number, itemX: CssPixels, @@ -438,7 +438,7 @@ export class VirtualList extends React.PureComponent< } /* This method is used by users of this component. */ - /* eslint-disable-next-line react/no-unused-class-component-methods */ + // oxlint-disable-next-line react-js/no-unused-class-component-methods focus() { const container = this._container.current; if (container) { diff --git a/src/test/components/FlameGraph.test.tsx b/src/test/components/FlameGraph.test.tsx index b91f50cd39..5e24202a78 100644 --- a/src/test/components/FlameGraph.test.tsx +++ b/src/test/components/FlameGraph.test.tsx @@ -166,7 +166,7 @@ describe('FlameGraph', function () { const valueElement = ensureExists(resourceLabel.nextSibling); // See https://github.com/testing-library/jest-dom/issues/306 - // eslint-disable-next-line jest-dom/prefer-to-have-text-content + // oxlint-disable-next-line jest-dom/prefer-to-have-text-content expect(valueElement.textContent).toBe('libxul.so'); // But also do a good old snapshot. expect(tooltip).toMatchSnapshot(); diff --git a/src/test/components/MenuButtons.test.tsx b/src/test/components/MenuButtons.test.tsx index 6f9dda87c8..5d988af0bb 100644 --- a/src/test/components/MenuButtons.test.tsx +++ b/src/test/components/MenuButtons.test.tsx @@ -615,10 +615,9 @@ describe('app/MenuButtons', function () { screen.getByText(/Buffer capacity/).nextSibling ); - /* This rule needs to be disabled because `renderedCapacity` is a text - * code, and this triggers + /* `renderedCapacity` is a text code, so toHaveTextContent would hit * https://github.com/testing-library/jest-dom/issues/306 */ - /* eslint-disable-next-line jest-dom/prefer-to-have-text-content */ + // oxlint-disable-next-line jest-dom/prefer-to-have-text-content expect(renderedCapacity.textContent).toBe('1GB'); expect(getMetaInfoPanel()).toMatchSnapshot(); }); @@ -636,10 +635,9 @@ describe('app/MenuButtons', function () { screen.getByText(/Device:/).nextSibling ); - /* This rule needs to be disabled because `renderedDevice` is a text - * code, and this triggers + /* `renderedDevice` is a text code, so toHaveTextContent would hit * https://github.com/testing-library/jest-dom/issues/306 */ - /* eslint-disable-next-line jest-dom/prefer-to-have-text-content */ + // oxlint-disable-next-line jest-dom/prefer-to-have-text-content expect(renderedDevice.textContent).toBe('Android Device'); expect(getMetaInfoPanel()).toMatchSnapshot(); }); diff --git a/src/test/components/TransformShortcuts.test.tsx b/src/test/components/TransformShortcuts.test.tsx index aefbcfbd4a..2230dba3c5 100644 --- a/src/test/components/TransformShortcuts.test.tsx +++ b/src/test/components/TransformShortcuts.test.tsx @@ -186,9 +186,7 @@ const pressKeyBuilder = (className: string) => (options: KeyPressOptions) => { fireFullKeyPress(div, options); }; -/* eslint-disable jest/no-standalone-expect */ -// Disable the jest/no-standalone-expect rule because eslint doesn't know that -// these expectations will run in a test block later. +// These expectations run inside a test block later, not at this point. // These actions will be used to generate use cases for each of the supported panels. const actions = { 'a selected node': ( @@ -249,7 +247,6 @@ const actions = { ).not.toBeNull(); }, }; -/* eslint-enable jest/no-standalone-expect */ autoMockCanvasContext(); diff --git a/src/test/unit/merge-compare.test.ts b/src/test/unit/merge-compare.test.ts index c2b7624b53..c48d56c18d 100644 --- a/src/test/unit/merge-compare.test.ts +++ b/src/test/unit/merge-compare.test.ts @@ -82,7 +82,10 @@ describe('mergeProfilesForDiffing function', function () { libName = mergedLibs[libIndex].name; } - /* eslint-disable jest/no-conditional-expect */ + // These conditional expects aren't reported because of an oxlint bug: + // https://github.com/oxc-project/oxc/issues/28054 + // Once it's fixed, wrap this switch in + // oxlint-disable/enable jest/no-conditional-expect comments. switch (funcName) { case 'A': expect(libName).toBeOneOf(['libA', 'libB']); @@ -98,7 +101,6 @@ describe('mergeProfilesForDiffing function', function () { break; default: } - /* eslint-enable */ } }); diff --git a/src/test/unit/path.test.ts b/src/test/unit/path.test.ts index d1885d4e4f..aba5bcae37 100644 --- a/src/test/unit/path.test.ts +++ b/src/test/unit/path.test.ts @@ -89,7 +89,6 @@ describe('PathSet', function () { const resultValues: CallNodePath[] = []; set.forEach(function (value1, value2, thisSet) { // @ts-expect-error TS2683: 'this' implicitly has type 'any' because it does not have a type annotation. - // eslint-disable-next-line no-invalid-this expect(this).toBe(undefined); expect(value1).toBe(value2); expect(thisSet).toBe(set); diff --git a/src/test/unit/process-profile.test.ts b/src/test/unit/process-profile.test.ts index 407ee9368f..0ee0988e35 100644 --- a/src/test/unit/process-profile.test.ts +++ b/src/test/unit/process-profile.test.ts @@ -837,11 +837,15 @@ describe('visualMetrics processing', function () { (name) => shared.stringArray[name] === metricProgressMarkerName ); + // eslint-plugin-jest only applies this rule inside a test callback; + // oxlint also applies it to helpers like this one. + /* oxlint-disable jest/no-conditional-expect */ if (hasProgressMarker) { expect(metricProgressMarker).toBeTruthy(); } else { expect(metricProgressMarker).toBeFalsy(); } + /* oxlint-enable jest/no-conditional-expect */ // Check the visual metric change markers. const metricChangeMarkerName = `${name} Change`; diff --git a/yarn.lock b/yarn.lock index fbe5a24e53..932710e649 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2115,7 +2115,7 @@ dependencies: eslint-visitor-keys "^3.4.3" -"@eslint-community/regexpp@^4.12.1", "@eslint-community/regexpp@^4.12.2": +"@eslint-community/regexpp@^4.12.1": version "4.12.2" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b" integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== @@ -2158,7 +2158,7 @@ minimatch "^3.1.5" strip-json-comments "^3.1.1" -"@eslint/js@9.39.5", "@eslint/js@^9.39.5": +"@eslint/js@9.39.5": version "9.39.5" resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.39.5.tgz#6f2fbcff75500d229d535e0a949ae13472c84787" integrity sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A== @@ -2778,6 +2778,131 @@ resolved "https://registry.yarnpkg.com/@oxfmt/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.72.0.tgz#e544040c448f59b83793a1d7f6ad9b1111261c39" integrity sha512-uhooIN+DCzWX5uH7mQkSVCsODqsGluGJ4n3ch4+mITtWKpESMDjUJUSDBAVFuYQDwqY2McPDKdKJbM0oZVW/Qw== +"@oxlint-tsgolint/darwin-arm64@7.0.2004": + version "7.0.2004" + resolved "https://registry.yarnpkg.com/@oxlint-tsgolint/darwin-arm64/-/darwin-arm64-7.0.2004.tgz#f164eebc5b5689298b61c537c7ec2f69624081fe" + integrity sha512-uJk3ttju7Lz+Nv8WG4CsLyewoL1qf/Ny8S8OksJ7Bm/F14Tc9gMfW6arM1PCc57IzH/X/I79YsCWTgxX1FKibQ== + +"@oxlint-tsgolint/darwin-x64@7.0.2004": + version "7.0.2004" + resolved "https://registry.yarnpkg.com/@oxlint-tsgolint/darwin-x64/-/darwin-x64-7.0.2004.tgz#201caabbd5913d1b8731e5de3bd39646d9975a86" + integrity sha512-0BFfHTzDxNDFPcu0UZAXT6CyCJHAXM0dZveyDb4KEHa2qF/DSnOKOrmvK/wFuFol9kvijbGM9JfuOsor+zWXRw== + +"@oxlint-tsgolint/linux-arm64@7.0.2004": + version "7.0.2004" + resolved "https://registry.yarnpkg.com/@oxlint-tsgolint/linux-arm64/-/linux-arm64-7.0.2004.tgz#1a5cd1f5e6009c0069b9f840176bf8fe5e4fd987" + integrity sha512-TAehQc+qdRXyDN3nl/r/3/oPrBVrbtrDeGMkFyG6mf+XphpoJ2lAMVFLclyvrVZCw02RbKROjyw8h72XwQQHcw== + +"@oxlint-tsgolint/linux-x64@7.0.2004": + version "7.0.2004" + resolved "https://registry.yarnpkg.com/@oxlint-tsgolint/linux-x64/-/linux-x64-7.0.2004.tgz#308944193eee3f86eeecb128dd39fde5e4bfabb5" + integrity sha512-LPunZvm6ZbWPfHMAyfZf9ci3HHvNEzLejO8zdqO3GoVGoSEHqqufHUD7+OgeatVSaJP7uXDJ2HaNOHIoH7go4Q== + +"@oxlint-tsgolint/win32-arm64@7.0.2004": + version "7.0.2004" + resolved "https://registry.yarnpkg.com/@oxlint-tsgolint/win32-arm64/-/win32-arm64-7.0.2004.tgz#a068a6291b2544e6b0281ae68f2aa52852d423c0" + integrity sha512-FVWplzDImWhiuawnIZVETaQecv4GWom6Jv4Fx2xj7hhXXDZ5okEgiw1gTCImHTIQsi2ycC5oSxVwrn69bMh7iw== + +"@oxlint-tsgolint/win32-x64@7.0.2004": + version "7.0.2004" + resolved "https://registry.yarnpkg.com/@oxlint-tsgolint/win32-x64/-/win32-x64-7.0.2004.tgz#57473c29e2e196d6ff2c44ab3a950fb9739836ff" + integrity sha512-7PsxuUx11Ry9DYTWcljTzRbmZY9B6O9fFFfZV+aodQEMy6pfRT3fhoQRv9PtGN/89z1pPz3nFKrsFm6WqNtX7w== + +"@oxlint/binding-android-arm-eabi@1.85.0": + version "1.85.0" + resolved "https://registry.yarnpkg.com/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.85.0.tgz#b95305795de282c081492653abada2a46f68c714" + integrity sha512-q2KO/Zso9UT+OMn0NF9ywn4E4t0MI3yxiDhNyhsQ7DyQJrC4FhFE4TXOi4bktFnOWXTMds8qZSbpv2XwRaNOBg== + +"@oxlint/binding-android-arm64@1.85.0": + version "1.85.0" + resolved "https://registry.yarnpkg.com/@oxlint/binding-android-arm64/-/binding-android-arm64-1.85.0.tgz#afe58d09f29ba7a56415fefcf5a55d6baa758d50" + integrity sha512-SxLN3ALjoT9NNdvpjEevGeHvfzTAFrF0NBYB5tzK7/GtCKMze3j1e/m/X2ozqGj2U9hfGG/dg/OG8vpVK4PiDA== + +"@oxlint/binding-darwin-arm64@1.85.0": + version "1.85.0" + resolved "https://registry.yarnpkg.com/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.85.0.tgz#d63f7e3fefa7073edd5a42b0a6ad07a458fbffef" + integrity sha512-Y/Sup/J4f0f9UGsSd/xyCNTeWL+gepO63GBdEDAfue9nBsnk9zMmnIXx1O6b1V8C90vB5nucYNZ0pbMXAp8zJA== + +"@oxlint/binding-darwin-x64@1.85.0": + version "1.85.0" + resolved "https://registry.yarnpkg.com/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.85.0.tgz#41c75b0181f360b7cc2654e478c95037be780708" + integrity sha512-ApOSNC04ynpDTwvBD+//0wyfODRSbEzvRoKpX8teffmc27z8AockwSNeMXGJXn5KP85eahDgR/2llICWLkzcnw== + +"@oxlint/binding-freebsd-x64@1.85.0": + version "1.85.0" + resolved "https://registry.yarnpkg.com/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.85.0.tgz#252b099dd4c4c3d5ee7fc53a774d58a37ac6a948" + integrity sha512-bNrVrCOA/kHky3Tu79IXWXe5bhIgLXfUuUEDHlAGOHUk96MkvDZ1ecaQF19rwstrnaqfP1o9nBTqzIr9+ZHkUg== + +"@oxlint/binding-linux-arm-gnueabihf@1.85.0": + version "1.85.0" + resolved "https://registry.yarnpkg.com/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.85.0.tgz#ae16c5b5f55480dba86ce7de377ede00964ea756" + integrity sha512-NUrzOJ1s/EqsVvfn2L/1D8Wro2LPIZUbihL8kOJLh5fEdGEN3rdOGUYq3HwnUIL8sjpoP+4N6RaGrgmMJnaMPw== + +"@oxlint/binding-linux-arm-musleabihf@1.85.0": + version "1.85.0" + resolved "https://registry.yarnpkg.com/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.85.0.tgz#a903f6043725cc311c81e2c5a1e3383621b0d2d9" + integrity sha512-UJXrAT3E/RWkEqXLIs2ehETja1qfgkPb+5gwLIIS+o/6cf+grHvoOXTa5997a/YNQfcJS0DRBTOfZt95cvOI1g== + +"@oxlint/binding-linux-arm64-gnu@1.85.0": + version "1.85.0" + resolved "https://registry.yarnpkg.com/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.85.0.tgz#8afee8ea5be0c4edb74d2a25eee1e510c77dbf8e" + integrity sha512-lK40QLjI0HxigO7CjDDshEtfYIeiYS0020v5BHFPqN4uuQBQxd2K9LNom2dW15o9F1937quSCRVp4ZsVhdbYdg== + +"@oxlint/binding-linux-arm64-musl@1.85.0": + version "1.85.0" + resolved "https://registry.yarnpkg.com/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.85.0.tgz#62cc783fb610f1b0be9328364eec8a07add3e3e7" + integrity sha512-c2zbdBwGKreHXwRx3gWBuFGJxLhxgsg6YlZ+3H+RgRusU/UEV9jNwJ3HGYK+nRo0LvBa7mt6Kj86xoVotUo8cw== + +"@oxlint/binding-linux-ppc64-gnu@1.85.0": + version "1.85.0" + resolved "https://registry.yarnpkg.com/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.85.0.tgz#530ec6f185f8bc7f86819b44483e987599ccbcf1" + integrity sha512-tlt/Hy8lZ97/lCPmCgw/B3k/mwh+BzaIPbPkldZEly7TwLmx0xe2CQcaW2g/rR0dOgS9JNGCZsMEqLhUNMGvaw== + +"@oxlint/binding-linux-riscv64-gnu@1.85.0": + version "1.85.0" + resolved "https://registry.yarnpkg.com/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.85.0.tgz#35c430e60ef8d8dddafd16f79adc1bf936ddeddb" + integrity sha512-3tNR9Xey82X0zKuY1d8hJ6Rc9gwRDurmqGLnQZa5xqOXy8/YyiqFXjAtugkKLY82obOlpK1eSiDRlgcNPuxtIg== + +"@oxlint/binding-linux-riscv64-musl@1.85.0": + version "1.85.0" + resolved "https://registry.yarnpkg.com/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.85.0.tgz#426eb8fb43852707dd872bbc0e8415832f9307e8" + integrity sha512-wbGRd5PqCcjkJFHhZuZ2OBSUQY9czlQsoA/cQQB9JK/L9mC5MQgGoKAh+xd8QjA5V+0D3j+Qd1lAWn1I8zlelA== + +"@oxlint/binding-linux-s390x-gnu@1.85.0": + version "1.85.0" + resolved "https://registry.yarnpkg.com/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.85.0.tgz#f53c7132389e71dc68cad7a319fc0a92abbb1fcf" + integrity sha512-3Sn0kSrE4DPZCWV/8o+n4x3aFZxI9ulMnkYlwCbJ8eUVkwRK2IerohE/A/z3SNbCwoPFOCJmGE5Avrq0rrvdvQ== + +"@oxlint/binding-linux-x64-gnu@1.85.0": + version "1.85.0" + resolved "https://registry.yarnpkg.com/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.85.0.tgz#74769aa504ce7c2571574684ed36387b40c9bfb7" + integrity sha512-JY2pxxYfB62bAGfejljVCqc44etItehPuAyaeSAdMuEMtwNA00ggMnS66lC1oIhos6oOXUkuU6mZ9bpFh3BqWg== + +"@oxlint/binding-linux-x64-musl@1.85.0": + version "1.85.0" + resolved "https://registry.yarnpkg.com/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.85.0.tgz#0d99815e87e85c51c4ab0e351ddf9b643578e3b6" + integrity sha512-5k74vZ6qJBjBHEOlBk9B/iv68Yu0F1Afw/vvT2ar6OGCqEeXLaSjXz2n/IPCbhLG22UoKoYEJTzpYraRdcp6PA== + +"@oxlint/binding-openharmony-arm64@1.85.0": + version "1.85.0" + resolved "https://registry.yarnpkg.com/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.85.0.tgz#051fc72cd1a103b73d758f3f2eb9d3748ba4aafc" + integrity sha512-GbAl5qt5TCkPLXTaIISZJnugrcBhra6rodcXc9jYt620UtdsTt71NlNmJmm0frxzFpd54x/G+MkitEJA8I/BoA== + +"@oxlint/binding-win32-arm64-msvc@1.85.0": + version "1.85.0" + resolved "https://registry.yarnpkg.com/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.85.0.tgz#6bd2fd33ae029685f0f162c8ba5976c3e2059a6b" + integrity sha512-kjmws5MK0et2swk4ND85D7NVQyDHw162i6whtZDLUA/lo6FQyBZDcmMRCMcVZcNrAhIaftVb00x9ChGDOjjNJA== + +"@oxlint/binding-win32-ia32-msvc@1.85.0": + version "1.85.0" + resolved "https://registry.yarnpkg.com/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.85.0.tgz#d8ab96fd47c575baf78713425680e0533aa2436f" + integrity sha512-eSsIJx9n4yxvOqYTZyPEMyEXRmE60XH7xGAU7i0Qbsn1lf6Za3CWJ9aRd82oSFKXaxhp+sA6/yMJVRIpLpna6A== + +"@oxlint/binding-win32-x64-msvc@1.85.0": + version "1.85.0" + resolved "https://registry.yarnpkg.com/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.85.0.tgz#d8ab9af17878dfee4f6b57581eb116cb10a9abd6" + integrity sha512-pBebIPUpKKhWrhSMWhy8TdAZBewiXnfxmaAGxhzxM1068GagqFaTwgKlU6e+UyJ2sPR+VoHouhXuGJkQjsrDvA== + "@parcel/watcher-android-arm64@2.6.0": version "2.6.0" resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz#99aaa3223d43807c9340af439cad7e9b6d26ada6" @@ -3337,7 +3462,7 @@ "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/mdast@^3.0.0", "@types/mdast@^3.0.3": version "3.0.10" @@ -3463,31 +3588,6 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@8.71.1", "@typescript-eslint/eslint-plugin@^8.71.1": - version "8.71.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.71.1.tgz#b37fe4f6b33c707b183ae93421be10d4fe86e275" - integrity sha512-nNlBf6HuotqMgZvSkWD5hNdemiBIxQ2NmrlgfcUIeZRs+BbakjscCQRq/Hb74EFVnFiSWWdL12JruqwBy3ERDw== - dependencies: - "@eslint-community/regexpp" "^4.12.2" - "@typescript-eslint/scope-manager" "8.71.1" - "@typescript-eslint/type-utils" "8.71.1" - "@typescript-eslint/utils" "8.71.1" - "@typescript-eslint/visitor-keys" "8.71.1" - ignore "^7.0.5" - natural-compare "^1.4.0" - ts-api-utils "^2.5.0" - -"@typescript-eslint/parser@8.71.1", "@typescript-eslint/parser@^8.71.1": - version "8.71.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.71.1.tgz#aad16e9813272b931caab52393449fa11cc4a269" - integrity sha512-oM/5sAqz/l1v/zYK1qTOPrn2+JIrBGC1V6uNYucRO5gh6eT9vWJ/RhPbGE59byvZEUQ4VP6XkLBaS5Jti5jpvw== - dependencies: - "@typescript-eslint/scope-manager" "8.71.1" - "@typescript-eslint/types" "8.71.1" - "@typescript-eslint/typescript-estree" "8.71.1" - "@typescript-eslint/visitor-keys" "8.71.1" - debug "^4.4.3" - "@typescript-eslint/project-service@8.71.1": version "8.71.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.71.1.tgz#741743e7b74a7c77cf9c54c173a95dee79648857" @@ -3510,17 +3610,6 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.71.1.tgz#d2a7458bea46736085afdcec3f7bc845ad3b0e56" integrity sha512-oTvkml5SxXhgg+WWKhod5qWQICDXtOB+/Hi9VdPKFAANJ2b7YOgMffgvzXuqog7R6A/JtrzRf128dsxummyWhg== -"@typescript-eslint/type-utils@8.71.1": - version "8.71.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.71.1.tgz#65906b1015d064887fd8382887a1695c1d67a16d" - integrity sha512-kH3t3jZCYv2PZSBEWPKTariLrCaoF1CLoPitYFBJOhAGEwWnSRAtGEifrfrpBa4K9JlwWNZotgA5w3/wLSk/FQ== - dependencies: - "@typescript-eslint/types" "8.71.1" - "@typescript-eslint/typescript-estree" "8.71.1" - "@typescript-eslint/utils" "8.71.1" - debug "^4.4.3" - ts-api-utils "^2.5.0" - "@typescript-eslint/types@8.71.1", "@typescript-eslint/types@^8.71.1": version "8.71.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.71.1.tgz#5ac145ce6251e4b51ab8fbecfcc453faad8aa0f3" @@ -3541,7 +3630,7 @@ tinyglobby "^0.2.15" ts-api-utils "^2.5.0" -"@typescript-eslint/utils@8.71.1", "@typescript-eslint/utils@^8.0.0", "@typescript-eslint/utils@^8.56.0": +"@typescript-eslint/utils@^8.56.0": version "8.71.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.71.1.tgz#cb0a9933f9d1705b44c11462e5ba26bf9fdcefeb" integrity sha512-CBjT6gfAz3DW2j9Q4moFnqt208Aq+506sVGXfpRcyAeqn0EpayL0mjdWoCO2t3RC7GewNrFxdeehuEaPg6DMzQ== @@ -3559,6 +3648,106 @@ "@typescript-eslint/types" "8.71.1" eslint-visitor-keys "^5.0.0" +"@typescript/typescript-aix-ppc64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-aix-ppc64/-/typescript-aix-ppc64-7.0.2.tgz#cdc7ce81d60f1e09034960ddfb1fb880d7a776b6" + integrity sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ== + +"@typescript/typescript-darwin-arm64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-darwin-arm64/-/typescript-darwin-arm64-7.0.2.tgz#a55fdfcfa58df58d27db2237cde6a5c1e35a7235" + integrity sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA== + +"@typescript/typescript-darwin-x64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-darwin-x64/-/typescript-darwin-x64-7.0.2.tgz#38d1c9172800a91d707bec64d2a370a016634db4" + integrity sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA== + +"@typescript/typescript-freebsd-arm64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-freebsd-arm64/-/typescript-freebsd-arm64-7.0.2.tgz#f1ff8810030b35d2b5be0db6a2dc650460ea94fa" + integrity sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ== + +"@typescript/typescript-freebsd-x64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-freebsd-x64/-/typescript-freebsd-x64-7.0.2.tgz#3d86b03f353c5b1ba95162eb6ce35533bfc294bd" + integrity sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw== + +"@typescript/typescript-linux-arm64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-linux-arm64/-/typescript-linux-arm64-7.0.2.tgz#d9334d96d6dac6ff85da9c865588948de939e91f" + integrity sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ== + +"@typescript/typescript-linux-arm@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-linux-arm/-/typescript-linux-arm-7.0.2.tgz#ad94b41e1aee2a4dcc6a298c7b67c43345fde32e" + integrity sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ== + +"@typescript/typescript-linux-loong64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-linux-loong64/-/typescript-linux-loong64-7.0.2.tgz#2965aee4fc873360139d893daafe6397a29138ad" + integrity sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ== + +"@typescript/typescript-linux-mips64el@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-linux-mips64el/-/typescript-linux-mips64el-7.0.2.tgz#1a887a311bed3a833f80bfd4a9ed37c271936cf0" + integrity sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA== + +"@typescript/typescript-linux-ppc64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-linux-ppc64/-/typescript-linux-ppc64-7.0.2.tgz#8b63c9b2f445b393eb4e43ec21da225dade3577d" + integrity sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA== + +"@typescript/typescript-linux-riscv64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-linux-riscv64/-/typescript-linux-riscv64-7.0.2.tgz#b6e8a35c289b3ea97a92a41d461aaeed0d3b36e1" + integrity sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ== + +"@typescript/typescript-linux-s390x@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-linux-s390x/-/typescript-linux-s390x-7.0.2.tgz#2ef96693be4861f6d17965427e5b009cbbed1a3e" + integrity sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw== + +"@typescript/typescript-linux-x64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-linux-x64/-/typescript-linux-x64-7.0.2.tgz#73269cb0baba50aea0ca060445a6b88e583f1ce2" + integrity sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A== + +"@typescript/typescript-netbsd-arm64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-netbsd-arm64/-/typescript-netbsd-arm64-7.0.2.tgz#3a3649f97fafa210b4e6e3798c15e06605c8a901" + integrity sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA== + +"@typescript/typescript-netbsd-x64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-netbsd-x64/-/typescript-netbsd-x64-7.0.2.tgz#47ec59491a40c470d2807dc4d2b825528fd979ab" + integrity sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA== + +"@typescript/typescript-openbsd-arm64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-openbsd-arm64/-/typescript-openbsd-arm64-7.0.2.tgz#796be8da0bd989d8a3fb96f2801e38a8365b4baf" + integrity sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ== + +"@typescript/typescript-openbsd-x64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-openbsd-x64/-/typescript-openbsd-x64-7.0.2.tgz#d37fe2a729eb942c076c454ee7f1815faf7d560f" + integrity sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg== + +"@typescript/typescript-sunos-x64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-sunos-x64/-/typescript-sunos-x64-7.0.2.tgz#aba8d3464c3565a7044789baba96916bd4ab2c88" + integrity sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g== + +"@typescript/typescript-win32-arm64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-win32-arm64/-/typescript-win32-arm64-7.0.2.tgz#b9de50a17196383f62620b5f9d0a2f34ad3b60d7" + integrity sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ== + +"@typescript/typescript-win32-x64@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@typescript/typescript-win32-x64/-/typescript-win32-x64-7.0.2.tgz#cf3b7b0d6ce5635daca4c8e01c189cdcde47ec3c" + integrity sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g== + "@ungap/structured-clone@^1.3.0": version "1.3.0" resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" @@ -3891,7 +4080,7 @@ array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: call-bound "^1.0.3" is-array-buffer "^3.0.5" -array-includes@^3.1.1, array-includes@^3.1.8, array-includes@^3.1.9: +array-includes@^3.1.1, array-includes@^3.1.8: version "3.1.9" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.9.tgz#1f0ccaa08e90cdbc3eb433210f903ad0f17c3f3a" integrity sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ== @@ -3905,6 +4094,20 @@ array-includes@^3.1.1, array-includes@^3.1.8, array-includes@^3.1.9: is-string "^1.1.1" math-intrinsics "^1.1.0" +array-includes@^3.1.9: + version "3.2.0" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.2.0.tgz#18771e6837351aa139c3b58873371d0afa64964a" + integrity sha512-VXY5eFRarnXcYxwBjJzPmEhH55+rmP79/+ueDhi0F+TuqfHCItagIHqxeUZrmgrOPa31QTh9H85DjX3FfJ0FTg== + dependencies: + call-bind "^1.0.9" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-abstract "^1.24.2" + es-object-atoms "^1.1.2" + es-shim-unscopables "^1.1.0" + is-string "^1.1.1" + math-intrinsics "^1.1.0" + array-iterate@^1.0.0: version "1.1.4" resolved "https://registry.yarnpkg.com/array-iterate/-/array-iterate-1.1.4.tgz#add1522e9dd9749bb41152d08b845bd08d6af8b7" @@ -4378,6 +4581,16 @@ call-bind@^1.0.7, call-bind@^1.0.8: get-intrinsic "^1.2.4" set-function-length "^1.2.2" +call-bind@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.9.tgz#39a644700c80bc7d0ca9102fc6d1d43b2fd7eee7" + integrity sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + get-intrinsic "^1.3.0" + set-function-length "^1.2.2" + call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" @@ -5317,6 +5530,66 @@ es-abstract@^1.17.5, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23 unbox-primitive "^1.1.0" which-typed-array "^1.1.19" +es-abstract@^1.24.2: + version "1.24.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.2.tgz#2dbd38c180735ee983f77585140a2706a963ed9a" + integrity sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg== + dependencies: + array-buffer-byte-length "^1.0.2" + arraybuffer.prototype.slice "^1.0.4" + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + data-view-buffer "^1.0.2" + data-view-byte-length "^1.0.2" + data-view-byte-offset "^1.0.1" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + es-set-tostringtag "^2.1.0" + es-to-primitive "^1.3.0" + function.prototype.name "^1.1.8" + get-intrinsic "^1.3.0" + get-proto "^1.0.1" + get-symbol-description "^1.1.0" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + internal-slot "^1.1.0" + is-array-buffer "^3.0.5" + is-callable "^1.2.7" + is-data-view "^1.0.2" + is-negative-zero "^2.0.3" + is-regex "^1.2.1" + is-set "^2.0.3" + is-shared-array-buffer "^1.0.4" + is-string "^1.1.1" + is-typed-array "^1.1.15" + is-weakref "^1.1.1" + math-intrinsics "^1.1.0" + object-inspect "^1.13.4" + object-keys "^1.1.1" + object.assign "^4.1.7" + own-keys "^1.0.1" + regexp.prototype.flags "^1.5.4" + safe-array-concat "^1.1.3" + safe-push-apply "^1.0.0" + safe-regex-test "^1.1.0" + set-proto "^1.0.0" + stop-iteration-iterator "^1.1.0" + string.prototype.trim "^1.2.10" + string.prototype.trimend "^1.0.9" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.3" + typed-array-byte-length "^1.0.3" + typed-array-byte-offset "^1.0.4" + typed-array-length "^1.0.7" + unbox-primitive "^1.1.0" + which-typed-array "^1.1.19" + es-define-property@^1.0.0, es-define-property@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" @@ -5361,6 +5634,13 @@ es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: dependencies: es-errors "^1.3.0" +es-object-atoms@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.2.tgz#a2d0b373205724dfa525d23b0c3e1b1ca582c99b" + integrity sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw== + dependencies: + es-errors "^1.3.0" + es-set-tostringtag@^2.0.3, es-set-tostringtag@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" @@ -5475,18 +5755,18 @@ eslint-import-resolver-alias@^1.1.2: integrity sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w== eslint-import-resolver-node@^0.3.9: - version "0.3.9" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" - integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== + version "0.3.10" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz#84ce3005abfc300588cf23bbac1aabec1fc6e8c1" + integrity sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ== dependencies: debug "^3.2.7" - is-core-module "^2.13.0" - resolve "^1.22.4" + is-core-module "^2.16.1" + resolve "^2.0.0-next.6" eslint-module-utils@^2.12.1: - version "2.12.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz#f76d3220bfb83c057651359295ab5854eaad75ff" - integrity sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw== + version "2.14.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.14.0.tgz#611f8e1c6ceb29a93eb949e1cc670b8287764819" + integrity sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig== dependencies: debug "^3.2.7" @@ -5527,13 +5807,6 @@ eslint-plugin-jest-formatting@^3.1.0: resolved "https://registry.yarnpkg.com/eslint-plugin-jest-formatting/-/eslint-plugin-jest-formatting-3.1.0.tgz#b26dd5a40f432b642dcc880021a771bb1c93dcd2" integrity sha512-XyysraZ1JSgGbLSDxjj5HzKKh0glgWf+7CkqxbTqb7zEhW7X2WHo5SBQ8cGhnszKN+2Lj3/oevBlHNbHezoc/A== -eslint-plugin-jest@^29.17.0: - version "29.17.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-29.17.0.tgz#513444e5f0b2ed559116f0be02a41e6e22e84f39" - integrity sha512-6jtpU6MhYKbagkES02TupWAUUooJpZtKg94Ax0b8HhUorv3InSTBU8RRtlSBe0LocOcShXOpyec3PHzPDkJCSg== - dependencies: - "@typescript-eslint/utils" "^8.0.0" - eslint-plugin-react@^7.37.5: version "7.37.5" resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz#2975511472bdda1b272b34d779335c9b0e877065" @@ -6238,11 +6511,6 @@ globals@^14.0.0: resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== -globals@^17.13.0: - version "17.13.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-17.13.0.tgz#ab2134b5ededbf2fbe2831dd0acc36f4f1ddeac5" - integrity sha512-RwMTC61u7hrG3ZJMkZQOK4JLJrKS8QtoTii63EmWvFXHqycY9FObBJQCbsLxSO8kjKhWE5kV1GC+Vb1g3RI0Zg== - globalthis@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" @@ -6385,6 +6653,13 @@ hasown@^2.0.2: dependencies: function-bind "^1.1.2" +hasown@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.4.tgz#8c62d8cb90beb2aad5d0a5b67581ad9854c3f003" + integrity sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A== + dependencies: + function-bind "^1.1.2" + hast-util-embedded@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/hast-util-embedded/-/hast-util-embedded-2.0.0.tgz#877f4261044854743fc2621f728930ca61c8376f" @@ -6899,6 +7174,13 @@ is-core-module@^2.13.0, is-core-module@^2.16.1, is-core-module@^2.5.0, is-core-m dependencies: hasown "^2.0.2" +is-core-module@^2.16.2: + version "2.17.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.17.0.tgz#75c1c76236c9f7e38ddbfff292e127dc13b21027" + integrity sha512-J/vG0zBCbIKOQFfufSwyXdMrsohyJIUNkrnmo6WZGzoM7tr/lsbfW5b2BvisL6zsyMzK9UxV9L6c7AoFbyXHOA== + dependencies: + hasown "^2.0.4" + is-data-view@^1.0.1, is-data-view@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" @@ -9282,6 +9564,16 @@ node-addon-api@^7.0.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== +node-exports-info@^1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/node-exports-info/-/node-exports-info-1.6.2.tgz#243a3105677d6781cd26e6a72350fd928a5cb46f" + integrity sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag== + dependencies: + array.prototype.flatmap "^1.3.3" + es-errors "^1.3.0" + object.entries "^1.1.9" + semver "^6.3.1" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -9591,6 +9883,43 @@ oxfmt@^0.72.0: "@oxfmt/binding-win32-ia32-msvc" "0.72.0" "@oxfmt/binding-win32-x64-msvc" "0.72.0" +oxlint-tsgolint@^7.0.2002: + version "7.0.2004" + resolved "https://registry.yarnpkg.com/oxlint-tsgolint/-/oxlint-tsgolint-7.0.2004.tgz#fb5fde1541d85ce72cbccf2c10fea055aae0b4fb" + integrity sha512-vQ9WDF3fiZJvRdSDosNOflerOCOpwol6vWzVDxW76RcU19cjTh7engvkHLvmv+tzedR8fAiJUVUGr6IVZdkzXQ== + optionalDependencies: + "@oxlint-tsgolint/darwin-arm64" "7.0.2004" + "@oxlint-tsgolint/darwin-x64" "7.0.2004" + "@oxlint-tsgolint/linux-arm64" "7.0.2004" + "@oxlint-tsgolint/linux-x64" "7.0.2004" + "@oxlint-tsgolint/win32-arm64" "7.0.2004" + "@oxlint-tsgolint/win32-x64" "7.0.2004" + +oxlint@1.85.0: + version "1.85.0" + resolved "https://registry.yarnpkg.com/oxlint/-/oxlint-1.85.0.tgz#a783acb92bd70986b2586a7457984126daf4e52e" + integrity sha512-bc26s97nuvPj1ViyPsqmKecVkUWFMEdtayO8MaQ6oiLfs1pj94cQlZZhrh4BPNlr9HQosjhIlwgZKsfcwmcNgg== + optionalDependencies: + "@oxlint/binding-android-arm-eabi" "1.85.0" + "@oxlint/binding-android-arm64" "1.85.0" + "@oxlint/binding-darwin-arm64" "1.85.0" + "@oxlint/binding-darwin-x64" "1.85.0" + "@oxlint/binding-freebsd-x64" "1.85.0" + "@oxlint/binding-linux-arm-gnueabihf" "1.85.0" + "@oxlint/binding-linux-arm-musleabihf" "1.85.0" + "@oxlint/binding-linux-arm64-gnu" "1.85.0" + "@oxlint/binding-linux-arm64-musl" "1.85.0" + "@oxlint/binding-linux-ppc64-gnu" "1.85.0" + "@oxlint/binding-linux-riscv64-gnu" "1.85.0" + "@oxlint/binding-linux-riscv64-musl" "1.85.0" + "@oxlint/binding-linux-s390x-gnu" "1.85.0" + "@oxlint/binding-linux-x64-gnu" "1.85.0" + "@oxlint/binding-linux-x64-musl" "1.85.0" + "@oxlint/binding-openharmony-arm64" "1.85.0" + "@oxlint/binding-win32-arm64-msvc" "1.85.0" + "@oxlint/binding-win32-ia32-msvc" "1.85.0" + "@oxlint/binding-win32-x64-msvc" "1.85.0" + p-cancelable@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" @@ -10589,7 +10918,7 @@ resolve-path@^1.4.0: http-errors "~1.6.2" path-is-absolute "1.0.1" -resolve@^1.10.0, resolve@^1.22.1, resolve@^1.22.11, resolve@^1.22.4, resolve@^1.22.8: +resolve@^1.10.0, resolve@^1.22.1, resolve@^1.22.11, resolve@^1.22.8: version "1.22.11" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.11.tgz#aad857ce1ffb8bfa9b0b1ac29f1156383f68c262" integrity sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ== @@ -10607,6 +10936,18 @@ resolve@^2.0.0-next.5: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^2.0.0-next.6: + version "2.0.0-next.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.7.tgz#ba3b035d4b1ee7c522426eee73cabcb0fd5515dd" + integrity sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ== + dependencies: + es-errors "^1.3.0" + is-core-module "^2.16.2" + node-exports-info "^1.6.0" + object-keys "^1.1.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + responselike@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/responselike/-/responselike-3.0.0.tgz#20decb6c298aff0dbee1c355ca95461d42823626" @@ -11339,7 +11680,7 @@ strip-ansi@^7.0.1, strip-ansi@^7.1.0, strip-ansi@^7.1.2: strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== strip-bom@^4.0.0: version "4.0.0" @@ -11869,20 +12210,31 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript-eslint@^8.71.1: - version "8.71.1" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.71.1.tgz#dabf06af972d975ea25b27d73e161193ea41075d" - integrity sha512-oiNVPC3/NbV1FpaHU07l8O6ynqG9v4PAiW2WvTrAmZdR0f2HI/gE668ElMLCK7Xbsu5k2fK5C4fXNiq05j7/nQ== - dependencies: - "@typescript-eslint/eslint-plugin" "8.71.1" - "@typescript-eslint/parser" "8.71.1" - "@typescript-eslint/typescript-estree" "8.71.1" - "@typescript-eslint/utils" "8.71.1" - -typescript@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-6.0.3.tgz#90251dc007916e972786cb94d74d15b185577d21" - integrity sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw== +typescript@7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-7.0.2.tgz#9ec773d7954a8c182c17cc5bbd575aa28bc51582" + integrity sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA== + optionalDependencies: + "@typescript/typescript-aix-ppc64" "7.0.2" + "@typescript/typescript-darwin-arm64" "7.0.2" + "@typescript/typescript-darwin-x64" "7.0.2" + "@typescript/typescript-freebsd-arm64" "7.0.2" + "@typescript/typescript-freebsd-x64" "7.0.2" + "@typescript/typescript-linux-arm" "7.0.2" + "@typescript/typescript-linux-arm64" "7.0.2" + "@typescript/typescript-linux-loong64" "7.0.2" + "@typescript/typescript-linux-mips64el" "7.0.2" + "@typescript/typescript-linux-ppc64" "7.0.2" + "@typescript/typescript-linux-riscv64" "7.0.2" + "@typescript/typescript-linux-s390x" "7.0.2" + "@typescript/typescript-linux-x64" "7.0.2" + "@typescript/typescript-netbsd-arm64" "7.0.2" + "@typescript/typescript-netbsd-x64" "7.0.2" + "@typescript/typescript-openbsd-arm64" "7.0.2" + "@typescript/typescript-openbsd-x64" "7.0.2" + "@typescript/typescript-sunos-x64" "7.0.2" + "@typescript/typescript-win32-arm64" "7.0.2" + "@typescript/typescript-win32-x64" "7.0.2" typical@^5.0.0, typical@^5.2.0: version "5.2.0"