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"