@samitouri / QOS-React-1 / commits / ddff35441a

[compiler] Enable validateExhaustiveMemoizationDependencies by default (#35201)

Enables `@validateExhaustiveMemoizationDependencies` feature flag by default, and disables it in select tests that failed due to the change. Some of our tests intentionally use incorrect memo dependencies in order to test edge cases. --- [//]: # (BEGIN SAPLING FOOTER) Stack created with [Sapling](https://sapling-scm.com). Best reviewed with [ReviewStack](https://reviewstack.dev/facebook/react/pull/35201). * #35213 * __->__ #35201

Joseph Savona committed Nov 25, 2025 at 12:07 UTC ddff35441a63d573ef41fcedabc32105e0ac3122
128 files changed +224 -184
compiler/packages/babel-plugin-react-compiler/src/HIR/Environment.ts
+1 -1
@@ -221,7 +221,7 @@ export const EnvironmentConfigSchema = z.object({
221 /**
222 * Validate that dependencies supplied to manual memoization calls are exhaustive.
223 */
224 - validateExhaustiveMemoizationDependencies: z.boolean().default(false),
224 + validateExhaustiveMemoizationDependencies: z.boolean().default(true),
225
226 /**
227 * When this is true, rather than pruning existing manual memoization but ensuring or validating
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/allow-modify-global-in-callback-jsx.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @enablePreserveExistingMemoizationGuarantees:false
5 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
6 import {useMemo} from 'react';
7
8 const someGlobal = {value: 0};
@@ -33,7 +33,7 @@ export const FIXTURE_ENTRYPOINT = {
33 ## Code
34
35 ```javascript
36 -import { c as _c } from "react/compiler-runtime"; // @enablePreserveExistingMemoizationGuarantees:false
36 +import { c as _c } from "react/compiler-runtime"; // @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
37 import { useMemo } from "react";
38
39 const someGlobal = { value: 0 };
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/allow-modify-global-in-callback-jsx.js
+1 -1
@@ -1,4 +1,4 @@
1 -// @enablePreserveExistingMemoizationGuarantees:false
1 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
2 import {useMemo} from 'react';
3
4 const someGlobal = {value: 0};
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/array-pattern-spread-creates-array.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @validatePreserveExistingMemoizationGuarantees
5 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
6 import {useMemo} from 'react';
7 import {makeObject_Primitives, ValidateMemoization} from 'shared-runtime';
8
@@ -36,7 +36,7 @@ export const FIXTURE_ENTRYPOINT = {
36 ## Code
37
38 ```javascript
39 -import { c as _c } from "react/compiler-runtime"; // @validatePreserveExistingMemoizationGuarantees
39 +import { c as _c } from "react/compiler-runtime"; // @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
40 import { useMemo } from "react";
41 import { makeObject_Primitives, ValidateMemoization } from "shared-runtime";
42
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/array-pattern-spread-creates-array.js
+1 -1
@@ -1,4 +1,4 @@
1 -// @validatePreserveExistingMemoizationGuarantees
1 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
2 import {useMemo} from 'react';
3 import {makeObject_Primitives, ValidateMemoization} from 'shared-runtime';
4
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/block-scoping-switch-variable-scoping.expect.md
+2 -1
@@ -2,6 +2,7 @@
2 ## Input
3
4 ```javascript
5 +// @validateExhaustiveMemoizationDependencies:false
6 import {useMemo} from 'react';
7
8 function Component(props) {
@@ -30,7 +31,7 @@ export const FIXTURE_ENTRYPOINT = {
31 ## Code
32
33 ```javascript
33 -import { c as _c } from "react/compiler-runtime";
34 +import { c as _c } from "react/compiler-runtime"; // @validateExhaustiveMemoizationDependencies:false
35 import { useMemo } from "react";
36
37 function Component(props) {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/block-scoping-switch-variable-scoping.js
+1
@@ -1,3 +1,4 @@
1 +// @validateExhaustiveMemoizationDependencies:false
2 import {useMemo} from 'react';
3
4 function Component(props) {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.bailout-on-suppression-of-custom-rule.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @eslintSuppressionRules:["my-app","react-rule"]
5 +// @eslintSuppressionRules:["my-app","react-rule"] @validateExhaustiveMemoizationDependencies:false
6
7 /* eslint-disable my-app/react-rule */
8 function lowercasecomponent() {
@@ -26,7 +26,7 @@ Error: React Compiler has skipped optimizing this component because one or more
26 React Compiler only works when your components follow all the rules of React, disabling them may result in unexpected or incorrect behavior. Found suppression `eslint-disable my-app/react-rule`.
27
28 error.bailout-on-suppression-of-custom-rule.ts:3:0
29 - 1 | // @eslintSuppressionRules:["my-app","react-rule"]
29 + 1 | // @eslintSuppressionRules:["my-app","react-rule"] @validateExhaustiveMemoizationDependencies:false
30 2 |
31 > 3 | /* eslint-disable my-app/react-rule */
32 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Found React rule suppression
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.bailout-on-suppression-of-custom-rule.js
+1 -1
@@ -1,4 +1,4 @@
1 -// @eslintSuppressionRules:["my-app","react-rule"]
1 +// @eslintSuppressionRules:["my-app","react-rule"] @validateExhaustiveMemoizationDependencies:false
2
3 /* eslint-disable my-app/react-rule */
4 function lowercasecomponent() {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.invalid-sketchy-code-use-forget.expect.md
+14 -12
@@ -2,6 +2,7 @@
2 ## Input
3
4 ```javascript
5 +// @validateExhaustiveMemoizationDependencies:false
6 /* eslint-disable react-hooks/rules-of-hooks */
7 function lowercasecomponent() {
8 'use forget';
@@ -23,25 +24,26 @@ Error: React Compiler has skipped optimizing this component because one or more
24
25 React Compiler only works when your components follow all the rules of React, disabling them may result in unexpected or incorrect behavior. Found suppression `eslint-disable react-hooks/rules-of-hooks`.
26
26 -error.invalid-sketchy-code-use-forget.ts:1:0
27 -> 1 | /* eslint-disable react-hooks/rules-of-hooks */
27 +error.invalid-sketchy-code-use-forget.ts:2:0
28 + 1 | // @validateExhaustiveMemoizationDependencies:false
29 +> 2 | /* eslint-disable react-hooks/rules-of-hooks */
30 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Found React rule suppression
29 - 2 | function lowercasecomponent() {
30 - 3 | 'use forget';
31 - 4 | const x = [];
31 + 3 | function lowercasecomponent() {
32 + 4 | 'use forget';
33 + 5 | const x = [];
34
35 Error: React Compiler has skipped optimizing this component because one or more React ESLint rules were disabled
36
37 React Compiler only works when your components follow all the rules of React, disabling them may result in unexpected or incorrect behavior. Found suppression `eslint-disable-next-line react-hooks/rules-of-hooks`.
38
37 -error.invalid-sketchy-code-use-forget.ts:5:2
38 - 3 | 'use forget';
39 - 4 | const x = [];
40 -> 5 | // eslint-disable-next-line react-hooks/rules-of-hooks
39 +error.invalid-sketchy-code-use-forget.ts:6:2
40 + 4 | 'use forget';
41 + 5 | const x = [];
42 +> 6 | // eslint-disable-next-line react-hooks/rules-of-hooks
43 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Found React rule suppression
42 - 6 | return <div>{x}</div>;
43 - 7 | }
44 - 8 | /* eslint-enable react-hooks/rules-of-hooks */
44 + 7 | return <div>{x}</div>;
45 + 8 | }
46 + 9 | /* eslint-enable react-hooks/rules-of-hooks */
47 ```
48
49
\ No newline at end of file
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.invalid-sketchy-code-use-forget.js
+1
@@ -1,3 +1,4 @@
1 +// @validateExhaustiveMemoizationDependencies:false
2 /* eslint-disable react-hooks/rules-of-hooks */
3 function lowercasecomponent() {
4 'use forget';
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.invalid-unclosed-eslint-suppression.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// Note: Everything below this is sketchy
5 +// Note: Everything below this is sketchy @validateExhaustiveMemoizationDependencies:false
6 /* eslint-disable react-hooks/rules-of-hooks */
7 function lowercasecomponent() {
8 'use forget';
@@ -43,7 +43,7 @@ Error: React Compiler has skipped optimizing this component because one or more
43 React Compiler only works when your components follow all the rules of React, disabling them may result in unexpected or incorrect behavior. Found suppression `eslint-disable react-hooks/rules-of-hooks`.
44
45 error.invalid-unclosed-eslint-suppression.ts:2:0
46 - 1 | // Note: Everything below this is sketchy
46 + 1 | // Note: Everything below this is sketchy @validateExhaustiveMemoizationDependencies:false
47 > 2 | /* eslint-disable react-hooks/rules-of-hooks */
48 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Found React rule suppression
49 3 | function lowercasecomponent() {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.invalid-unclosed-eslint-suppression.js
+1 -1
@@ -1,4 +1,4 @@
1 -// Note: Everything below this is sketchy
1 +// Note: Everything below this is sketchy @validateExhaustiveMemoizationDependencies:false
2 /* eslint-disable react-hooks/rules-of-hooks */
3 function lowercasecomponent() {
4 'use forget';
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.ref-like-name-not-Ref.expect.md
+1 -1
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @validatePreserveExistingMemoizationGuarantees
5 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
6 import {useCallback, useRef} from 'react';
7
8 function useCustomRef() {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.ref-like-name-not-Ref.js
+1 -1
@@ -1,4 +1,4 @@
1 -// @validatePreserveExistingMemoizationGuarantees
1 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
2 import {useCallback, useRef} from 'react';
3
4 function useCustomRef() {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.ref-like-name-not-a-ref.expect.md
+1 -1
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @validatePreserveExistingMemoizationGuarantees
5 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
6 import {useCallback, useRef} from 'react';
7
8 function useCustomRef() {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.ref-like-name-not-a-ref.js
+1 -1
@@ -1,4 +1,4 @@
1 -// @validatePreserveExistingMemoizationGuarantees
1 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
2 import {useCallback, useRef} from 'react';
3
4 function useCustomRef() {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.sketchy-code-exhaustive-deps.expect.md
+14 -11
@@ -2,11 +2,14 @@
2 ## Input
3
4 ```javascript
5 +import {arrayPush} from 'shared-runtime';
6 +
7 +// @validateExhaustiveMemoizationDependencies
8 function Component() {
9 const item = [];
10 const foo = useCallback(
11 () => {
9 - item.push(1);
12 + arrayPush(item, 1);
13 }, // eslint-disable-next-line react-hooks/exhaustive-deps
14 []
15 );
@@ -22,18 +25,18 @@ function Component() {
25 ```
26 Found 1 error:
27
25 -Error: React Compiler has skipped optimizing this component because one or more React ESLint rules were disabled
28 +Error: Found missing memoization dependencies
29
27 -React Compiler only works when your components follow all the rules of React, disabling them may result in unexpected or incorrect behavior. Found suppression `eslint-disable-next-line react-hooks/exhaustive-deps`.
30 +Missing dependencies can cause a value not to update when those inputs change, resulting in stale UI.
31
29 -error.sketchy-code-exhaustive-deps.ts:6:7
30 - 4 | () => {
31 - 5 | item.push(1);
32 -> 6 | }, // eslint-disable-next-line react-hooks/exhaustive-deps
33 - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Found React rule suppression
34 - 7 | []
35 - 8 | );
36 - 9 |
32 +error.sketchy-code-exhaustive-deps.ts:8:16
33 + 6 | const foo = useCallback(
34 + 7 | () => {
35 +> 8 | arrayPush(item, 1);
36 + | ^^^^ Missing dependency `item`
37 + 9 | }, // eslint-disable-next-line react-hooks/exhaustive-deps
38 + 10 | []
39 + 11 | );
40 ```
41
42
\ No newline at end of file
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.sketchy-code-exhaustive-deps.js
+4 -1
@@ -1,8 +1,11 @@
1 +import {arrayPush} from 'shared-runtime';
2 +
3 +// @validateExhaustiveMemoizationDependencies
4 function Component() {
5 const item = [];
6 const foo = useCallback(
7 () => {
5 - item.push(1);
8 + arrayPush(item, 1);
9 }, // eslint-disable-next-line react-hooks/exhaustive-deps
10 []
11 );
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.sketchy-code-rules-of-hooks.expect.md
+7 -5
@@ -2,6 +2,7 @@
2 ## Input
3
4 ```javascript
5 +// @validateExhaustiveMemoizationDependencies:false
6 /* eslint-disable react-hooks/rules-of-hooks */
7 function lowercasecomponent() {
8 const x = [];
@@ -27,12 +28,13 @@ Error: React Compiler has skipped optimizing this component because one or more
28
29 React Compiler only works when your components follow all the rules of React, disabling them may result in unexpected or incorrect behavior. Found suppression `eslint-disable react-hooks/rules-of-hooks`.
30
30 -error.sketchy-code-rules-of-hooks.ts:1:0
31 -> 1 | /* eslint-disable react-hooks/rules-of-hooks */
31 +error.sketchy-code-rules-of-hooks.ts:2:0
32 + 1 | // @validateExhaustiveMemoizationDependencies:false
33 +> 2 | /* eslint-disable react-hooks/rules-of-hooks */
34 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Found React rule suppression
33 - 2 | function lowercasecomponent() {
34 - 3 | const x = [];
35 - 4 | return <div>{x}</div>;
35 + 3 | function lowercasecomponent() {
36 + 4 | const x = [];
37 + 5 | return <div>{x}</div>;
38 ```
39
40
\ No newline at end of file
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.sketchy-code-rules-of-hooks.js
+1
@@ -1,3 +1,4 @@
1 +// @validateExhaustiveMemoizationDependencies:false
2 /* eslint-disable react-hooks/rules-of-hooks */
3 function lowercasecomponent() {
4 const x = [];
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.todo-repro-missed-memoization-from-inferred-mutation-in-logger.expect.md
+1 -1
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @flow @validatePreserveExistingMemoizationGuarantees @enablePreserveExistingMemoizationGuarantees:false
5 +// @flow @validatePreserveExistingMemoizationGuarantees @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
6 import {useFragment} from 'react-relay';
7 import LogEvent from 'LogEvent';
8 import {useCallback, useMemo} from 'react';
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/error.todo-repro-missed-memoization-from-inferred-mutation-in-logger.js
+1 -1
@@ -1,4 +1,4 @@
1 -// @flow @validatePreserveExistingMemoizationGuarantees @enablePreserveExistingMemoizationGuarantees:false
1 +// @flow @validatePreserveExistingMemoizationGuarantees @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
2 import {useFragment} from 'react-relay';
3 import LogEvent from 'LogEvent';
4 import {useCallback, useMemo} from 'react';
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/existing-variables-with-c-name.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @enablePreserveExistingMemoizationGuarantees:false
5 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
6 import {useMemo, useState} from 'react';
7 import {ValidateMemoization} from 'shared-runtime';
8
@@ -29,7 +29,7 @@ export const FIXTURE_ENTRYPOINT = {
29 ## Code
30
31 ```javascript
32 -import { c as _c2 } from "react/compiler-runtime"; // @enablePreserveExistingMemoizationGuarantees:false
32 +import { c as _c2 } from "react/compiler-runtime"; // @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
33 import { useMemo, useState } from "react";
34 import { ValidateMemoization } from "shared-runtime";
35
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/existing-variables-with-c-name.js
+1 -1
@@ -1,4 +1,4 @@
1 -// @enablePreserveExistingMemoizationGuarantees:false
1 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
2 import {useMemo, useState} from 'react';
3 import {ValidateMemoization} from 'shared-runtime';
4
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/fast-refresh-refresh-on-const-changes-dev.expect.md
+4 -4
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @compilationMode:"infer" @enableResetCacheOnSourceFileChanges
5 +// @compilationMode:"infer" @enableResetCacheOnSourceFileChanges @validateExhaustiveMemoizationDependencies:false
6 import {useEffect, useMemo, useState} from 'react';
7 import {ValidateMemoization} from 'shared-runtime';
8
@@ -46,7 +46,7 @@ export const FIXTURE_ENTRYPOINT = {
46 ## Code
47
48 ```javascript
49 -import { c as _c } from "react/compiler-runtime"; // @compilationMode:"infer" @enableResetCacheOnSourceFileChanges
49 +import { c as _c } from "react/compiler-runtime"; // @compilationMode:"infer" @enableResetCacheOnSourceFileChanges @validateExhaustiveMemoizationDependencies:false
50 import { useEffect, useMemo, useState } from "react";
51 import { ValidateMemoization } from "shared-runtime";
52
@@ -63,12 +63,12 @@ function unsafeUpdateConst() {
63 function Component() {
64 const $ = _c(3);
65 if (
66 - $[0] !== "a585d27423c1181e7b6305ff909458183d284658c3c3d2e3764e1128be302fd7"
66 + $[0] !== "36c02976ff5bc474b7510128ea8220ffe31d92cd5d245148ed0a43146d18ded4"
67 ) {
68 for (let $i = 0; $i < 3; $i += 1) {
69 $[$i] = Symbol.for("react.memo_cache_sentinel");
70 }
71 - $[0] = "a585d27423c1181e7b6305ff909458183d284658c3c3d2e3764e1128be302fd7";
71 + $[0] = "36c02976ff5bc474b7510128ea8220ffe31d92cd5d245148ed0a43146d18ded4";
72 }
73 useState(_temp);
74
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/fast-refresh-refresh-on-const-changes-dev.js
+1 -1
@@ -1,4 +1,4 @@
1 -// @compilationMode:"infer" @enableResetCacheOnSourceFileChanges
1 +// @compilationMode:"infer" @enableResetCacheOnSourceFileChanges @validateExhaustiveMemoizationDependencies:false
2 import {useEffect, useMemo, useState} from 'react';
3 import {ValidateMemoization} from 'shared-runtime';
4
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/gating/dynamic-gating-bailout-nopanic.expect.md
+3 -3
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @dynamicGating:{"source":"shared-runtime"} @validatePreserveExistingMemoizationGuarantees @panicThreshold:"none" @loggerTestOnly
5 +// @dynamicGating:{"source":"shared-runtime"} @validatePreserveExistingMemoizationGuarantees @panicThreshold:"none" @loggerTestOnly @validateExhaustiveMemoizationDependencies:false
6
7 import {useMemo} from 'react';
8 import {identity} from 'shared-runtime';
@@ -30,7 +30,7 @@ export const FIXTURE_ENTRYPOINT = {
30 ## Code
31
32 ```javascript
33 -// @dynamicGating:{"source":"shared-runtime"} @validatePreserveExistingMemoizationGuarantees @panicThreshold:"none" @loggerTestOnly
33 +// @dynamicGating:{"source":"shared-runtime"} @validatePreserveExistingMemoizationGuarantees @panicThreshold:"none" @loggerTestOnly @validateExhaustiveMemoizationDependencies:false
34
35 import { useMemo } from "react";
36 import { identity } from "shared-runtime";
@@ -58,7 +58,7 @@ export const FIXTURE_ENTRYPOINT = {
58 ## Logs
59
60 ```
61 -{"kind":"CompileError","fnLoc":{"start":{"line":6,"column":0,"index":206},"end":{"line":16,"column":1,"index":433},"filename":"dynamic-gating-bailout-nopanic.ts"},"detail":{"options":{"category":"PreserveManualMemo","reason":"Existing memoization could not be preserved","description":"React Compiler has skipped optimizing this component because the existing manual memoization could not be preserved. The inferred dependencies did not match the manually specified dependencies, which could cause the value to change more or less frequently than expected. The inferred dependency was `value`, but the source dependencies were []. Inferred dependency not present in source","suggestions":null,"details":[{"kind":"error","loc":{"start":{"line":9,"column":31,"index":288},"end":{"line":9,"column":52,"index":309},"filename":"dynamic-gating-bailout-nopanic.ts"},"message":"Could not preserve existing manual memoization"}]}}}
61 +{"kind":"CompileError","fnLoc":{"start":{"line":6,"column":0,"index":255},"end":{"line":16,"column":1,"index":482},"filename":"dynamic-gating-bailout-nopanic.ts"},"detail":{"options":{"category":"PreserveManualMemo","reason":"Existing memoization could not be preserved","description":"React Compiler has skipped optimizing this component because the existing manual memoization could not be preserved. The inferred dependencies did not match the manually specified dependencies, which could cause the value to change more or less frequently than expected. The inferred dependency was `value`, but the source dependencies were []. Inferred dependency not present in source","suggestions":null,"details":[{"kind":"error","loc":{"start":{"line":9,"column":31,"index":337},"end":{"line":9,"column":52,"index":358},"filename":"dynamic-gating-bailout-nopanic.ts"},"message":"Could not preserve existing manual memoization"}]}}}
62 ```
63
64 ### Eval output
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/gating/dynamic-gating-bailout-nopanic.js
+1 -1
@@ -1,4 +1,4 @@
1 -// @dynamicGating:{"source":"shared-runtime"} @validatePreserveExistingMemoizationGuarantees @panicThreshold:"none" @loggerTestOnly
1 +// @dynamicGating:{"source":"shared-runtime"} @validatePreserveExistingMemoizationGuarantees @panicThreshold:"none" @loggerTestOnly @validateExhaustiveMemoizationDependencies:false
2
3 import {useMemo} from 'react';
4 import {identity} from 'shared-runtime';
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/inner-function/nullable-objects/assume-invoked/use-memo-returned.expect.md
+2 -1
@@ -2,6 +2,7 @@
2 ## Input
3
4 ```javascript
5 +// @validateExhaustiveMemoizationDependencies:false
6 import {useState, useMemo} from 'react';
7 import {useIdentity} from 'shared-runtime';
8
@@ -36,7 +37,7 @@ export const FIXTURE_ENTRYPOINT = {
37 ## Code
38
39 ```javascript
39 -import { c as _c } from "react/compiler-runtime";
40 +import { c as _c } from "react/compiler-runtime"; // @validateExhaustiveMemoizationDependencies:false
41 import { useState, useMemo } from "react";
42 import { useIdentity } from "shared-runtime";
43
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/inner-function/nullable-objects/assume-invoked/use-memo-returned.ts
+1
@@ -1,3 +1,4 @@
1 +// @validateExhaustiveMemoizationDependencies:false
2 import {useState, useMemo} from 'react';
3 import {useIdentity} from 'shared-runtime';
4
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/invalid-useMemo-return-empty.expect.md
+4 -4
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @loggerTestOnly
5 +// @loggerTestOnly @validateExhaustiveMemoizationDependencies:false
6 function component(a) {
7 let x = useMemo(() => {
8 mutate(a);
@@ -15,7 +15,7 @@ function component(a) {
15 ## Code
16
17 ```javascript
18 -// @loggerTestOnly
18 +// @loggerTestOnly @validateExhaustiveMemoizationDependencies:false
19 function component(a) {
20 mutate(a);
21 }
@@ -25,8 +25,8 @@ function component(a) {
25 ## Logs
26
27 ```
28 -{"kind":"CompileError","detail":{"options":{"category":"VoidUseMemo","reason":"useMemo() callbacks must return a value","description":"This useMemo() callback doesn't return a value. useMemo() is for computing and caching values, not for arbitrary side effects","suggestions":null,"details":[{"kind":"error","loc":{"start":{"line":3,"column":18,"index":61},"end":{"line":5,"column":3,"index":87},"filename":"invalid-useMemo-return-empty.ts"},"message":"useMemo() callbacks must return a value"}]}},"fnLoc":null}
29 -{"kind":"CompileSuccess","fnLoc":{"start":{"line":2,"column":0,"index":19},"end":{"line":7,"column":1,"index":107},"filename":"invalid-useMemo-return-empty.ts"},"fnName":"component","memoSlots":0,"memoBlocks":0,"memoValues":0,"prunedMemoBlocks":1,"prunedMemoValues":0}
28 +{"kind":"CompileError","detail":{"options":{"category":"VoidUseMemo","reason":"useMemo() callbacks must return a value","description":"This useMemo() callback doesn't return a value. useMemo() is for computing and caching values, not for arbitrary side effects","suggestions":null,"details":[{"kind":"error","loc":{"start":{"line":3,"column":18,"index":110},"end":{"line":5,"column":3,"index":136},"filename":"invalid-useMemo-return-empty.ts"},"message":"useMemo() callbacks must return a value"}]}},"fnLoc":null}
29 +{"kind":"CompileSuccess","fnLoc":{"start":{"line":2,"column":0,"index":68},"end":{"line":7,"column":1,"index":156},"filename":"invalid-useMemo-return-empty.ts"},"fnName":"component","memoSlots":0,"memoBlocks":0,"memoValues":0,"prunedMemoBlocks":1,"prunedMemoValues":0}
30 ```
31
32 ### Eval output
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/invalid-useMemo-return-empty.js
+1 -1
@@ -1,4 +1,4 @@
1 -// @loggerTestOnly
1 +// @loggerTestOnly @validateExhaustiveMemoizationDependencies:false
2 function component(a) {
3 let x = useMemo(() => {
4 mutate(a);
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/mutate-through-identity-function-expression.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @enablePreserveExistingMemoizationGuarantees:false
5 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
6 import {useMemo} from 'react';
7 import {identity, ValidateMemoization} from 'shared-runtime';
8
@@ -33,7 +33,7 @@ export const FIXTURE_ENTRYPOINT = {
33 ## Code
34
35 ```javascript
36 -import { c as _c } from "react/compiler-runtime"; // @enablePreserveExistingMemoizationGuarantees:false
36 +import { c as _c } from "react/compiler-runtime"; // @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
37 import { useMemo } from "react";
38 import { identity, ValidateMemoization } from "shared-runtime";
39
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/mutate-through-identity-function-expression.js
+1 -1
@@ -1,4 +1,4 @@
1 -// @enablePreserveExistingMemoizationGuarantees:false
1 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
2 import {useMemo} from 'react';
3 import {identity, ValidateMemoization} from 'shared-runtime';
4
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/mutate-through-identity.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @enablePreserveExistingMemoizationGuarantees:false
5 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
6 import {useMemo} from 'react';
7 import {identity, ValidateMemoization} from 'shared-runtime';
8
@@ -30,7 +30,7 @@ export const FIXTURE_ENTRYPOINT = {
30 ## Code
31
32 ```javascript
33 -import { c as _c } from "react/compiler-runtime"; // @enablePreserveExistingMemoizationGuarantees:false
33 +import { c as _c } from "react/compiler-runtime"; // @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
34 import { useMemo } from "react";
35 import { identity, ValidateMemoization } from "shared-runtime";
36
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/mutate-through-identity.js
+1 -1
@@ -1,4 +1,4 @@
1 -// @enablePreserveExistingMemoizationGuarantees:false
1 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
2 import {useMemo} from 'react';
3 import {identity, ValidateMemoization} from 'shared-runtime';
4
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/repro-destructure-from-prop-with-default-value.expect.md
+2 -1
@@ -2,6 +2,7 @@
2 ## Input
3
4 ```javascript
5 +// @validateExhaustiveMemoizationDependencies:false
6 export function useFormatRelativeTime(opts = {}) {
7 const {timeZone, minimal} = opts;
8 const format = useCallback(function formatWithUnit() {}, [minimal]);
@@ -21,7 +22,7 @@ export function useFormatRelativeTime(opts = {}) {
22 ## Code
23
24 ```javascript
24 -import { c as _c } from "react/compiler-runtime";
25 +import { c as _c } from "react/compiler-runtime"; // @validateExhaustiveMemoizationDependencies:false
26 export function useFormatRelativeTime(t0) {
27 const $ = _c(1);
28 const opts = t0 === undefined ? {} : t0;
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/repro-destructure-from-prop-with-default-value.js
+1
@@ -1,3 +1,4 @@
1 +// @validateExhaustiveMemoizationDependencies:false
2 export function useFormatRelativeTime(opts = {}) {
3 const {timeZone, minimal} = opts;
4 const format = useCallback(function formatWithUnit() {}, [minimal]);
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/todo-control-flow-sensitive-mutation.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @enablePreserveExistingMemoizationGuarantees:false
5 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
6 import {useMemo} from 'react';
7 import {
8 mutate,
@@ -50,7 +50,7 @@ export const FIXTURE_ENTRYPOINT = {
50 ## Code
51
52 ```javascript
53 -import { c as _c } from "react/compiler-runtime"; // @enablePreserveExistingMemoizationGuarantees:false
53 +import { c as _c } from "react/compiler-runtime"; // @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
54 import { useMemo } from "react";
55 import {
56 mutate,
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/todo-control-flow-sensitive-mutation.tsx
+1 -1
@@ -1,4 +1,4 @@
1 -// @enablePreserveExistingMemoizationGuarantees:false
1 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
2 import {useMemo} from 'react';
3 import {
4 mutate,
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/transitivity-add-captured-array-to-itself.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @enablePreserveExistingMemoizationGuarantees:false
5 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
6 import {useMemo} from 'react';
7 import {
8 typedCapture,
@@ -43,7 +43,7 @@ export const FIXTURE_ENTRYPOINT = {
43 ## Code
44
45 ```javascript
46 -import { c as _c } from "react/compiler-runtime"; // @enablePreserveExistingMemoizationGuarantees:false
46 +import { c as _c } from "react/compiler-runtime"; // @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
47 import { useMemo } from "react";
48 import {
49 typedCapture,
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/transitivity-add-captured-array-to-itself.tsx
+1 -1
@@ -1,4 +1,4 @@
1 -// @enablePreserveExistingMemoizationGuarantees:false
1 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
2 import {useMemo} from 'react';
3 import {
4 typedCapture,
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/transitivity-capture-createfrom-lambda.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @enablePreserveExistingMemoizationGuarantees:false
5 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
6 import {useMemo} from 'react';
7 import {
8 typedCapture,
@@ -41,7 +41,7 @@ export const FIXTURE_ENTRYPOINT = {
41 ## Code
42
43 ```javascript
44 -import { c as _c } from "react/compiler-runtime"; // @enablePreserveExistingMemoizationGuarantees:false
44 +import { c as _c } from "react/compiler-runtime"; // @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
45 import { useMemo } from "react";
46 import {
47 typedCapture,
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/transitivity-capture-createfrom-lambda.tsx
+1 -1
@@ -1,4 +1,4 @@
1 -// @enablePreserveExistingMemoizationGuarantees:false
1 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
2 import {useMemo} from 'react';
3 import {
4 typedCapture,
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/transitivity-capture-createfrom.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @enablePreserveExistingMemoizationGuarantees:false
5 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
6 import {useMemo} from 'react';
7 import {
8 typedCapture,
@@ -37,7 +37,7 @@ export const FIXTURE_ENTRYPOINT = {
37 ## Code
38
39 ```javascript
40 -import { c as _c } from "react/compiler-runtime"; // @enablePreserveExistingMemoizationGuarantees:false
40 +import { c as _c } from "react/compiler-runtime"; // @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
41 import { useMemo } from "react";
42 import {
43 typedCapture,
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/transitivity-capture-createfrom.tsx
+1 -1
@@ -1,4 +1,4 @@
1 -// @enablePreserveExistingMemoizationGuarantees:false
1 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
2 import {useMemo} from 'react';
3 import {
4 typedCapture,
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/transitivity-phi-assign-or-capture.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @enablePreserveExistingMemoizationGuarantees:false
5 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
6 import {useMemo} from 'react';
7 import {
8 typedCapture,
@@ -41,7 +41,7 @@ export const FIXTURE_ENTRYPOINT = {
41 ## Code
42
43 ```javascript
44 -import { c as _c } from "react/compiler-runtime"; // @enablePreserveExistingMemoizationGuarantees:false
44 +import { c as _c } from "react/compiler-runtime"; // @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
45 import { useMemo } from "react";
46 import {
47 typedCapture,
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/transitivity-phi-assign-or-capture.tsx
+1 -1
@@ -1,4 +1,4 @@
1 -// @enablePreserveExistingMemoizationGuarantees:false
1 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
2 import {useMemo} from 'react';
3 import {
4 typedCapture,
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/useCallback-reordering-deplist-controlflow.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @enableNewMutationAliasingModel @enablePreserveExistingMemoizationGuarantees:false
5 +// @enableNewMutationAliasingModel @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
6 import {useCallback} from 'react';
7 import {Stringify} from 'shared-runtime';
8
@@ -36,7 +36,7 @@ export const FIXTURE_ENTRYPOINT = {
36 ## Code
37
38 ```javascript
39 -import { c as _c } from "react/compiler-runtime"; // @enableNewMutationAliasingModel @enablePreserveExistingMemoizationGuarantees:false
39 +import { c as _c } from "react/compiler-runtime"; // @enableNewMutationAliasingModel @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
40 import { useCallback } from "react";
41 import { Stringify } from "shared-runtime";
42
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/useCallback-reordering-deplist-controlflow.tsx
+1 -1
@@ -1,4 +1,4 @@
1 -// @enableNewMutationAliasingModel @enablePreserveExistingMemoizationGuarantees:false
1 +// @enableNewMutationAliasingModel @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
2 import {useCallback} from 'react';
3 import {Stringify} from 'shared-runtime';
4
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/useCallback-reordering-depslist-assignment.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @enableNewMutationAliasingModel @enablePreserveExistingMemoizationGuarantees:false
5 +// @enableNewMutationAliasingModel @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
6 import {useCallback} from 'react';
7 import {Stringify} from 'shared-runtime';
8
@@ -31,7 +31,7 @@ export const FIXTURE_ENTRYPOINT = {
31 ## Code
32
33 ```javascript
34 -import { c as _c } from "react/compiler-runtime"; // @enableNewMutationAliasingModel @enablePreserveExistingMemoizationGuarantees:false
34 +import { c as _c } from "react/compiler-runtime"; // @enableNewMutationAliasingModel @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
35 import { useCallback } from "react";
36 import { Stringify } from "shared-runtime";
37
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/useCallback-reordering-depslist-assignment.tsx
+1 -1
@@ -1,4 +1,4 @@
1 -// @enableNewMutationAliasingModel @enablePreserveExistingMemoizationGuarantees:false
1 +// @enableNewMutationAliasingModel @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
2 import {useCallback} from 'react';
3 import {Stringify} from 'shared-runtime';
4
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/useMemo-reordering-depslist-assignment.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @enableNewMutationAliasingModel @enablePreserveExistingMemoizationGuarantees:false
5 +// @enableNewMutationAliasingModel @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
6 import {useMemo} from 'react';
7
8 function useFoo(arr1, arr2) {
@@ -27,7 +27,7 @@ export const FIXTURE_ENTRYPOINT = {
27 ## Code
28
29 ```javascript
30 -import { c as _c } from "react/compiler-runtime"; // @enableNewMutationAliasingModel @enablePreserveExistingMemoizationGuarantees:false
30 +import { c as _c } from "react/compiler-runtime"; // @enableNewMutationAliasingModel @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
31 import { useMemo } from "react";
32
33 function useFoo(arr1, arr2) {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/new-mutability/useMemo-reordering-depslist-assignment.ts
+1 -1
@@ -1,4 +1,4 @@
1 -// @enableNewMutationAliasingModel @enablePreserveExistingMemoizationGuarantees:false
1 +// @enableNewMutationAliasingModel @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
2 import {useMemo} from 'react';
3
4 function useFoo(arr1, arr2) {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/error.preserve-use-memo-ref-missing-reactive.expect.md
+1 -1
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @validatePreserveExistingMemoizationGuarantees
5 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
6 import {useCallback, useRef} from 'react';
7
8 function useFoo({cond}) {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/error.preserve-use-memo-ref-missing-reactive.ts
+1 -1
@@ -1,4 +1,4 @@
1 -// @validatePreserveExistingMemoizationGuarantees
1 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
2 import {useCallback, useRef} from 'react';
3
4 function useFoo({cond}) {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/error.useCallback-aliased-var.expect.md
+1 -1
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @validatePreserveExistingMemoizationGuarantees
5 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
6
7 // This is technically a false positive, but source is already breaking
8 // `exhaustive-deps` lint rule (and can be considered invalid).
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/error.useCallback-aliased-var.ts
+1 -1
@@ -1,4 +1,4 @@
1 -// @validatePreserveExistingMemoizationGuarantees
1 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
2
3 // This is technically a false positive, but source is already breaking
4 // `exhaustive-deps` lint rule (and can be considered invalid).
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/error.useCallback-property-call-dep.expect.md
+1 -1
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @validatePreserveExistingMemoizationGuarantees
5 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
6 import {useCallback} from 'react';
7
8 function Component({propA}) {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/error.useCallback-property-call-dep.ts
+1 -1
@@ -1,4 +1,4 @@
1 -// @validatePreserveExistingMemoizationGuarantees
1 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
2 import {useCallback} from 'react';
3
4 function Component({propA}) {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/error.useMemo-aliased-var.expect.md
+1 -1
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @validatePreserveExistingMemoizationGuarantees
5 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
6
7 // This is technically a false positive, but source is already breaking
8 // `exhaustive-deps` lint rule (and can be considered invalid).
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/error.useMemo-aliased-var.ts
+1 -1
@@ -1,4 +1,4 @@
1 -// @validatePreserveExistingMemoizationGuarantees
1 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
2
3 // This is technically a false positive, but source is already breaking
4 // `exhaustive-deps` lint rule (and can be considered invalid).
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/error.useMemo-property-call-chained-object.expect.md
+1 -1
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @validatePreserveExistingMemoizationGuarantees
5 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
6 import {useMemo} from 'react';
7
8 function Component({propA}) {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/error.useMemo-property-call-chained-object.ts
+1 -1
@@ -1,4 +1,4 @@
1 -// @validatePreserveExistingMemoizationGuarantees
1 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
2 import {useMemo} from 'react';
3
4 function Component({propA}) {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/error.useMemo-property-call-dep.expect.md
+1 -1
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @validatePreserveExistingMemoizationGuarantees
5 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
6 import {useMemo} from 'react';
7
8 function Component({propA}) {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/error.useMemo-property-call-dep.ts
+1 -1
@@ -1,4 +1,4 @@
1 -// @validatePreserveExistingMemoizationGuarantees
1 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
2 import {useMemo} from 'react';
3
4 function Component({propA}) {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/error.useMemo-unrelated-mutation-in-depslist.expect.md
+6 -10
@@ -32,19 +32,15 @@ function useFoo(input1) {
32 ```
33 Found 1 error:
34
35 -Compilation Skipped: Existing memoization could not be preserved
35 +Error: Found missing memoization dependencies
36
37 -React Compiler has skipped optimizing this component because the existing manual memoization could not be preserved. The inferred dependencies did not match the manually specified dependencies, which could cause the value to change more or less frequently than expected. The inferred dependency was `input1`, but the source dependencies were [y]. Inferred different dependency than source.
37 +Missing dependencies can cause a value not to update when those inputs change, resulting in stale UI.
38
39 -error.useMemo-unrelated-mutation-in-depslist.ts:16:27
40 - 14 | const x = {};
41 - 15 | const y = [input1];
42 -> 16 | const memoized = useMemo(() => {
43 - | ^^^^^^^
44 -> 17 | return [y];
45 - | ^^^^^^^^^^^^^^^
39 +error.useMemo-unrelated-mutation-in-depslist.ts:18:14
40 + 16 | const memoized = useMemo(() => {
41 + 17 | return [y];
42 > 18 | }, [(mutate(x), y)]);
47 - | ^^^^ Could not preserve existing manual memoization
43 + | ^ Missing dependency `x`
44 19 |
45 20 | return [x, memoized];
46 21 | }
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/repro-maybe-invalid-useMemo-read-maybeRef.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @validatePreserveExistingMemoizationGuarantees
5 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
6 import {useMemo} from 'react';
7
8 function useHook(maybeRef, shouldRead) {
@@ -16,7 +16,7 @@ function useHook(maybeRef, shouldRead) {
16 ## Code
17
18 ```javascript
19 -import { c as _c } from "react/compiler-runtime"; // @validatePreserveExistingMemoizationGuarantees
19 +import { c as _c } from "react/compiler-runtime"; // @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
20 import { useMemo } from "react";
21
22 function useHook(maybeRef, shouldRead) {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/repro-maybe-invalid-useMemo-read-maybeRef.ts
+1 -1
@@ -1,4 +1,4 @@
1 -// @validatePreserveExistingMemoizationGuarantees
1 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
2 import {useMemo} from 'react';
3
4 function useHook(maybeRef, shouldRead) {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/useCallback-infer-fewer-deps.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @validatePreserveExistingMemoizationGuarantees
5 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
6
7 import {useCallback} from 'react';
8
@@ -21,7 +21,7 @@ export const FIXTURE_ENTRYPOINT = {
21 ## Code
22
23 ```javascript
24 -import { c as _c } from "react/compiler-runtime"; // @validatePreserveExistingMemoizationGuarantees
24 +import { c as _c } from "react/compiler-runtime"; // @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
25
26 import { useCallback } from "react";
27
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/useCallback-infer-fewer-deps.ts
+1 -1
@@ -1,4 +1,4 @@
1 -// @validatePreserveExistingMemoizationGuarantees
1 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
2
3 import {useCallback} from 'react';
4
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/useCallback-infer-scope-global.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @validatePreserveExistingMemoizationGuarantees
5 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
6
7 import {useCallback} from 'react';
8 import {CONST_STRING0} from 'shared-runtime';
@@ -22,7 +22,7 @@ export const FIXTURE_ENTRYPOINT = {
22 ## Code
23
24 ```javascript
25 -// @validatePreserveExistingMemoizationGuarantees
25 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
26
27 import { useCallback } from "react";
28 import { CONST_STRING0 } from "shared-runtime";
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/useCallback-infer-scope-global.ts
+1 -1
@@ -1,4 +1,4 @@
1 -// @validatePreserveExistingMemoizationGuarantees
1 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
2
3 import {useCallback} from 'react';
4 import {CONST_STRING0} from 'shared-runtime';
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/useCallback-nonescaping-invoked-callback-escaping-return.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @validatePreserveExistingMemoizationGuarantees @enableAssumeHooksFollowRulesOfReact @enableTransitivelyFreezeFunctionExpressions
5 +// @validatePreserveExistingMemoizationGuarantees @enableAssumeHooksFollowRulesOfReact @enableTransitivelyFreezeFunctionExpressions @validateExhaustiveMemoizationDependencies:false
6 import {useCallback} from 'react';
7
8 function Component({entity, children}) {
@@ -36,7 +36,7 @@ export const FIXTURE_ENTRYPOINT = {
36 ## Code
37
38 ```javascript
39 -import { c as _c } from "react/compiler-runtime"; // @validatePreserveExistingMemoizationGuarantees @enableAssumeHooksFollowRulesOfReact @enableTransitivelyFreezeFunctionExpressions
39 +import { c as _c } from "react/compiler-runtime"; // @validatePreserveExistingMemoizationGuarantees @enableAssumeHooksFollowRulesOfReact @enableTransitivelyFreezeFunctionExpressions @validateExhaustiveMemoizationDependencies:false
40 import { useCallback } from "react";
41
42 function Component(t0) {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/useCallback-nonescaping-invoked-callback-escaping-return.js
+1 -1
@@ -1,4 +1,4 @@
1 -// @validatePreserveExistingMemoizationGuarantees @enableAssumeHooksFollowRulesOfReact @enableTransitivelyFreezeFunctionExpressions
1 +// @validatePreserveExistingMemoizationGuarantees @enableAssumeHooksFollowRulesOfReact @enableTransitivelyFreezeFunctionExpressions @validateExhaustiveMemoizationDependencies:false
2 import {useCallback} from 'react';
3
4 function Component({entity, children}) {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/useCallback-reordering-deplist-controlflow.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @enablePreserveExistingMemoizationGuarantees:false
5 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
6 import {useCallback} from 'react';
7 import {Stringify} from 'shared-runtime';
8
@@ -36,7 +36,7 @@ export const FIXTURE_ENTRYPOINT = {
36 ## Code
37
38 ```javascript
39 -import { c as _c } from "react/compiler-runtime"; // @enablePreserveExistingMemoizationGuarantees:false
39 +import { c as _c } from "react/compiler-runtime"; // @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
40 import { useCallback } from "react";
41 import { Stringify } from "shared-runtime";
42
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/useCallback-reordering-deplist-controlflow.tsx
+1 -1
@@ -1,4 +1,4 @@
1 -// @enablePreserveExistingMemoizationGuarantees:false
1 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
2 import {useCallback} from 'react';
3 import {Stringify} from 'shared-runtime';
4
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/useCallback-reordering-depslist-assignment.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @enablePreserveExistingMemoizationGuarantees:false
5 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
6 import {useCallback} from 'react';
7 import {Stringify} from 'shared-runtime';
8
@@ -31,7 +31,7 @@ export const FIXTURE_ENTRYPOINT = {
31 ## Code
32
33 ```javascript
34 -import { c as _c } from "react/compiler-runtime"; // @enablePreserveExistingMemoizationGuarantees:false
34 +import { c as _c } from "react/compiler-runtime"; // @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
35 import { useCallback } from "react";
36 import { Stringify } from "shared-runtime";
37
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/useCallback-reordering-depslist-assignment.tsx
+1 -1
@@ -1,4 +1,4 @@
1 -// @enablePreserveExistingMemoizationGuarantees:false
1 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
2 import {useCallback} from 'react';
3 import {Stringify} from 'shared-runtime';
4
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/useCallback-with-no-depslist.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @validatePreserveExistingMemoizationGuarantees
5 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
6 import {useCallback} from 'react';
7
8 // Compiler can produce any memoization it finds valid if the
@@ -24,7 +24,7 @@ export const FIXTURE_ENTRYPOINT = {
24 ## Code
25
26 ```javascript
27 -import { c as _c } from "react/compiler-runtime"; // @validatePreserveExistingMemoizationGuarantees
27 +import { c as _c } from "react/compiler-runtime"; // @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
28 import { useCallback } from "react";
29
30 // Compiler can produce any memoization it finds valid if the
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/useCallback-with-no-depslist.ts
+1 -1
@@ -1,4 +1,4 @@
1 -// @validatePreserveExistingMemoizationGuarantees
1 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
2 import {useCallback} from 'react';
3
4 // Compiler can produce any memoization it finds valid if the
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/useMemo-dep-array-literal-access.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @validatePreserveExistingMemoizationGuarantees
5 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
6
7 import {useMemo} from 'react';
8 import {makeArray} from 'shared-runtime';
@@ -27,7 +27,7 @@ export const FIXTURE_ENTRYPOINT = {
27 ## Code
28
29 ```javascript
30 -import { c as _c } from "react/compiler-runtime"; // @validatePreserveExistingMemoizationGuarantees
30 +import { c as _c } from "react/compiler-runtime"; // @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
31
32 import { useMemo } from "react";
33 import { makeArray } from "shared-runtime";
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/useMemo-dep-array-literal-access.ts
+1 -1
@@ -1,4 +1,4 @@
1 -// @validatePreserveExistingMemoizationGuarantees
1 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
2
3 import {useMemo} from 'react';
4 import {makeArray} from 'shared-runtime';
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/useMemo-infer-fewer-deps.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @validatePreserveExistingMemoizationGuarantees
5 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
6
7 import {useMemo} from 'react';
8
@@ -21,7 +21,7 @@ export const FIXTURE_ENTRYPOINT = {
21 ## Code
22
23 ```javascript
24 -import { c as _c } from "react/compiler-runtime"; // @validatePreserveExistingMemoizationGuarantees
24 +import { c as _c } from "react/compiler-runtime"; // @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
25
26 import { useMemo } from "react";
27
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/useMemo-infer-fewer-deps.ts
+1 -1
@@ -1,4 +1,4 @@
1 -// @validatePreserveExistingMemoizationGuarantees
1 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
2
3 import {useMemo} from 'react';
4
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/useMemo-infer-scope-global.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @validatePreserveExistingMemoizationGuarantees
5 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
6
7 import {useMemo} from 'react';
8 import {CONST_STRING0} from 'shared-runtime';
@@ -22,7 +22,7 @@ export const FIXTURE_ENTRYPOINT = {
22 ## Code
23
24 ```javascript
25 -import { c as _c } from "react/compiler-runtime"; // @validatePreserveExistingMemoizationGuarantees
25 +import { c as _c } from "react/compiler-runtime"; // @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
26
27 import { useMemo } from "react";
28 import { CONST_STRING0 } from "shared-runtime";
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/useMemo-infer-scope-global.ts
+1 -1
@@ -1,4 +1,4 @@
1 -// @validatePreserveExistingMemoizationGuarantees
1 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
2
3 import {useMemo} from 'react';
4 import {CONST_STRING0} from 'shared-runtime';
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/useMemo-reordering-depslist-assignment.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @enablePreserveExistingMemoizationGuarantees:false
5 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
6 import {useMemo} from 'react';
7
8 function useFoo(arr1, arr2) {
@@ -27,7 +27,7 @@ export const FIXTURE_ENTRYPOINT = {
27 ## Code
28
29 ```javascript
30 -import { c as _c } from "react/compiler-runtime"; // @enablePreserveExistingMemoizationGuarantees:false
30 +import { c as _c } from "react/compiler-runtime"; // @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
31 import { useMemo } from "react";
32
33 function useFoo(arr1, arr2) {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/useMemo-reordering-depslist-assignment.ts
+1 -1
@@ -1,4 +1,4 @@
1 -// @enablePreserveExistingMemoizationGuarantees:false
1 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
2 import {useMemo} from 'react';
3
4 function useFoo(arr1, arr2) {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/useMemo-reordering-depslist-controlflow.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @enablePreserveExistingMemoizationGuarantees:false
5 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
6 import {useMemo} from 'react';
7 import {Stringify} from 'shared-runtime';
8
@@ -36,7 +36,7 @@ export const FIXTURE_ENTRYPOINT = {
36 ## Code
37
38 ```javascript
39 -import { c as _c } from "react/compiler-runtime"; // @enablePreserveExistingMemoizationGuarantees:false
39 +import { c as _c } from "react/compiler-runtime"; // @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
40 import { useMemo } from "react";
41 import { Stringify } from "shared-runtime";
42
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/useMemo-reordering-depslist-controlflow.tsx
+1 -1
@@ -1,4 +1,4 @@
1 -// @enablePreserveExistingMemoizationGuarantees:false
1 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
2 import {useMemo} from 'react';
3 import {Stringify} from 'shared-runtime';
4
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/useMemo-with-no-depslist.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @validatePreserveExistingMemoizationGuarantees
5 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
6 import {useMemo} from 'react';
7
8 // Compiler can produce any memoization it finds valid if the
@@ -24,7 +24,7 @@ export const FIXTURE_ENTRYPOINT = {
24 ## Code
25
26 ```javascript
27 -import { c as _c } from "react/compiler-runtime"; // @validatePreserveExistingMemoizationGuarantees
27 +import { c as _c } from "react/compiler-runtime"; // @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
28 import { useMemo } from "react";
29
30 // Compiler can produce any memoization it finds valid if the
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/preserve-memo-validation/useMemo-with-no-depslist.ts
+1 -1
@@ -1,4 +1,4 @@
1 -// @validatePreserveExistingMemoizationGuarantees
1 +// @validatePreserveExistingMemoizationGuarantees @validateExhaustiveMemoizationDependencies:false
2 import {useMemo} from 'react';
3
4 // Compiler can produce any memoization it finds valid if the
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/propagate-scope-deps-hir-fork/useMemo-multiple-if-else.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @enablePropagateDepsInHIR
5 +// @enablePropagateDepsInHIR @validateExhaustiveMemoizationDependencies:false
6 import {useMemo} from 'react';
7
8 function Component(props) {
@@ -30,7 +30,7 @@ export const FIXTURE_ENTRYPOINT = {
30 ## Code
31
32 ```javascript
33 -import { c as _c } from "react/compiler-runtime"; // @enablePropagateDepsInHIR
33 +import { c as _c } from "react/compiler-runtime"; // @enablePropagateDepsInHIR @validateExhaustiveMemoizationDependencies:false
34 import { useMemo } from "react";
35
36 function Component(props) {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/propagate-scope-deps-hir-fork/useMemo-multiple-if-else.js
+1 -1
@@ -1,4 +1,4 @@
1 -// @enablePropagateDepsInHIR
1 +// @enablePropagateDepsInHIR @validateExhaustiveMemoizationDependencies:false
2 import {useMemo} from 'react';
3
4 function Component(props) {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/repro-no-declarations-in-reactive-scope-with-early-return.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @enableAssumeHooksFollowRulesOfReact @enableTransitivelyFreezeFunctionExpressions @enablePreserveExistingMemoizationGuarantees:false
5 +// @enableAssumeHooksFollowRulesOfReact @enableTransitivelyFreezeFunctionExpressions @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
6 function Component() {
7 const items = useItems();
8 const filteredItems = useMemo(
@@ -37,7 +37,7 @@ function Component() {
37 ## Code
38
39 ```javascript
40 -import { c as _c } from "react/compiler-runtime"; // @enableAssumeHooksFollowRulesOfReact @enableTransitivelyFreezeFunctionExpressions @enablePreserveExistingMemoizationGuarantees:false
40 +import { c as _c } from "react/compiler-runtime"; // @enableAssumeHooksFollowRulesOfReact @enableTransitivelyFreezeFunctionExpressions @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
41 function Component() {
42 const $ = _c(6);
43 const items = useItems();
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/repro-no-declarations-in-reactive-scope-with-early-return.js
+1 -1
@@ -1,4 +1,4 @@
1 -// @enableAssumeHooksFollowRulesOfReact @enableTransitivelyFreezeFunctionExpressions @enablePreserveExistingMemoizationGuarantees:false
1 +// @enableAssumeHooksFollowRulesOfReact @enableTransitivelyFreezeFunctionExpressions @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
2 function Component() {
3 const items = useItems();
4 const filteredItems = useMemo(
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/repro.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @validateNoVoidUseMemo:false
5 +// @validateNoVoidUseMemo:false @validateExhaustiveMemoizationDependencies:false
6 function Component(props) {
7 const item = props.item;
8 const thumbnails = [];
@@ -23,7 +23,7 @@ function Component(props) {
23 ## Code
24
25 ```javascript
26 -import { c as _c } from "react/compiler-runtime"; // @validateNoVoidUseMemo:false
26 +import { c as _c } from "react/compiler-runtime"; // @validateNoVoidUseMemo:false @validateExhaustiveMemoizationDependencies:false
27 function Component(props) {
28 const $ = _c(6);
29 const item = props.item;
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/repro.js
+1 -1
@@ -1,4 +1,4 @@
1 -// @validateNoVoidUseMemo:false
1 +// @validateNoVoidUseMemo:false @validateExhaustiveMemoizationDependencies:false
2 function Component(props) {
3 const item = props.item;
4 const thumbnails = [];
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/unclosed-eslint-suppression-skips-all-components.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @panicThreshold:"none"
5 +// @panicThreshold:"none" @validateExhaustiveMemoizationDependencies:false
6
7 // unclosed disable rule should affect all components
8 /* eslint-disable react-hooks/rules-of-hooks */
@@ -20,7 +20,7 @@ function ValidComponent2(props) {
20 ## Code
21
22 ```javascript
23 -// @panicThreshold:"none"
23 +// @panicThreshold:"none" @validateExhaustiveMemoizationDependencies:false
24
25 // unclosed disable rule should affect all components
26 /* eslint-disable react-hooks/rules-of-hooks */
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/unclosed-eslint-suppression-skips-all-components.js
+1 -1
@@ -1,4 +1,4 @@
1 -// @panicThreshold:"none"
1 +// @panicThreshold:"none" @validateExhaustiveMemoizationDependencies:false
2
3 // unclosed disable rule should affect all components
4 /* eslint-disable react-hooks/rules-of-hooks */
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/use-callback-simple.expect.md
+2 -1
@@ -2,6 +2,7 @@
2 ## Input
3
4 ```javascript
5 +// @validateExhaustiveMemoizationDependencies:false
6 function component() {
7 const [count, setCount] = useState(0);
8 const increment = useCallback(() => setCount(count + 1));
@@ -14,7 +15,7 @@ function component() {
15 ## Code
16
17 ```javascript
17 -import { c as _c } from "react/compiler-runtime";
18 +import { c as _c } from "react/compiler-runtime"; // @validateExhaustiveMemoizationDependencies:false
19 function component() {
20 const $ = _c(4);
21 const [count, setCount] = useState(0);
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/use-callback-simple.js
+1
@@ -1,3 +1,4 @@
1 +// @validateExhaustiveMemoizationDependencies:false
2 function component() {
3 const [count, setCount] = useState(0);
4 const increment = useCallback(() => setCount(count + 1));
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useCallback-maybe-modify-free-variable-dont-preserve-memoization-guarantee.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @enablePreserveExistingMemoizationGuarantees:false
5 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
6 import {useCallback} from 'react';
7 import {identity, makeObject_Primitives, mutate, useHook} from 'shared-runtime';
8
@@ -31,7 +31,7 @@ export const FIXTURE_ENTRYPOINT = {
31 ## Code
32
33 ```javascript
34 -// @enablePreserveExistingMemoizationGuarantees:false
34 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
35 import { useCallback } from "react";
36 import {
37 identity,
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useCallback-maybe-modify-free-variable-dont-preserve-memoization-guarantee.js
+1 -1
@@ -1,4 +1,4 @@
1 -// @enablePreserveExistingMemoizationGuarantees:false
1 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
2 import {useCallback} from 'react';
3 import {identity, makeObject_Primitives, mutate, useHook} from 'shared-runtime';
4
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-if-else-multiple-return.expect.md
+2 -1
@@ -2,6 +2,7 @@
2 ## Input
3
4 ```javascript
5 +// @validateExhaustiveMemoizationDependencies:false
6 function Component(props) {
7 const x = useMemo(() => {
8 if (props.cond) {
@@ -17,7 +18,7 @@ function Component(props) {
18 ## Code
19
20 ```javascript
20 -import { c as _c } from "react/compiler-runtime";
21 +import { c as _c } from "react/compiler-runtime"; // @validateExhaustiveMemoizationDependencies:false
22 function Component(props) {
23 const $ = _c(4);
24 let t0;
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-if-else-multiple-return.js
+1
@@ -1,3 +1,4 @@
1 +// @validateExhaustiveMemoizationDependencies:false
2 function Component(props) {
3 const x = useMemo(() => {
4 if (props.cond) {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-independently-memoizeable.expect.md
+2 -1
@@ -2,6 +2,7 @@
2 ## Input
3
4 ```javascript
5 +// @validateExhaustiveMemoizationDependencies:false
6 function Component(props) {
7 const [a, b] = useMemo(() => {
8 const items = [];
@@ -17,7 +18,7 @@ function Component(props) {
18 ## Code
19
20 ```javascript
20 -import { c as _c } from "react/compiler-runtime";
21 +import { c as _c } from "react/compiler-runtime"; // @validateExhaustiveMemoizationDependencies:false
22 function Component(props) {
23 const $ = _c(10);
24 let t0;
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-independently-memoizeable.js
+1
@@ -1,3 +1,4 @@
1 +// @validateExhaustiveMemoizationDependencies:false
2 function Component(props) {
3 const [a, b] = useMemo(() => {
4 const items = [];
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-inverted-if.expect.md
+2
@@ -2,6 +2,7 @@
2 ## Input
3
4 ```javascript
5 +// @validateExhaustiveMemoizationDependencies:false
6 function Component(props) {
7 const x = useMemo(() => {
8 label: {
@@ -26,6 +27,7 @@ export const FIXTURE_ENTRYPOINT = {
27 ## Code
28
29 ```javascript
30 +// @validateExhaustiveMemoizationDependencies:false
31 function Component(props) {
32 let t0;
33 bb0: {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-inverted-if.js
+1
@@ -1,3 +1,4 @@
1 +// @validateExhaustiveMemoizationDependencies:false
2 function Component(props) {
3 const x = useMemo(() => {
4 label: {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-labeled-statement-unconditional-return.expect.md
+2
@@ -2,6 +2,7 @@
2 ## Input
3
4 ```javascript
5 +// @validateExhaustiveMemoizationDependencies:false
6 function Component(props) {
7 const x = useMemo(() => {
8 label: {
@@ -22,6 +23,7 @@ export const FIXTURE_ENTRYPOINT = {
23 ## Code
24
25 ```javascript
26 +// @validateExhaustiveMemoizationDependencies:false
27 function Component(props) {
28 const x = props.value;
29 return x;
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-labeled-statement-unconditional-return.js
+1
@@ -1,3 +1,4 @@
1 +// @validateExhaustiveMemoizationDependencies:false
2 function Component(props) {
3 const x = useMemo(() => {
4 label: {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-logical.expect.md
+2
@@ -2,6 +2,7 @@
2 ## Input
3
4 ```javascript
5 +// @validateExhaustiveMemoizationDependencies:false
6 function Component(props) {
7 const x = useMemo(() => props.a && props.b);
8 return x;
@@ -18,6 +19,7 @@ export const FIXTURE_ENTRYPOINT = {
19 ## Code
20
21 ```javascript
22 +// @validateExhaustiveMemoizationDependencies:false
23 function Component(props) {
24 const x = props.a && props.b;
25 return x;
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-logical.js
+1
@@ -1,3 +1,4 @@
1 +// @validateExhaustiveMemoizationDependencies:false
2 function Component(props) {
3 const x = useMemo(() => props.a && props.b);
4 return x;
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-mabye-modified-free-variable-dont-preserve-memoization-guarantees.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @enablePreserveExistingMemoizationGuarantees:false
5 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
6 import {useMemo} from 'react';
7 import {identity, makeObject_Primitives, mutate, useHook} from 'shared-runtime';
8
@@ -36,7 +36,7 @@ export const FIXTURE_ENTRYPOINT = {
36 ## Code
37
38 ```javascript
39 -// @enablePreserveExistingMemoizationGuarantees:false
39 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
40 import { useMemo } from "react";
41 import {
42 identity,
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-mabye-modified-free-variable-dont-preserve-memoization-guarantees.js
+1 -1
@@ -1,4 +1,4 @@
1 -// @enablePreserveExistingMemoizationGuarantees:false
1 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
2 import {useMemo} from 'react';
3 import {identity, makeObject_Primitives, mutate, useHook} from 'shared-runtime';
4
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-multiple-if-else.expect.md
+2 -1
@@ -2,6 +2,7 @@
2 ## Input
3
4 ```javascript
5 +// @validateExhaustiveMemoizationDependencies:false
6 import {useMemo} from 'react';
7
8 function Component(props) {
@@ -29,7 +30,7 @@ export const FIXTURE_ENTRYPOINT = {
30 ## Code
31
32 ```javascript
32 -import { c as _c } from "react/compiler-runtime";
33 +import { c as _c } from "react/compiler-runtime"; // @validateExhaustiveMemoizationDependencies:false
34 import { useMemo } from "react";
35
36 function Component(props) {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-multiple-if-else.js
+1
@@ -1,3 +1,4 @@
1 +// @validateExhaustiveMemoizationDependencies:false
2 import {useMemo} from 'react';
3
4 function Component(props) {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-nested-ifs.expect.md
+2
@@ -2,6 +2,7 @@
2 ## Input
3
4 ```javascript
5 +// @validateExhaustiveMemoizationDependencies:false
6 function Component(props) {
7 const x = useMemo(() => {
8 if (props.cond) {
@@ -24,6 +25,7 @@ export const FIXTURE_ENTRYPOINT = {
25 ## Code
26
27 ```javascript
28 +// @validateExhaustiveMemoizationDependencies:false
29 function Component(props) {
30 let t0;
31 bb0: {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-nested-ifs.js
+1
@@ -1,3 +1,4 @@
1 +// @validateExhaustiveMemoizationDependencies:false
2 function Component(props) {
3 const x = useMemo(() => {
4 if (props.cond) {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-switch-no-fallthrough.expect.md
+2
@@ -2,6 +2,7 @@
2 ## Input
3
4 ```javascript
5 +// @validateExhaustiveMemoizationDependencies:false
6 function Component(props) {
7 const x = useMemo(() => {
8 switch (props.key) {
@@ -27,6 +28,7 @@ export const FIXTURE_ENTRYPOINT = {
28 ## Code
29
30 ```javascript
31 +// @validateExhaustiveMemoizationDependencies:false
32 function Component(props) {
33 let t0;
34 bb0: switch (props.key) {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-switch-no-fallthrough.js
+1
@@ -1,3 +1,4 @@
1 +// @validateExhaustiveMemoizationDependencies:false
2 function Component(props) {
3 const x = useMemo(() => {
4 switch (props.key) {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-switch-return.expect.md
+2
@@ -2,6 +2,7 @@
2 ## Input
3
4 ```javascript
5 +// @validateExhaustiveMemoizationDependencies:false
6 function Component(props) {
7 const x = useMemo(() => {
8 let y;
@@ -33,6 +34,7 @@ export const FIXTURE_ENTRYPOINT = {
34 ## Code
35
36 ```javascript
37 +// @validateExhaustiveMemoizationDependencies:false
38 function Component(props) {
39 let t0;
40 bb0: {
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-switch-return.js
+1
@@ -1,3 +1,4 @@
1 +// @validateExhaustiveMemoizationDependencies:false
2 function Component(props) {
3 const x = useMemo(() => {
4 let y;
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-with-optional.expect.md
+2 -2
@@ -2,7 +2,7 @@
2 ## Input
3
4 ```javascript
5 -// @enablePreserveExistingMemoizationGuarantees:false
5 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
6 import {useMemo} from 'react';
7 function Component(props) {
8 return (
@@ -22,7 +22,7 @@ export const FIXTURE_ENTRYPOINT = {
22 ## Code
23
24 ```javascript
25 -import { c as _c } from "react/compiler-runtime"; // @enablePreserveExistingMemoizationGuarantees:false
25 +import { c as _c } from "react/compiler-runtime"; // @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
26 import { useMemo } from "react";
27 function Component(props) {
28 const $ = _c(2);
compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-with-optional.js
+1 -1
@@ -1,4 +1,4 @@
1 -// @enablePreserveExistingMemoizationGuarantees:false
1 +// @enablePreserveExistingMemoizationGuarantees:false @validateExhaustiveMemoizationDependencies:false
2 import {useMemo} from 'react';
3 function Component(props) {
4 return (