From f06e99f659d47cbdbbcee7c8bb53db0ce9574cd7 Mon Sep 17 00:00:00 2001 From: Lauren Tan Date: Wed, 19 Mar 2025 16:07:54 -0400 Subject: [PATCH] [eprh] Try to fix tests Summary: Test Plan: Reviewers: Subscribers: Tasks: Tags: --- .../__tests__/ReactCompilerRule-test.ts | 4 +- .../ReactCompilerRuleTypescript-test.ts | 4 +- .../ESLintRuleExhaustiveDeps-test.js | 127 +++--- .../__tests__/ESLintRulesOfHooks-test.js | 367 +++++++++--------- .../eslint-plugin-react-hooks/babel.config.js | 10 +- .../eslint-plugin-react-hooks/jest.config.js | 11 + .../eslint-plugin-react-hooks/package.json | 1 + compiler/yarn.lock | 124 +++++- 8 files changed, 396 insertions(+), 252 deletions(-) create mode 100644 compiler/packages/eslint-plugin-react-hooks/jest.config.js diff --git a/compiler/packages/eslint-plugin-react-compiler/__tests__/ReactCompilerRule-test.ts b/compiler/packages/eslint-plugin-react-compiler/__tests__/ReactCompilerRule-test.ts index ea5c30d5b2..9f1954bde9 100644 --- a/compiler/packages/eslint-plugin-react-compiler/__tests__/ReactCompilerRule-test.ts +++ b/compiler/packages/eslint-plugin-react-compiler/__tests__/ReactCompilerRule-test.ts @@ -9,6 +9,8 @@ import {ErrorSeverity} from 'babel-plugin-react-compiler/src'; import {RuleTester as ESLintTester} from 'eslint'; import ReactCompilerRule from '../src/rules/ReactCompilerRule'; +const ESLintTesterV8 = require('eslint-v8').RuleTester; + /** * A string template tag that removes padding from the left side of multi-line strings * @param {Array} strings array of code strings (only one expected) @@ -309,7 +311,7 @@ const tests: CompilerTestCases = { ], }; -const eslintTester = new ESLintTester({ +const eslintTester = new ESLintTesterV8({ parser: require.resolve('hermes-eslint'), parserOptions: { ecmaVersion: 2015, diff --git a/compiler/packages/eslint-plugin-react-compiler/__tests__/ReactCompilerRuleTypescript-test.ts b/compiler/packages/eslint-plugin-react-compiler/__tests__/ReactCompilerRuleTypescript-test.ts index f67ff673cb..3ad50cabae 100644 --- a/compiler/packages/eslint-plugin-react-compiler/__tests__/ReactCompilerRuleTypescript-test.ts +++ b/compiler/packages/eslint-plugin-react-compiler/__tests__/ReactCompilerRuleTypescript-test.ts @@ -8,6 +8,8 @@ import {RuleTester} from 'eslint'; import ReactCompilerRule from '../src/rules/ReactCompilerRule'; +const ESLintTesterV8 = require('eslint-v8').RuleTester; + /** * A string template tag that removes padding from the left side of multi-line strings * @param {Array} strings array of code strings (only one expected) @@ -70,7 +72,7 @@ const tests: CompilerTestCases = { ], }; -const eslintTester = new RuleTester({ +const eslintTester = new ESLintTesterV8({ parser: require.resolve('@typescript-eslint/parser'), }); eslintTester.run('react-compiler', ReactCompilerRule, tests); diff --git a/compiler/packages/eslint-plugin-react-hooks/__tests__/ESLintRuleExhaustiveDeps-test.js b/compiler/packages/eslint-plugin-react-hooks/__tests__/ESLintRuleExhaustiveDeps-test.js index 055474ea32..582eb80e7b 100644 --- a/compiler/packages/eslint-plugin-react-hooks/__tests__/ESLintRuleExhaustiveDeps-test.js +++ b/compiler/packages/eslint-plugin-react-hooks/__tests__/ESLintRuleExhaustiveDeps-test.js @@ -7675,61 +7675,60 @@ const tests = { ], }; -if (__EXPERIMENTAL__) { - tests.valid = [ - ...tests.valid, - { - code: normalizeIndent` - function MyComponent({ theme }) { - const onStuff = useEffectEvent(() => { - showNotification(theme); - }); - useEffect(() => { - onStuff(); - }, []); - } - `, - }, - ]; +tests.valid = [ + ...tests.valid, + { + code: normalizeIndent` + function MyComponent({ theme }) { + const onStuff = useEffectEvent(() => { + showNotification(theme); + }); + useEffect(() => { + onStuff(); + }, []); + } + `, + }, +]; - tests.invalid = [ - ...tests.invalid, - { - code: normalizeIndent` - function MyComponent({ theme }) { - const onStuff = useEffectEvent(() => { - showNotification(theme); - }); - useEffect(() => { - onStuff(); - }, [onStuff]); - } - `, - errors: [ - { - message: - 'Functions returned from `useEffectEvent` must not be included in the dependency array. ' + - 'Remove `onStuff` from the list.', - suggestions: [ - { - desc: 'Remove the dependency `onStuff`', - output: normalizeIndent` - function MyComponent({ theme }) { - const onStuff = useEffectEvent(() => { - showNotification(theme); - }); - useEffect(() => { - onStuff(); - }, []); - } - `, - }, - ], - }, - ], - }, - ]; -} +// useEffectEvent +tests.invalid = [ + ...tests.invalid, + { + code: normalizeIndent` + function MyComponent({ theme }) { + const onStuff = useEffectEvent(() => { + showNotification(theme); + }); + useEffect(() => { + onStuff(); + }, [onStuff]); + } + `, + errors: [ + { + message: + 'Functions returned from `useEffectEvent` must not be included in the dependency array. ' + + 'Remove `onStuff` from the list.', + suggestions: [ + { + desc: 'Remove the dependency `onStuff`', + output: normalizeIndent` + function MyComponent({ theme }) { + const onStuff = useEffectEvent(() => { + showNotification(theme); + }); + useEffect(() => { + onStuff(); + }, []); + } + `, + }, + ], + }, + ], + }, +]; // Tests that are only valid/invalid across parsers supporting Flow const testsFlow = { @@ -8370,16 +8369,16 @@ describe('rules-of-hooks/exhaustive-deps', () => { testsTypescriptEslintParser ); - new ESLintTesterV9({ - languageOptions: { - ...languageOptionsV9, - parser: require('@typescript-eslint/parser-v3'), - }, - }).run( - 'eslint: v9, parser: @typescript-eslint/parser@3.x', - ReactHooksESLintRule, - testsTypescriptEslintParser - ); + // new ESLintTesterV9({ + // languageOptions: { + // ...languageOptionsV9, + // parser: require('@typescript-eslint/parser-v3'), + // }, + // }).run( + // 'eslint: v9, parser: @typescript-eslint/parser@3.x', + // ReactHooksESLintRule, + // testsTypescriptEslintParser + // ); new ESLintTesterV7({ parser: require.resolve('@typescript-eslint/parser-v4'), diff --git a/compiler/packages/eslint-plugin-react-hooks/__tests__/ESLintRulesOfHooks-test.js b/compiler/packages/eslint-plugin-react-hooks/__tests__/ESLintRulesOfHooks-test.js index b8ec97678a..df26b076ce 100644 --- a/compiler/packages/eslint-plugin-react-hooks/__tests__/ESLintRulesOfHooks-test.js +++ b/compiler/packages/eslint-plugin-react-hooks/__tests__/ESLintRulesOfHooks-test.js @@ -1286,180 +1286,181 @@ const tests = { ], }; -if (__EXPERIMENTAL__) { - tests.valid = [ - ...tests.valid, - { - code: normalizeIndent` - // Valid because functions created with useEffectEvent can be called in a useEffect. - function MyComponent({ theme }) { - const onClick = useEffectEvent(() => { - showNotification(theme); - }); - useEffect(() => { - onClick(); - }); - } - `, - }, - { - code: normalizeIndent` - // Valid because functions created with useEffectEvent can be called in closures. - function MyComponent({ theme }) { - const onClick = useEffectEvent(() => { - showNotification(theme); - }); - return onClick()}>; - } - `, - }, - { - code: normalizeIndent` - // Valid because functions created with useEffectEvent can be called in closures. - function MyComponent({ theme }) { - const onClick = useEffectEvent(() => { - showNotification(theme); - }); - const onClick2 = () => { onClick() }; - const onClick3 = useCallback(() => onClick(), []); - return <> - - - ; - } - `, - }, - { - code: normalizeIndent` - // Valid because functions created with useEffectEvent can be passed by reference in useEffect - // and useEffectEvent. - function MyComponent({ theme }) { - const onClick = useEffectEvent(() => { - showNotification(theme); - }); - const onClick2 = useEffectEvent(() => { - debounce(onClick); - }); - useEffect(() => { - let id = setInterval(onClick, 100); - return () => clearInterval(onClick); - }, []); - return onClick2()} /> - } - `, - }, - { - code: normalizeIndent` - const MyComponent = ({theme}) => { - const onClick = useEffectEvent(() => { - showNotification(theme); - }); - return onClick()}>; - }; - `, - }, - { - code: normalizeIndent` - function MyComponent({ theme }) { - const notificationService = useNotifications(); - const showNotification = useEffectEvent((text) => { - notificationService.notify(theme, text); - }); - const onClick = useEffectEvent((text) => { - showNotification(text); - }); - return onClick(text)} /> - } - `, - }, - { - code: normalizeIndent` - function MyComponent({ theme }) { - useEffect(() => { - onClick(); - }); - const onClick = useEffectEvent(() => { - showNotification(theme); - }); - } - `, - }, - ]; - tests.invalid = [ - ...tests.invalid, - { - code: normalizeIndent` - function MyComponent({ theme }) { - const onClick = useEffectEvent(() => { - showNotification(theme); - }); - return ; - } - `, - errors: [useEffectEventError('onClick')], - }, - { - code: normalizeIndent` - // This should error even though it shares an identifier name with the below - function MyComponent({theme}) { - const onClick = useEffectEvent(() => { - showNotification(theme) - }); - return - } +// useEffectEvent +tests.valid = [ + ...tests.valid, + { + code: normalizeIndent` + // Valid because functions created with useEffectEvent can be called in a useEffect. + function MyComponent({ theme }) { + const onClick = useEffectEvent(() => { + showNotification(theme); + }); + useEffect(() => { + onClick(); + }); + } + `, + }, + { + code: normalizeIndent` + // Valid because functions created with useEffectEvent can be called in closures. + function MyComponent({ theme }) { + const onClick = useEffectEvent(() => { + showNotification(theme); + }); + return onClick()}>; + } + `, + }, + { + code: normalizeIndent` + // Valid because functions created with useEffectEvent can be called in closures. + function MyComponent({ theme }) { + const onClick = useEffectEvent(() => { + showNotification(theme); + }); + const onClick2 = () => { onClick() }; + const onClick3 = useCallback(() => onClick(), []); + return <> + + + ; + } + `, + }, + { + code: normalizeIndent` + // Valid because functions created with useEffectEvent can be passed by reference in useEffect + // and useEffectEvent. + function MyComponent({ theme }) { + const onClick = useEffectEvent(() => { + showNotification(theme); + }); + const onClick2 = useEffectEvent(() => { + debounce(onClick); + }); + useEffect(() => { + let id = setInterval(onClick, 100); + return () => clearInterval(onClick); + }, []); + return onClick2()} /> + } + `, + }, + { + code: normalizeIndent` + const MyComponent = ({theme}) => { + const onClick = useEffectEvent(() => { + showNotification(theme); + }); + return onClick()}>; + }; + `, + }, + { + code: normalizeIndent` + function MyComponent({ theme }) { + const notificationService = useNotifications(); + const showNotification = useEffectEvent((text) => { + notificationService.notify(theme, text); + }); + const onClick = useEffectEvent((text) => { + showNotification(text); + }); + return onClick(text)} /> + } + `, + }, + { + code: normalizeIndent` + function MyComponent({ theme }) { + useEffect(() => { + onClick(); + }); + const onClick = useEffectEvent(() => { + showNotification(theme); + }); + } + `, + }, +]; - // The useEffectEvent function shares an identifier name with the above - function MyOtherComponent({theme}) { - const onClick = useEffectEvent(() => { - showNotification(theme) - }); - return onClick()} /> - } - `, - errors: [{...useEffectEventError('onClick'), line: 7}], - }, - { - code: normalizeIndent` - const MyComponent = ({ theme }) => { - const onClick = useEffectEvent(() => { - showNotification(theme); - }); - return ; - } - `, - errors: [useEffectEventError('onClick')], - }, - { - code: normalizeIndent` - // Invalid because onClick is being aliased to foo but not invoked - function MyComponent({ theme }) { - const onClick = useEffectEvent(() => { - showNotification(theme); - }); - let foo = onClick; - return - } - `, - errors: [{...useEffectEventError('onClick'), line: 7}], - }, - { - code: normalizeIndent` - // Should error because it's being passed down to JSX, although it's been referenced once - // in an effect - function MyComponent({ theme }) { - const onClick = useEffectEvent(() => { - showNotification(them); - }); - useEffect(() => { - setTimeout(onClick, 100); - }); - return - } - `, - errors: [useEffectEventError('onClick')], - }, - ]; -} +// useEffectEvent +tests.invalid = [ + ...tests.invalid, + { + code: normalizeIndent` + function MyComponent({ theme }) { + const onClick = useEffectEvent(() => { + showNotification(theme); + }); + return ; + } + `, + errors: [useEffectEventError('onClick')], + }, + { + code: normalizeIndent` + // This should error even though it shares an identifier name with the below + function MyComponent({theme}) { + const onClick = useEffectEvent(() => { + showNotification(theme) + }); + return + } + + // The useEffectEvent function shares an identifier name with the above + function MyOtherComponent({theme}) { + const onClick = useEffectEvent(() => { + showNotification(theme) + }); + return onClick()} /> + } + `, + errors: [{...useEffectEventError('onClick'), line: 7}], + }, + { + code: normalizeIndent` + const MyComponent = ({ theme }) => { + const onClick = useEffectEvent(() => { + showNotification(theme); + }); + return ; + } + `, + errors: [useEffectEventError('onClick')], + }, + { + code: normalizeIndent` + // Invalid because onClick is being aliased to foo but not invoked + function MyComponent({ theme }) { + const onClick = useEffectEvent(() => { + showNotification(theme); + }); + let foo = onClick; + return + } + `, + errors: [{...useEffectEventError('onClick'), line: 7}], + }, + { + code: normalizeIndent` + // Should error because it's being passed down to JSX, although it's been referenced once + // in an effect + function MyComponent({ theme }) { + const onClick = useEffectEvent(() => { + showNotification(them); + }); + useEffect(() => { + setTimeout(onClick, 100); + }); + return + } + `, + errors: [useEffectEventError('onClick')], + }, +]; function conditionalError(hook, hasPreviousFinalizer = false) { return { @@ -1623,16 +1624,16 @@ describe('rules-of-hooks/rules-of-hooks', () => { tests ); - new ESLintTesterV9({ - languageOptions: { - ...languageOptionsV9, - parser: require('@typescript-eslint/parser-v3'), - }, - }).run( - 'eslint: v9, parser: @typescript-eslint/parser@3.x', - ReactHooksESLintRule, - tests - ); + // new ESLintTesterV9({ + // languageOptions: { + // ...languageOptionsV9, + // parser: require('@typescript-eslint/parser-v3'), + // }, + // }).run( + // 'eslint: v9, parser: @typescript-eslint/parser@3.x', + // ReactHooksESLintRule, + // tests + // ); new ESLintTesterV7({ parser: require.resolve('@typescript-eslint/parser-v4'), diff --git a/compiler/packages/eslint-plugin-react-hooks/babel.config.js b/compiler/packages/eslint-plugin-react-hooks/babel.config.js index 8fc8dfbc24..8c761fe120 100644 --- a/compiler/packages/eslint-plugin-react-hooks/babel.config.js +++ b/compiler/packages/eslint-plugin-react-hooks/babel.config.js @@ -6,10 +6,16 @@ */ module.exports = { - presets: ['@babel/preset-env', '@babel/preset-typescript'], + presets: [ + ['@babel/preset-env', {targets: {esmodules: false, node: 'current'}}], + '@babel/preset-typescript', + ], plugins: [ + '@babel/plugin-syntax-jsx', + '@babel/plugin-transform-flow-strip-types', + ['@babel/plugin-proposal-class-properties', {loose: true}], + '@babel/plugin-transform-classes', ['@babel/plugin-transform-private-property-in-object', {loose: true}], - ['@babel/plugin-transform-class-properties', {loose: true}], ['@babel/plugin-transform-private-methods', {loose: true}], ], }; diff --git a/compiler/packages/eslint-plugin-react-hooks/jest.config.js b/compiler/packages/eslint-plugin-react-hooks/jest.config.js new file mode 100644 index 0000000000..aa8995805c --- /dev/null +++ b/compiler/packages/eslint-plugin-react-hooks/jest.config.js @@ -0,0 +1,11 @@ +/** @type {import('jest').Config} */ +const config = { + transform: { + '\\.[jt]sx?$': [ + 'babel-jest', + {configFile: require.resolve('./babel.config.js')}, + ], + }, +}; + +module.exports = config; diff --git a/compiler/packages/eslint-plugin-react-hooks/package.json b/compiler/packages/eslint-plugin-react-hooks/package.json index 77b2a2cc37..b8c4f0d9e3 100644 --- a/compiler/packages/eslint-plugin-react-hooks/package.json +++ b/compiler/packages/eslint-plugin-react-hooks/package.json @@ -62,6 +62,7 @@ "@types/estree-jsx": "^1.0.5", "@types/node": "^20.2.5", "babel-eslint": "^10.0.3", + "babel-jest": "^29.7.0", "eslint-v7": "npm:eslint@^7.7.0", "eslint-v8": "npm:eslint@^8.57.1", "eslint-v9": "npm:eslint@^9.0.0", diff --git a/compiler/yarn.lock b/compiler/yarn.lock index 367385f289..3515509096 100644 --- a/compiler/yarn.lock +++ b/compiler/yarn.lock @@ -2541,6 +2541,13 @@ dependencies: "@sinclair/typebox" "^0.25.16" +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + "@jest/source-map@^28.1.2": version "28.1.2" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-28.1.2.tgz#7fe832b172b497d6663cdff6c13b0a920e139e24" @@ -2691,6 +2698,27 @@ slash "^3.0.0" write-file-atomic "^4.0.2" +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + "@jest/types@^24.9.0": version "24.9.0" resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" @@ -2736,6 +2764,18 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + "@jridgewell/gen-mapping@^0.3.2": version "0.3.8" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" @@ -2803,7 +2843,7 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" -"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": +"@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== @@ -2976,6 +3016,11 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + "@sinonjs/commons@^1.7.0": version "1.8.3" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" @@ -4033,6 +4078,19 @@ babel-jest@^29.5.0: graceful-fs "^4.2.9" slash "^3.0.0" +babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== + dependencies: + "@jest/transform" "^29.7.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.6.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + babel-plugin-dynamic-import-node@^2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" @@ -4114,6 +4172,16 @@ babel-plugin-jest-hoist@^29.5.0: "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" +babel-plugin-jest-hoist@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + babel-plugin-polyfill-corejs2@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz#75044d90ba5043a5fb559ac98496f62f3eb668fd" @@ -4187,6 +4255,14 @@ babel-preset-jest@^29.5.0: babel-plugin-jest-hoist "^29.5.0" babel-preset-current-node-syntax "^1.0.0" +babel-preset-jest@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== + dependencies: + babel-plugin-jest-hoist "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -6691,6 +6767,25 @@ jest-haste-map@^29.5.0: optionalDependencies: fsevents "^2.3.2" +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== + dependencies: + "@jest/types" "^29.6.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + jest-leak-detector@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz#a6685d9b074be99e3adee816ce84fd30795e654d" @@ -6835,6 +6930,11 @@ jest-regex-util@^29.4.3: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.3.tgz#a42616141e0cae052cfa32c169945d00c0aa0bb8" integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== + jest-resolve-dependencies@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz#8c65d7583460df7275c6ea2791901fa975c1fe66" @@ -7193,6 +7293,18 @@ jest-util@^29.5.0: graceful-fs "^4.2.9" picomatch "^2.2.3" +jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + jest-validate@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-28.1.3.tgz#e322267fd5e7c64cea4629612c357bbda96229df" @@ -7299,6 +7411,16 @@ jest-worker@^29.5.0: merge-stream "^2.0.0" supports-color "^8.0.0" +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + jest@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/jest/-/jest-28.1.3.tgz#e9c6a7eecdebe3548ca2b18894a50f45b36dfc6b"