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"