From 02c2879a06369009734866d9a9f15e97e9143409 Mon Sep 17 00:00:00 2001 From: Usama Liaqat Date: Wed, 14 Oct 2026 18:32:08 +0500 Subject: [PATCH] Support ESLint 10 in @react-native/eslint-config --- package.json | 2 +- packages/eslint-config-react-native/README.md | 4 +- .../__tests__/prettier-config-test.js | 20 ++ packages/eslint-config-react-native/flat.js | 22 +- .../eslint-config-react-native/package.json | 15 +- packages/eslint-config-react-native/shared.js | 7 +- .../react-native-modules.js | 17 +- yarn.lock | 218 ++++++++++-------- 8 files changed, 190 insertions(+), 115 deletions(-) diff --git a/package.json b/package.json index 9c7240d8c4c2..21295727cdc6 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-ft-flow": "^2.0.1", "eslint-plugin-import": "^2.32.0", - "eslint-plugin-jest": "^29.0.1", + "eslint-plugin-jest": "^29.17.0", "eslint-plugin-jsx-a11y": "^6.6.0", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-native": "^5.0.0", diff --git a/packages/eslint-config-react-native/README.md b/packages/eslint-config-react-native/README.md index 4c21428c5623..f50859dd9792 100644 --- a/packages/eslint-config-react-native/README.md +++ b/packages/eslint-config-react-native/README.md @@ -15,7 +15,7 @@ yarn add --dev eslint prettier @react-native/eslint-config ## Usage -### For ESLint 9+ (Flat Config) +### For ESLint 9 and 10 (Flat Config) Add to your `eslint.config.js`: @@ -39,6 +39,8 @@ export default [ ]; ``` +The flat config parses `.js` and `.jsx` files with [`flow-eslint`](https://www.npmjs.com/package/flow-eslint), which supports Flow and JSX syntax. + ### For ESLint 8 (Legacy Config) Add to your eslint config (`.eslintrc`, or `eslintConfig` field in `package.json`): diff --git a/packages/eslint-config-react-native/__tests__/prettier-config-test.js b/packages/eslint-config-react-native/__tests__/prettier-config-test.js index fd0be32112c8..d1d91cd49cee 100644 --- a/packages/eslint-config-react-native/__tests__/prettier-config-test.js +++ b/packages/eslint-config-react-native/__tests__/prettier-config-test.js @@ -9,6 +9,7 @@ */ import eslintConfigReactNative from '..'; +import eslintConfigReactNativeFlat from '../flat'; import eslintConfigPrettier from 'eslint-config-prettier'; test('eslint-config-prettier is not globally overridden', () => { @@ -49,3 +50,22 @@ for (const override of overrides) { // Technically, `overrides` can contain more `overrides`. Since we don't // currently use that and it is less common, we don't worry about it. } + +for (const config of eslintConfigReactNativeFlat) { + if (config === eslintConfigPrettier || config.rules == null) { + continue; + } + const configIdentifier = JSON.stringify(config.files ?? ''); + + test(`eslint-config-prettier is not overridden in flat config for ${configIdentifier}`, () => { + const overriddenRules = []; + + for (const ruleName of Object.keys(eslintConfigPrettier.rules)) { + if (Object.hasOwn(config.rules, ruleName)) { + overriddenRules.push(ruleName); + } + } + + expect(overriddenRules).toEqual([]); + }); +} diff --git a/packages/eslint-config-react-native/flat.js b/packages/eslint-config-react-native/flat.js index 2b427cde0956..d0b7e762441a 100644 --- a/packages/eslint-config-react-native/flat.js +++ b/packages/eslint-config-react-native/flat.js @@ -9,17 +9,18 @@ */ const sharedConfig = require('./shared.js'); -const babelParser = require('@babel/eslint-parser'); +const eslintCommentsPlugin = require('@eslint-community/eslint-plugin-eslint-comments'); +const {fixupPluginRules} = require('@eslint/compat'); const reactNativePlugin = require('@react-native/eslint-plugin'); const typescriptPlugin = require('@typescript-eslint/eslint-plugin'); const typescriptParser = require('@typescript-eslint/parser'); const prettierConfig = require('eslint-config-prettier'); -const eslintCommentsPlugin = require('eslint-plugin-eslint-comments'); const ftFlowPlugin = require('eslint-plugin-ft-flow'); const jestPlugin = require('eslint-plugin-jest'); const reactPlugin = require('eslint-plugin-react'); const reactHooksPlugin = require('eslint-plugin-react-hooks'); const reactNativeExternalPlugin = require('eslint-plugin-react-native'); +const flowParser = require('flow-eslint'); // Convert globals from legacy format (true/false) to flat config format ('readonly'/'writable') const convertGlobals = globals => { @@ -31,6 +32,9 @@ const convertGlobals = globals => { }; // Flat Config for ESLint 9+ +// +// `fixupPluginRules` adapts plugins that still call rule context methods +// removed in ESLint 10 (e.g. `context.getSourceCode()`). module.exports = [ // Apply prettier config first (to disable conflicting rules) prettierConfig, @@ -45,9 +49,9 @@ module.exports = [ }, plugins: { 'eslint-comments': eslintCommentsPlugin, - react: reactPlugin, + react: fixupPluginRules(reactPlugin), 'react-hooks': reactHooksPlugin, - 'react-native': reactNativeExternalPlugin, + 'react-native': fixupPluginRules(reactNativeExternalPlugin), '@react-native': reactNativePlugin, jest: jestPlugin, }, @@ -55,23 +59,23 @@ module.exports = [ rules: sharedConfig.rules, }, - // JavaScript files with Babel parser and Flow + // JavaScript files, parsed as Flow { ...sharedConfig.overrides.flow, files: ['**/*.js'], languageOptions: { - parser: babelParser, + parser: flowParser, }, plugins: { - 'ft-flow': ftFlowPlugin, + 'ft-flow': fixupPluginRules(ftFlowPlugin), }, }, - // JSX files with Babel parser + // JSX files, parsed as Flow { files: ['**/*.jsx'], languageOptions: { - parser: babelParser, + parser: flowParser, }, }, diff --git a/packages/eslint-config-react-native/package.json b/packages/eslint-config-react-native/package.json index b8fbe73b6760..9ed2ad4256da 100644 --- a/packages/eslint-config-react-native/package.json +++ b/packages/eslint-config-react-native/package.json @@ -27,19 +27,22 @@ "dependencies": { "@babel/core": "^7.25.2", "@babel/eslint-parser": "^7.25.1", + "@eslint-community/eslint-plugin-eslint-comments": "^4.8.1", + "@eslint/compat": "^2.1.1", "@react-native/eslint-plugin": "0.87.0-main", - "@typescript-eslint/eslint-plugin": "^8.59.2", - "@typescript-eslint/parser": "^8.59.2", + "@typescript-eslint/eslint-plugin": "^8.71.2", + "@typescript-eslint/parser": "^8.71.2", "eslint-config-prettier": "^8.5.0", "eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-ft-flow": "^3.0.11", - "eslint-plugin-jest": "^29.0.1", + "eslint-plugin-jest": "^29.17.0", "eslint-plugin-react": "^7.37.5", - "eslint-plugin-react-hooks": "^7.0.1", - "eslint-plugin-react-native": "^5.0.0" + "eslint-plugin-react-hooks": "^7.1.1", + "eslint-plugin-react-native": "^5.0.0", + "flow-eslint": "0.333.0" }, "peerDependencies": { - "eslint": "^8.0.0 || ^9.0.0", + "eslint": "^8.0.0 || ^9.0.0 || ^10.0.0", "prettier": ">=2" }, "devDependencies": { diff --git a/packages/eslint-config-react-native/shared.js b/packages/eslint-config-react-native/shared.js index 0d190f3cba86..50188a2f090b 100644 --- a/packages/eslint-config-react-native/shared.js +++ b/packages/eslint-config-react-native/shared.js @@ -190,7 +190,12 @@ module.exports = { 'no-undef-init': 1, // disallow use of undefined when initializing variables 'no-unused-vars': [ 1, - {vars: 'all', args: 'none', ignoreRestSiblings: true}, + { + vars: 'all', + args: 'none', + caughtErrors: 'none', + ignoreRestSiblings: true, + }, ], // disallow declaration of variables that are not used in the code 'no-use-before-define': 0, // disallow use of variables before they are defined diff --git a/packages/eslint-plugin-specs/react-native-modules.js b/packages/eslint-plugin-specs/react-native-modules.js index 4fa25a683de4..32029a47e65f 100644 --- a/packages/eslint-plugin-specs/react-native-modules.js +++ b/packages/eslint-plugin-specs/react-native-modules.js @@ -108,10 +108,19 @@ function isModuleRequire(node) { return true; } +// `context.sourceCode` and `context.filename` were added in ESLint 8.40, and +// the method forms were removed in ESLint 10. +function getSourceCode(context) { + return context.sourceCode ?? context.getSourceCode(); +} + +function getFilename(context) { + return context.filename ?? context.getFilename(); +} + function isGeneratedFile(context) { return ( - context - .getSourceCode() + getSourceCode(context) .getText() .indexOf('@' + 'generated SignedSource<<') !== -1 ); @@ -137,7 +146,7 @@ module.exports = { }, create(context) { - const filename = context.getFilename(); + const filename = getFilename(context); const hasteModuleName = path.basename(filename).replace(/\.js$/, ''); if (isGeneratedFile(context)) { @@ -172,7 +181,7 @@ module.exports = { const [parsingErrors, tryParse] = createParserErrorCapturer(); - const sourceCode = context.getSourceCode().getText(); + const sourceCode = getSourceCode(context).getText(); const ast = parser.getAst(sourceCode, filename); tryParse(() => { diff --git a/yarn.lock b/yarn.lock index a40d40a8e8de..ca0f51985f0d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1198,7 +1198,15 @@ graceful-fs "^4.2.11" postject "^1.0.0-alpha.6" -"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.7.0": +"@eslint-community/eslint-plugin-eslint-comments@^4.8.1": + version "4.8.1" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.8.1.tgz#7836111108f8ebe4efb6b03f59b748244f8c84fd" + integrity sha512-vafrdi15JHBFh1qWOAucyJwlEEuhdoMof28jOdKdgnwZ7bXwd6v4wzHYSmAVLwnx0yc7bqAtfJ0EZQV1WAzV/Q== + dependencies: + escape-string-regexp "^4.0.0" + ignore "^7.0.5" + +"@eslint-community/eslint-utils@^4.2.0": version "4.7.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz#607084630c6c033992a082de6e6fbc1a8b52175a" integrity sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw== @@ -1222,6 +1230,20 @@ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== +"@eslint/compat@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@eslint/compat/-/compat-2.1.1.tgz#0284d648b62c44f7653804d615d2b4b3b8eaeef1" + integrity sha512-rMcy8GSrwNzcISX/BlTDY/GLB4eCopEuy9woIls3To+15OLxykZrxxq+WUcylCPCQ6F4MujjBM1DX5V1aqI3Vw== + dependencies: + "@eslint/core" "^1.2.1" + +"@eslint/core@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-1.2.1.tgz#c1da7cd1b82fa8787f98b5629fb811848a1b63ce" + integrity sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ== + dependencies: + "@types/json-schema" "^7.0.15" + "@eslint/eslintrc@^2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" @@ -2214,7 +2236,7 @@ expect "^29.0.0" pretty-format "^29.0.0" -"@types/json-schema@^7.0.9": +"@types/json-schema@^7.0.15", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -2289,16 +2311,16 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@^8.59.2": - version "8.59.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.2.tgz#f37b2c189a0177141fe3de3b08f2a83991bfdbfa" - integrity sha512-j/bwmkBvHUtPNxzuWe5z6BEk3q54YRyGlBXkSsmfoih7zNrBvl5A9A98anlp/7JbyZcWIJ8KXo/3Tq/DjFLtuQ== +"@typescript-eslint/eslint-plugin@^8.71.2": + version "8.71.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.71.2.tgz#fdaac18e9fe84b78652ae4befd2693bdd815fe04" + integrity sha512-K72/pvT7qpm8q3k8G5u93NCSN1RcLxX5h7Gw0bQpbMXviBHeY6Nx1WEwmk9wP+eKTSQ8ecxvcgt/ZX/rB938xQ== dependencies: "@eslint-community/regexpp" "^4.12.2" - "@typescript-eslint/scope-manager" "8.59.2" - "@typescript-eslint/type-utils" "8.59.2" - "@typescript-eslint/utils" "8.59.2" - "@typescript-eslint/visitor-keys" "8.59.2" + "@typescript-eslint/scope-manager" "8.71.2" + "@typescript-eslint/type-utils" "8.71.2" + "@typescript-eslint/utils" "8.71.2" + "@typescript-eslint/visitor-keys" "8.71.2" ignore "^7.0.5" natural-compare "^1.4.0" ts-api-utils "^2.5.0" @@ -2325,6 +2347,17 @@ "@typescript-eslint/visitor-keys" "8.59.2" debug "^4.4.3" +"@typescript-eslint/parser@^8.71.2": + version "8.71.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.71.2.tgz#f12dc1d3b26432144319d384273b9c4b6f5c1e99" + integrity sha512-aTtmZjp/x3gsGHkDs04/1I8kNogBJkpQaeGaN0PfiG43NzDEmW2n+OP5im9wfsvyX0yP1UZWBrAGtDBfH9jEVw== + dependencies: + "@typescript-eslint/scope-manager" "8.71.2" + "@typescript-eslint/types" "8.71.2" + "@typescript-eslint/typescript-estree" "8.71.2" + "@typescript-eslint/visitor-keys" "8.71.2" + debug "^4.4.3" + "@typescript-eslint/project-service@8.38.0": version "8.38.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.38.0.tgz#4900771f943163027fd7d2020a062892056b5e2f" @@ -2334,15 +2367,6 @@ "@typescript-eslint/types" "^8.38.0" debug "^4.3.4" -"@typescript-eslint/project-service@8.39.1": - version "8.39.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.39.1.tgz#63525878d488ebf27c485f295e83434a1398f52d" - integrity sha512-8fZxek3ONTwBu9ptw5nCKqZOSkXshZB7uAxuFF0J/wTMkKydjXCzqqga7MlFMpHi9DoG4BadhmTkITBcg8Aybw== - dependencies: - "@typescript-eslint/tsconfig-utils" "^8.39.1" - "@typescript-eslint/types" "^8.39.1" - debug "^4.3.4" - "@typescript-eslint/project-service@8.59.2": version "8.59.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.59.2.tgz#f8b8cbf8692e3a51c2c394acf8cf6900f7e755af" @@ -2352,6 +2376,15 @@ "@typescript-eslint/types" "^8.59.2" debug "^4.4.3" +"@typescript-eslint/project-service@8.71.2": + version "8.71.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.71.2.tgz#b0f89f4eec94bbdde598b8d27a446553172ada84" + integrity sha512-Pd68GsLVh5ZXlcEccFPdhSOvtHZ/2WU0XsA8zmXOS3F158lVlcTLhfQ6qvtL1RzbMie0Kp8xtbVwAg4nejKPHw== + dependencies: + "@typescript-eslint/tsconfig-utils" "^8.71.2" + "@typescript-eslint/types" "^8.71.2" + debug "^4.4.3" + "@typescript-eslint/scope-manager@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" @@ -2368,14 +2401,6 @@ "@typescript-eslint/types" "8.38.0" "@typescript-eslint/visitor-keys" "8.38.0" -"@typescript-eslint/scope-manager@8.39.1": - version "8.39.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.39.1.tgz#1253fe3e1f2f33f08a3e438a05b5dd7faf9fbca6" - integrity sha512-RkBKGBrjgskFGWuyUGz/EtD8AF/GW49S21J8dvMzpJitOF1slLEbbHnNEtAHtnDAnx8qDEdRrULRnWVx27wGBw== - dependencies: - "@typescript-eslint/types" "8.39.1" - "@typescript-eslint/visitor-keys" "8.39.1" - "@typescript-eslint/scope-manager@8.59.2": version "8.59.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.59.2.tgz#63cbd0af2e3180949d6be81122cc555bc71e736d" @@ -2384,29 +2409,42 @@ "@typescript-eslint/types" "8.59.2" "@typescript-eslint/visitor-keys" "8.59.2" +"@typescript-eslint/scope-manager@8.71.2": + version "8.71.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.71.2.tgz#ddb35569150c9aab76d1324d7f6c1a1b68ac60d9" + integrity sha512-YF4wgg5iUX5Obywoac27B56FhozMNFhdJSbh11H5GBAwmBtfyRhmgTQqW9tRNNmHDvsZ2CX6UGzoz+YfYn2Leg== + dependencies: + "@typescript-eslint/types" "8.71.2" + "@typescript-eslint/visitor-keys" "8.71.2" + "@typescript-eslint/tsconfig-utils@8.38.0": version "8.38.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz#6de4ce224a779601a8df667db56527255c42c4d0" integrity sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ== -"@typescript-eslint/tsconfig-utils@8.39.1", "@typescript-eslint/tsconfig-utils@^8.38.0", "@typescript-eslint/tsconfig-utils@^8.39.1": - version "8.39.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.1.tgz#17f13b4ad481e7bec7c249ee1854078645b34b12" - integrity sha512-ePUPGVtTMR8XMU2Hee8kD0Pu4NDE1CN9Q1sxGSGd/mbOtGZDM7pnhXNJnzW63zk/q+Z54zVzj44HtwXln5CvHA== - "@typescript-eslint/tsconfig-utils@8.59.2", "@typescript-eslint/tsconfig-utils@^8.59.2": version "8.59.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.2.tgz#6e92bc412083753185a79c9f1431e78169d9232f" integrity sha512-BKK4alN7oi4C/zv4VqHQ+uRU+lTa6JGIZ7s1juw7b3RHo9OfKB+bKX3u0iVZetdsUCBBkSbdWbarJbmN0fTeSw== -"@typescript-eslint/type-utils@8.59.2": - version "8.59.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.59.2.tgz#a60a1192a804fa472a92c41656853ac6a9ba7176" - integrity sha512-nhqaj1nmTdVVl/BP5omXNRGO38jn5iosis2vbdmupF2txCf8ylWT8lx+JlvMYYVqzGVKtjojUFoQ3JRWK+mfzQ== +"@typescript-eslint/tsconfig-utils@8.71.2", "@typescript-eslint/tsconfig-utils@^8.71.2": + version "8.71.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.71.2.tgz#0f12d2abbc8aca1a7cf2d0898a7c81b950622f61" + integrity sha512-jz49TAWokm/7yWD9/o837nYax9DyALxIPOImdImvVzo6canBCZYzin8zJyqNR5k1j9K1DE0bVvr0XYB+99uAdg== + +"@typescript-eslint/tsconfig-utils@^8.38.0": + version "8.39.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.1.tgz#17f13b4ad481e7bec7c249ee1854078645b34b12" + integrity sha512-ePUPGVtTMR8XMU2Hee8kD0Pu4NDE1CN9Q1sxGSGd/mbOtGZDM7pnhXNJnzW63zk/q+Z54zVzj44HtwXln5CvHA== + +"@typescript-eslint/type-utils@8.71.2": + version "8.71.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.71.2.tgz#b7a615036ed59898ed1628ed74fe0b129ba0032f" + integrity sha512-cC8UaalCViJkb3rH/xLIvidEwoFRtMZMUqDjjJMGEKaTFwYRHYBcoczlEGHuvkHEO8svRDrgZ0yQgOArFmwang== dependencies: - "@typescript-eslint/types" "8.59.2" - "@typescript-eslint/typescript-estree" "8.59.2" - "@typescript-eslint/utils" "8.59.2" + "@typescript-eslint/types" "8.71.2" + "@typescript-eslint/typescript-estree" "8.71.2" + "@typescript-eslint/utils" "8.71.2" debug "^4.4.3" ts-api-utils "^2.5.0" @@ -2420,16 +2458,21 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.38.0.tgz#297351c994976b93c82ac0f0e206c8143aa82529" integrity sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw== -"@typescript-eslint/types@8.39.1", "@typescript-eslint/types@^8.38.0", "@typescript-eslint/types@^8.39.1": - version "8.39.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.39.1.tgz#f0ab996c8ab2c3b046bbf86bb1990b03529869a1" - integrity sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw== - "@typescript-eslint/types@8.59.2", "@typescript-eslint/types@^8.59.2": version "8.59.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.59.2.tgz#01caabcd7e4715c33ad5e11cab260829714d6b9c" integrity sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q== +"@typescript-eslint/types@8.71.2", "@typescript-eslint/types@^8.71.2": + version "8.71.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.71.2.tgz#c2629dcd4056c71b02cf172d109a59a757c2cce9" + integrity sha512-y5Ukl3oVp7e/VGxqIoEXoeb/Roj71PAJ4WG/N/RGj+eeDvKRLM15kGr9MijLbN0i03S52zxu31Z98E5gWChJKw== + +"@typescript-eslint/types@^8.38.0": + version "8.39.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.39.1.tgz#f0ab996c8ab2c3b046bbf86bb1990b03529869a1" + integrity sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw== + "@typescript-eslint/typescript-estree@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" @@ -2459,22 +2502,6 @@ semver "^7.6.0" ts-api-utils "^2.1.0" -"@typescript-eslint/typescript-estree@8.39.1": - version "8.39.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.1.tgz#8825d3ea7ea2144c577859ae489eec24ef7318a5" - integrity sha512-EKkpcPuIux48dddVDXyQBlKdeTPMmALqBUbEk38McWv0qVEZwOpVJBi7ugK5qVNgeuYjGNQxrrnoM/5+TI/BPw== - dependencies: - "@typescript-eslint/project-service" "8.39.1" - "@typescript-eslint/tsconfig-utils" "8.39.1" - "@typescript-eslint/types" "8.39.1" - "@typescript-eslint/visitor-keys" "8.39.1" - debug "^4.3.4" - fast-glob "^3.3.2" - is-glob "^4.0.3" - minimatch "^9.0.4" - semver "^7.6.0" - ts-api-utils "^2.1.0" - "@typescript-eslint/typescript-estree@8.59.2": version "8.59.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.2.tgz#6a217ef65b18dbd12c718fc86a675d1d7a1414cc" @@ -2490,15 +2517,30 @@ tinyglobby "^0.2.15" ts-api-utils "^2.5.0" -"@typescript-eslint/utils@8.59.2": - version "8.59.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.59.2.tgz#ff619a6a3075f4017fa91b8610b752a8ca3366aa" - integrity sha512-Juw3EinkXqjaffxz6roowvV7GZT/kET5vSKKZT6upl5TXdWkLkYmNPXwDDL2Vkt2DPn0nODIS4egC/0AGxKo/Q== +"@typescript-eslint/typescript-estree@8.71.2": + version "8.71.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.71.2.tgz#7ef01d376f6c1da20e173c3483f446127c88c24a" + integrity sha512-DgNOEsl4pdYzwSL+N/Cl33tX1Hlw3FvId73LnKXfq7jnrF2viOEn7X+P7RBkkSWCVm92gnWd28GIC5vJuLREeA== + dependencies: + "@typescript-eslint/project-service" "8.71.2" + "@typescript-eslint/tsconfig-utils" "8.71.2" + "@typescript-eslint/types" "8.71.2" + "@typescript-eslint/visitor-keys" "8.71.2" + debug "^4.4.3" + minimatch "^10.2.2" + semver "^7.7.3" + tinyglobby "^0.2.15" + ts-api-utils "^2.5.0" + +"@typescript-eslint/utils@8.71.2", "@typescript-eslint/utils@^8.0.0": + version "8.71.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.71.2.tgz#7c01b239b7cea1310f1793bbb5a02b5f8b74a6b9" + integrity sha512-RyKa1G1M9rKHDhrk+HJtiF1MvLD5Ux2JW3TSkzw+02pRALdpJb+QzG1Y5em+LvCgzGwgg8H7mBRFKljNz7ImPw== dependencies: "@eslint-community/eslint-utils" "^4.9.1" - "@typescript-eslint/scope-manager" "8.59.2" - "@typescript-eslint/types" "8.59.2" - "@typescript-eslint/typescript-estree" "8.59.2" + "@typescript-eslint/scope-manager" "8.71.2" + "@typescript-eslint/types" "8.71.2" + "@typescript-eslint/typescript-estree" "8.71.2" "@typescript-eslint/utils@^5.47.1": version "5.62.0" @@ -2514,16 +2556,6 @@ eslint-scope "^5.1.1" semver "^7.3.7" -"@typescript-eslint/utils@^8.0.0": - version "8.39.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.39.1.tgz#58a834f89f93b786ada2cd14d77fa63c3c8f408b" - integrity sha512-VF5tZ2XnUSTuiqZFXCZfZs1cgkdd3O/sSYmdo2EpSyDlC86UM/8YytTmKnehOW3TGAlivqTDT6bS87B/GQ/jyg== - dependencies: - "@eslint-community/eslint-utils" "^4.7.0" - "@typescript-eslint/scope-manager" "8.39.1" - "@typescript-eslint/types" "8.39.1" - "@typescript-eslint/typescript-estree" "8.39.1" - "@typescript-eslint/visitor-keys@5.62.0": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" @@ -2540,14 +2572,6 @@ "@typescript-eslint/types" "8.38.0" eslint-visitor-keys "^4.2.1" -"@typescript-eslint/visitor-keys@8.39.1": - version "8.39.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.1.tgz#a467742a98f2fa3c03d7bed4979dc0db3850a77a" - integrity sha512-W8FQi6kEh2e8zVhQ0eeRnxdvIoOkAp/CPAahcNio6nO9dsIwb9b34z90KOlheoyuVf6LSOEdjlkxSkapNEc+4A== - dependencies: - "@typescript-eslint/types" "8.39.1" - eslint-visitor-keys "^4.2.1" - "@typescript-eslint/visitor-keys@8.59.2": version "8.59.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.2.tgz#5ccc486913cd347883d69158836b1189a660bfe6" @@ -2556,6 +2580,14 @@ "@typescript-eslint/types" "8.59.2" eslint-visitor-keys "^5.0.0" +"@typescript-eslint/visitor-keys@8.71.2": + version "8.71.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.71.2.tgz#3a71f8e833aa812670a31107236b9077f4e08fe0" + integrity sha512-zozlN0UA32bSG2zkKAgQyRYSbEISVoyU6vvkKYo2aSny74D8Jh4e+POkJ6Lk0dlezZi5x7TtD+88Xb06IB8nhg== + dependencies: + "@typescript-eslint/types" "8.71.2" + eslint-visitor-keys "^5.0.0" + "@ungap/structured-clone@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" @@ -4362,10 +4394,10 @@ eslint-plugin-import@^2.32.0: string.prototype.trimend "^1.0.9" tsconfig-paths "^3.15.0" -eslint-plugin-jest@^29.0.1: - version "29.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-29.0.1.tgz#0f72a81349409d20742208260c9a6cb9efed4df5" - integrity sha512-EE44T0OSMCeXhDrrdsbKAhprobKkPtJTbQz5yEktysNpHeDZTAL1SfDTNKmcFfJkY6yrQLtTKZALrD3j/Gpmiw== +eslint-plugin-jest@^29.17.0: + version "29.17.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-29.17.0.tgz#513444e5f0b2ed559116f0be02a41e6e22e84f39" + integrity sha512-6jtpU6MhYKbagkES02TupWAUUooJpZtKg94Ax0b8HhUorv3InSTBU8RRtlSBe0LocOcShXOpyec3PHzPDkJCSg== dependencies: "@typescript-eslint/utils" "^8.0.0" @@ -4391,10 +4423,10 @@ eslint-plugin-jsx-a11y@^6.6.0: safe-regex-test "^1.0.3" string.prototype.includes "^2.0.0" -eslint-plugin-react-hooks@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz#66e258db58ece50723ef20cc159f8aa908219169" - integrity sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA== +eslint-plugin-react-hooks@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz#e6742cad75d970c0a3f30d7d3fa80a4784f55927" + integrity sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g== dependencies: "@babel/core" "^7.24.4" "@babel/parser" "^7.24.4"