From c197b2c51ebb0afc73f4dd9691a5438517f47008 Mon Sep 17 00:00:00 2001 From: Markus Stange Date: Mon, 21 Sep 2026 18:20:01 -0400 Subject: [PATCH] Switch to TypeScript 7 (tsgo) and replace ESLint with oxlint MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TypeScript 7 is the native Go port of the compiler. It ships only the `tsc` binary: the JavaScript compiler API is gone until 7.1, and typescript-eslint refuses to load against it. That makes the two halves of this change a single step rather than two. Timings on this machine, from a cold cache: yarn ts 4.83s -> 1.04s yarn lint-js 11.00s -> 1.93s yarn lint 14.03s -> 2.98s Only oxlint runs. `.oxlintrc.json` is derived from the effective configuration of the eslint.config.mjs it replaces, so the enforced rule set is the same one ESLint applied. Where oxlint has no native rule, the original ESLint plugin is loaded in-process through `jsPlugins`, which is still a single pass over the tree with a single config file: eslint-plugin-testing-library 20 rules eslint-plugin-jest-dom 11 rules eslint-plugin-react 7 rules, aliased to `react-js` so it sits beside oxlint's native `react` plugin eslint-plugin-jest-formatting padding-around-describe-blocks `eslint` comes back as a devDependency because those plugins import it — eslint-plugin-react reads its package.json for a version check, and eslint-plugin-testing-library pulls it in via @typescript-eslint/utils. Nothing invokes the ESLint CLI and there is no ESLint config. Two rules are deliberately not restored, because TypeScript already reports what they caught: @babel/no-invalid-this as TS2683 under `strict`, and import/no-unresolved as TS2307. Checked by running both linters over a corpus of 57 single-defect files, one per rule. Every rule ESLint caught is still caught, and oxlint reports no false positives. Two behavioural notes: - react/no-did-mount-set-state and react/no-did-update-set-state were already dead. eslint-plugin-react turns them into no-ops for any React >= 16.3, and this project declares 18.0. They stay off. - ESLint's no-return-await is deprecated and has no oxlint equivalent. typescript/return-await replaces it in `error-handling-correctness-only` mode, which reports only where adding or removing `await` changes which errors a try/catch sees. That is a narrower rule, and it is what found the bug fixed two commits earlier. The eslint-disable comments for rules loaded through jsPlugins are renamed to the names oxlint reports them by. jsPlugins is documented as alpha and not covered by semver, so an oxlint upgrade may require revisiting this file. If it ever breaks, dropping the jsPlugins block and the rules it provides leaves a working native-only configuration. --- .devcontainer/devcontainer.json | 2 +- .oxlintrc.json | 521 ++++++++++++++++++ CONTRIBUTING.md | 2 +- eslint.config.mjs | 312 ----------- package.json | 14 +- .../app/AppLocalizationProvider.tsx | 2 +- .../flame-graph/ConnectedFlameGraph.tsx | 3 +- src/components/flame-graph/FlameGraph.tsx | 2 +- .../shared/ButtonWithPanel/ArrowPanel.tsx | 4 +- src/components/shared/TrackSearchField.tsx | 2 +- src/components/shared/TreeView.tsx | 4 +- src/components/shared/VirtualList.tsx | 4 +- src/test/components/FlameGraph.test.tsx | 2 +- src/test/components/MenuButtons.test.tsx | 10 +- .../components/TransformShortcuts.test.tsx | 5 +- src/test/unit/merge-compare.test.ts | 2 - src/test/unit/path.test.ts | 1 - src/test/unit/process-profile.test.ts | 4 + yarn.lock | 473 ++++++++++------ 19 files changed, 842 insertions(+), 527 deletions(-) create mode 100644 .oxlintrc.json delete mode 100644 eslint.config.mjs diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 14c96ea10c..b4e65946f0 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -18,7 +18,7 @@ "customizations": { "vscode": { "extensions": [ - "dbaeumer.vscode-eslint", + "oxc.oxc-vscode", "oxc.oxc-vscode", "stylelint.vscode-stylelint" ], diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 0000000000..42d37011d3 --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,521 @@ +// Oxlint configuration for the Firefox Profiler. +// +// This replaces the previous eslint.config.mjs. The rule list below was derived +// mechanically from that file's effective configuration, so the lint surface is +// the same set of rules ESLint enforced, minus the ones oxlint has no +// equivalent for (listed at the bottom of this comment). +// +// Notes on how this file is put together: +// +// * Every lint category is switched off and each rule is listed explicitly. +// Enabling a plugin otherwise switches on that plugin's own default rules, +// which are not the same set the old ESLint config used. +// * Type-aware rules are all listed at the top level, almost all set to "off". +// `options.typeAware` hands type-aware linting to tsgolint, which applies +// typescript-eslint's own defaults unless told otherwise. The handful the +// project actually wants are switched back on in the `**/*.ts` override, so +// they also stay off for .js/.mjs files, matching what +// `tseslint.configs.disableTypeChecked` did before. +// +// One rule is deliberately configured differently from its ESLint spelling: +// `typescript/return-await`, commented at the rule itself. +// +// Rules oxlint has no native equivalent for are restored by loading the +// original ESLint plugins through `jsPlugins` (see below). That is still a +// single oxlint pass over the tree; there is no ESLint config or CLI involved. +// eslint-plugin-react is aliased to `react-js` so it sits alongside oxlint's +// own native `react` plugin rather than colliding with it. +// +// Not restored, because TypeScript already reports them: +// @babel/no-invalid-this -> TS2683, via `strict` +// import/no-unresolved -> TS2307 +// +// Two more were dropped because eslint-plugin-react makes them no-ops for any +// React >= 16.3, so they caught nothing here either: +// react/no-did-mount-set-state and react/no-did-update-set-state. +{ + "$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" + } + }, + "options": { + "typeAware": true + }, + "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", + "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/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", + "typescript/await-thenable": "off", + "typescript/ban-ts-comment": [ + "error", + { + "ts-expect-error": "allow-with-description", + "ts-ignore": true, + "ts-nocheck": true, + "ts-check": false + } + ], + "typescript/consistent-return": "off", + "typescript/consistent-type-exports": "off", + "typescript/consistent-type-imports": "error", + "typescript/dot-notation": "off", + "typescript/no-array-delete": "off", + "typescript/no-base-to-string": "off", + "typescript/no-confusing-void-expression": "off", + "typescript/no-deprecated": "off", + "typescript/no-duplicate-enum-values": "error", + "typescript/no-duplicate-type-constituents": "off", + "typescript/no-extra-non-null-assertion": "error", + "typescript/no-floating-promises": "off", + "typescript/no-for-in-array": "off", + "typescript/no-implied-eval": "off", + "typescript/no-meaningless-void-operator": "off", + "typescript/no-misused-new": "error", + "typescript/no-misused-promises": "off", + "typescript/no-misused-spread": "off", + "typescript/no-mixed-enums": "off", + "typescript/no-namespace": "error", + "typescript/no-non-null-asserted-optional-chain": "error", + "typescript/no-redundant-type-constituents": "off", + "typescript/no-require-imports": "off", + "typescript/no-this-alias": "error", + "typescript/no-unnecessary-boolean-literal-compare": "off", + "typescript/no-unnecessary-condition": "off", + "typescript/no-unnecessary-qualifier": "off", + "typescript/no-unnecessary-template-expression": "off", + "typescript/no-unnecessary-type-arguments": "off", + "typescript/no-unnecessary-type-assertion": "off", + "typescript/no-unnecessary-type-constraint": "error", + "typescript/no-unnecessary-type-conversion": "off", + "typescript/no-unnecessary-type-parameters": "off", + "typescript/no-unsafe-argument": "off", + "typescript/no-unsafe-assignment": "off", + "typescript/no-unsafe-call": "off", + "typescript/no-unsafe-declaration-merging": "error", + "typescript/no-unsafe-enum-comparison": "off", + "typescript/no-unsafe-function-type": "error", + "typescript/no-unsafe-member-access": "off", + "typescript/no-unsafe-return": "off", + "typescript/no-unsafe-type-assertion": "off", + "typescript/no-unsafe-unary-minus": "off", + "typescript/no-useless-default-assignment": "off", + "typescript/no-wrapper-object-types": "error", + "typescript/non-nullable-type-assertion-style": "off", + "typescript/only-throw-error": "off", + "typescript/prefer-as-const": "error", + "typescript/prefer-find": "off", + "typescript/prefer-includes": "off", + "typescript/prefer-namespace-keyword": "error", + "typescript/prefer-nullish-coalescing": "off", + "typescript/prefer-optional-chain": "off", + "typescript/prefer-promise-reject-errors": "off", + "typescript/prefer-readonly": "off", + "typescript/prefer-readonly-parameter-types": "off", + "typescript/prefer-reduce-type-parameter": "off", + "typescript/prefer-regexp-exec": "off", + "typescript/prefer-return-this-type": "off", + "typescript/prefer-string-starts-ends-with": "off", + "typescript/promise-function-async": "off", + "typescript/related-getter-setter-pairs": "off", + "typescript/require-array-sort-compare": "off", + "typescript/require-await": "off", + "typescript/restrict-plus-operands": "off", + "typescript/restrict-template-expressions": "off", + "typescript/return-await": "off", + "typescript/strict-boolean-expressions": "off", + "typescript/strict-void-return": "off", + "typescript/switch-exhaustiveness-check": "off", + "typescript/triple-slash-reference": "error", + "typescript/unbound-method": "off", + "typescript/use-unknown-in-catch-callback-variable": "off", + "use-isnan": [ + "error", + { + "enforceForIndexOf": false, + "enforceForSwitchCase": true + } + ], + "valid-typeof": [ + "error", + { + "requireStringLiterals": false + } + ] + }, + "overrides": [ + { + "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", + "typescript/return-await": ["error", "error-handling-correctness-only"] + } + }, + { + "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" + } + }, + { + "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" + } + ] +} 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 8c31172ca4..a16d1c730c 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 --report-unused-disable-directives-severity=error", "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.6", "@babel/preset-react": "^8.0.1", "@babel/preset-typescript": "^8.0.1", - "@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", @@ -154,16 +151,12 @@ "esbuild-plugin-copy": "^2.1.1", "esbuild-plugin-wasm": "^1.1.0", "eslint": "^9.39.5", - "eslint-import-resolver-alias": "^1.1.2", - "eslint-plugin-import": "^2.32.0", - "eslint-plugin-jest": "^29.16.6", "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.12.0", "husky": "^9.1.7", "jest": "^30.5.2", "jest-environment-jsdom": "^30.5.2", @@ -173,6 +166,8 @@ "npm-run-all2": "^8.0.4", "open": "^11.0.4", "oxfmt": "^0.68.0", + "oxlint": "1.85.0", + "oxlint-tsgolint": "^7.0.2002", "patch-package": "^8.0.1", "postcss": "^8.5.28", "postinstall-postinstall": "^2.1.0", @@ -180,8 +175,7 @@ "stylelint": "^17.15.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/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 0c03235189..be6b1010e4 100644 --- a/src/test/unit/merge-compare.test.ts +++ b/src/test/unit/merge-compare.test.ts @@ -81,7 +81,6 @@ describe('mergeProfilesForDiffing function', function () { libName = mergedLibs[libIndex].name; } - /* eslint-disable jest/no-conditional-expect */ switch (funcName) { case 'A': expect(libName).toBeOneOf(['libA', 'libB']); @@ -97,7 +96,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 058c86f309..8ed3ce8dbb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2109,7 +2109,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== @@ -2152,7 +2152,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== @@ -2772,6 +2772,131 @@ resolved "https://registry.yarnpkg.com/@oxfmt/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.68.0.tgz#718d473c127caaf5ec572217ce04746870e0118a" integrity sha512-gPe+dJLXaPuWPWqlpklDAJp0k+K9KhQPYiQLHfb+i2rmFuUGfJ/5Qlj6tr1mO6of5g0DiLjG/XCFHIaPhotqqA== +"@oxlint-tsgolint/darwin-arm64@7.0.2003": + version "7.0.2003" + resolved "https://registry.yarnpkg.com/@oxlint-tsgolint/darwin-arm64/-/darwin-arm64-7.0.2003.tgz#a9048bb88e36fb7d3523d4c444509d96e06d5d46" + integrity sha512-TgV33rXr6ueXBwvc+0nssUkTBSXHJxv77I8p4RCjDjCnvexHtmoPiudVRDfj3S3puMDdeQdHW6jdUgUPy3nr/w== + +"@oxlint-tsgolint/darwin-x64@7.0.2003": + version "7.0.2003" + resolved "https://registry.yarnpkg.com/@oxlint-tsgolint/darwin-x64/-/darwin-x64-7.0.2003.tgz#34933fbc2f36c418591808a75a4a164eb83afdf0" + integrity sha512-hY3FMAjIaPDdK3FNxyRXRfHPOFeoBn6dmnLyKZgQ2IbTTD1adXhl6PfCIqHhCPvurigv7nf7mYuWZZ19MmJzmg== + +"@oxlint-tsgolint/linux-arm64@7.0.2003": + version "7.0.2003" + resolved "https://registry.yarnpkg.com/@oxlint-tsgolint/linux-arm64/-/linux-arm64-7.0.2003.tgz#b222cb1f8366ea7de441551268301efa82efc379" + integrity sha512-eAET4JpyfBbg8SO0K74o4R55tEjVC292pIyxGOw2XGf8x/HrPNyxwQ478jMYOM54FIVOHc8sJ6VRHxluy6lucw== + +"@oxlint-tsgolint/linux-x64@7.0.2003": + version "7.0.2003" + resolved "https://registry.yarnpkg.com/@oxlint-tsgolint/linux-x64/-/linux-x64-7.0.2003.tgz#1e1339078dd464757f543eca9a60dc9d86ad6e75" + integrity sha512-GXdyO/XyqDJ3s/llR/oOktLsYNjZtWSQBy0JMc+/0gsNPvTcseKPhn9c6KcFyWmnr6H4vljYALbujonqSzzEGw== + +"@oxlint-tsgolint/win32-arm64@7.0.2003": + version "7.0.2003" + resolved "https://registry.yarnpkg.com/@oxlint-tsgolint/win32-arm64/-/win32-arm64-7.0.2003.tgz#b4d0e6c6e7c0212be92c447e64b49f0d8d8173db" + integrity sha512-TWauXnPfet0VgpmrstoAK58eJ4gbuwPUuUTQmYQAzE/RG1CpnxXtrKUJULf6lyerPE4KN3gM+DflIA1hOH+38Q== + +"@oxlint-tsgolint/win32-x64@7.0.2003": + version "7.0.2003" + resolved "https://registry.yarnpkg.com/@oxlint-tsgolint/win32-x64/-/win32-x64-7.0.2003.tgz#08d5ae59e655e32d332ec1a74190b8009754d176" + integrity sha512-DoRmfe7j8VqNlukp8liRVW45GQDhzRccNenjD/pdzelgtffW47pCMd1xbJLkPaPbKnTwID3onn3VZlL7JbebEA== + +"@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" @@ -3056,11 +3181,6 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.4.tgz#da4f1676d87e2bdf744291b504b0ab79550c3e61" integrity sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw== -"@rtsao/scc@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" - integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== - "@sinclair/typebox@^0.34.0": version "0.34.37" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.34.37.tgz#f331e4db64ff8195e9e3d8449343c85aaa237d6e" @@ -3328,11 +3448,6 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@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= - "@types/mdast@^3.0.0", "@types/mdast@^3.0.3": version "3.0.10" resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" @@ -3457,31 +3572,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" @@ -3504,17 +3594,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" @@ -3535,7 +3614,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== @@ -3553,6 +3632,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" @@ -3885,7 +4064,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== @@ -3931,29 +4110,6 @@ array.prototype.findlast@^1.2.5: es-object-atoms "^1.0.0" es-shim-unscopables "^1.0.2" -array.prototype.findlastindex@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz#cfa1065c81dcb64e34557c9b81d012f6a421c564" - integrity sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.4" - define-properties "^1.2.1" - es-abstract "^1.23.9" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - es-shim-unscopables "^1.1.0" - -array.prototype.flat@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5" - integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-shim-unscopables "^1.0.2" - array.prototype.flatmap@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b" @@ -4921,7 +5077,7 @@ debug@2.6.9, debug@^2.2.0: dependencies: ms "2.0.0" -debug@^3.1.0, debug@^3.2.7: +debug@^3.1.0: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== @@ -5365,7 +5521,7 @@ es-set-tostringtag@^2.0.3, es-set-tostringtag@^2.1.0: has-tostringtag "^1.0.2" hasown "^2.0.2" -es-shim-unscopables@^1.0.2, es-shim-unscopables@^1.1.0: +es-shim-unscopables@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz#438df35520dac5d105f3943d927549ea3b00f4b5" integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== @@ -5463,52 +5619,6 @@ escape-string-regexp@^5.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== -eslint-import-resolver-alias@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-alias/-/eslint-import-resolver-alias-1.1.2.tgz#297062890e31e4d6651eb5eba9534e1f6e68fc97" - 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== - dependencies: - debug "^3.2.7" - is-core-module "^2.13.0" - resolve "^1.22.4" - -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== - dependencies: - debug "^3.2.7" - -eslint-plugin-import@^2.32.0: - version "2.32.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz#602b55faa6e4caeaa5e970c198b5c00a37708980" - integrity sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA== - dependencies: - "@rtsao/scc" "^1.1.0" - array-includes "^3.1.9" - array.prototype.findlastindex "^1.2.6" - array.prototype.flat "^1.3.3" - array.prototype.flatmap "^1.3.3" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.12.1" - hasown "^2.0.2" - is-core-module "^2.16.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.8" - object.groupby "^1.0.3" - object.values "^1.2.1" - semver "^6.3.1" - string.prototype.trimend "^1.0.9" - tsconfig-paths "^3.15.0" - eslint-plugin-jest-dom@^5.10.1: version "5.10.1" resolved "https://registry.yarnpkg.com/eslint-plugin-jest-dom/-/eslint-plugin-jest-dom-5.10.1.tgz#4d37e9ef9ebdbb5b53add4e9db1f76e9c32963da" @@ -5521,13 +5631,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.16.6: - version "29.16.6" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-29.16.6.tgz#336b2fd72b0548af338ff0ce6532cb5d1dd25c0a" - integrity sha512-q8TVr0rlNvUD0XnafGWkwtPeX+tTl2llP86EDl3sJtwWrQA/JT9SIu2hLLZbhhX6fT5SDE4O0gIKyZUujKnkYA== - 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" @@ -6232,11 +6335,6 @@ globals@^14.0.0: resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== -globals@^17.12.0: - version "17.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-17.12.0.tgz#910a368b8f093d3feb3f77a56dcefa05647d698e" - integrity sha512-cezEd/DTyyht9cvSSURyygXPfy04GtWO/5e6ZPvH7fCtjKz9PYOmuawphw1Ctd1f6C+5JypXfGD7ahNMXvevBA== - globalthis@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" @@ -7773,13 +7871,6 @@ json-stringify-safe@5: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" @@ -9433,15 +9524,6 @@ object.fromentries@^2.0.8: es-abstract "^1.23.2" es-object-atoms "^1.0.0" -object.groupby@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" - integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - object.values@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216" @@ -9585,6 +9667,43 @@ oxfmt@^0.68.0: "@oxfmt/binding-win32-ia32-msvc" "0.68.0" "@oxfmt/binding-win32-x64-msvc" "0.68.0" +oxlint-tsgolint@^7.0.2002: + version "7.0.2003" + resolved "https://registry.yarnpkg.com/oxlint-tsgolint/-/oxlint-tsgolint-7.0.2003.tgz#ad35592d0fde9ffd279c9befe3275a81a787573f" + integrity sha512-VnK4zlqgmgq/7ZcjzCk/WpN8kKFsYGcB85Io9qT3wL4K8Un3RKmJkp793crNETieMusPMKOA4a+Mw2wbteI6TQ== + optionalDependencies: + "@oxlint-tsgolint/darwin-arm64" "7.0.2003" + "@oxlint-tsgolint/darwin-x64" "7.0.2003" + "@oxlint-tsgolint/linux-arm64" "7.0.2003" + "@oxlint-tsgolint/linux-x64" "7.0.2003" + "@oxlint-tsgolint/win32-arm64" "7.0.2003" + "@oxlint-tsgolint/win32-x64" "7.0.2003" + +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" @@ -10583,7 +10702,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== @@ -11330,11 +11449,6 @@ strip-ansi@^7.0.1, strip-ansi@^7.1.0, strip-ansi@^7.1.2: dependencies: ansi-regex "^6.0.1" -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= - strip-bom@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" @@ -11711,16 +11825,6 @@ ts-api-utils@^2.5.0: resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.5.0.tgz#4acd4a155e22734990a5ed1fe9e97f113bcb37c1" integrity sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA== -tsconfig-paths@^3.15.0: - version "3.15.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" - integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" @@ -11863,20 +11967,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"