[compiler] Allow setStates in use{Layout,Insertion}Effect where the set value is derived from a ref (#34462)

@stipsan found this issue where the compiler would bailout on the
`useLayoutEffect` examples in the React docs. While setState in an
effect is typically an anti-pattern due to the fact that it hurts
performance through cascading renders, the one scenario where it _is_
allowed is if the value being set flows from a ref.

DiffTrain build for [835b00908b](https://github.com/facebook/react/commit/835b00908b1b1c522323162b735a85c5f620ac81)
This commit is contained in:
poteto
2025-09-10 12:07:47 -07:00
parent 97ab71aa8a
commit 0e51ebf78f
26 changed files with 155 additions and 97 deletions
+1 -1
View File
@@ -1 +1 @@
19.2.0-native-fb-acada303-20250909
19.2.0-native-fb-835b0090-20250910
@@ -7,7 +7,7 @@
* @noflow
* @nolint
* @preventMunge
* @generated SignedSource<<5574295a2fffcbdd7216f804329aefa3>>
* @generated SignedSource<<b2691631226587bd56f7870750015714>>
*/
"use strict";
@@ -404,5 +404,5 @@ __DEV__ &&
exports.useFormStatus = function () {
return resolveDispatcher().useHostTransitionStatus();
};
exports.version = "19.2.0-native-fb-acada303-20250909";
exports.version = "19.2.0-native-fb-835b0090-20250910";
})();
@@ -7,7 +7,7 @@
* @noflow
* @nolint
* @preventMunge
* @generated SignedSource<<a7086e3488daef2b3d7a49d9da1c6e6c>>
* @generated SignedSource<<dc1c5597fd5f182b4b4c659ef86a2241>>
*/
"use strict";
@@ -203,4 +203,4 @@ exports.useFormState = function (action, initialState, permalink) {
exports.useFormStatus = function () {
return ReactSharedInternals.H.useHostTransitionStatus();
};
exports.version = "19.2.0-native-fb-acada303-20250909";
exports.version = "19.2.0-native-fb-835b0090-20250910";
@@ -7,7 +7,7 @@
* @noflow
* @nolint
* @preventMunge
* @generated SignedSource<<a7086e3488daef2b3d7a49d9da1c6e6c>>
* @generated SignedSource<<dc1c5597fd5f182b4b4c659ef86a2241>>
*/
"use strict";
@@ -203,4 +203,4 @@ exports.useFormState = function (action, initialState, permalink) {
exports.useFormStatus = function () {
return ReactSharedInternals.H.useHostTransitionStatus();
};
exports.version = "19.2.0-native-fb-acada303-20250909";
exports.version = "19.2.0-native-fb-835b0090-20250910";
@@ -7,7 +7,7 @@
* @noflow
* @nolint
* @preventMunge
* @generated SignedSource<<db999cfe502a424baf983d833cb52458>>
* @generated SignedSource<<9d91a0cde069dc27743417c82f8e96d7>>
*/
/*
@@ -29580,11 +29580,11 @@ __DEV__ &&
};
(function () {
var isomorphicReactPackageVersion = React.version;
if ("19.2.0-native-fb-acada303-20250909" !== isomorphicReactPackageVersion)
if ("19.2.0-native-fb-835b0090-20250910" !== isomorphicReactPackageVersion)
throw Error(
'Incompatible React versions: The "react" and "react-dom" packages must have the exact same version. Instead got:\n - react: ' +
(isomorphicReactPackageVersion +
"\n - react-dom: 19.2.0-native-fb-acada303-20250909\nLearn more: https://react.dev/warnings/version-mismatch")
"\n - react-dom: 19.2.0-native-fb-835b0090-20250910\nLearn more: https://react.dev/warnings/version-mismatch")
);
})();
("function" === typeof Map &&
@@ -29621,10 +29621,10 @@ __DEV__ &&
!(function () {
var internals = {
bundleType: 1,
version: "19.2.0-native-fb-acada303-20250909",
version: "19.2.0-native-fb-835b0090-20250910",
rendererPackageName: "react-dom",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-native-fb-acada303-20250909"
reconcilerVersion: "19.2.0-native-fb-835b0090-20250910"
};
internals.overrideHookState = overrideHookState;
internals.overrideHookStateDeletePath = overrideHookStateDeletePath;
@@ -29773,5 +29773,5 @@ __DEV__ &&
listenToAllSupportedEvents(container);
return new ReactDOMHydrationRoot(initialChildren);
};
exports.version = "19.2.0-native-fb-acada303-20250909";
exports.version = "19.2.0-native-fb-835b0090-20250910";
})();
@@ -7,7 +7,7 @@
* @noflow
* @nolint
* @preventMunge
* @generated SignedSource<<24bfa27418a31e97d7f5d18c1d78ada9>>
* @generated SignedSource<<a4e72281e6a7cf61e3f582b5817a924b>>
*/
/*
@@ -17388,14 +17388,14 @@ ReactDOMHydrationRoot.prototype.unstable_scheduleHydration = function (target) {
};
var isomorphicReactPackageVersion$jscomp$inline_2057 = React.version;
if (
"19.2.0-native-fb-acada303-20250909" !==
"19.2.0-native-fb-835b0090-20250910" !==
isomorphicReactPackageVersion$jscomp$inline_2057
)
throw Error(
formatProdErrorMessage(
527,
isomorphicReactPackageVersion$jscomp$inline_2057,
"19.2.0-native-fb-acada303-20250909"
"19.2.0-native-fb-835b0090-20250910"
)
);
ReactDOMSharedInternals.findDOMNode = function (componentOrElement) {
@@ -17417,10 +17417,10 @@ ReactDOMSharedInternals.findDOMNode = function (componentOrElement) {
};
var internals$jscomp$inline_2630 = {
bundleType: 0,
version: "19.2.0-native-fb-acada303-20250909",
version: "19.2.0-native-fb-835b0090-20250910",
rendererPackageName: "react-dom",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-native-fb-acada303-20250909"
reconcilerVersion: "19.2.0-native-fb-835b0090-20250910"
};
if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
var hook$jscomp$inline_2631 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
@@ -17527,4 +17527,4 @@ exports.hydrateRoot = function (container, initialChildren, options) {
listenToAllSupportedEvents(container);
return new ReactDOMHydrationRoot(initialChildren);
};
exports.version = "19.2.0-native-fb-acada303-20250909";
exports.version = "19.2.0-native-fb-835b0090-20250910";
@@ -7,7 +7,7 @@
* @noflow
* @nolint
* @preventMunge
* @generated SignedSource<<410c9eb4005371eb2099ccf2ccd79036>>
* @generated SignedSource<<4ef3a4a8b38dd46ebbadde0229d1bef0>>
*/
/*
@@ -19398,14 +19398,14 @@ ReactDOMHydrationRoot.prototype.unstable_scheduleHydration = function (target) {
};
var isomorphicReactPackageVersion$jscomp$inline_2308 = React.version;
if (
"19.2.0-native-fb-acada303-20250909" !==
"19.2.0-native-fb-835b0090-20250910" !==
isomorphicReactPackageVersion$jscomp$inline_2308
)
throw Error(
formatProdErrorMessage(
527,
isomorphicReactPackageVersion$jscomp$inline_2308,
"19.2.0-native-fb-acada303-20250909"
"19.2.0-native-fb-835b0090-20250910"
)
);
ReactDOMSharedInternals.findDOMNode = function (componentOrElement) {
@@ -19427,10 +19427,10 @@ ReactDOMSharedInternals.findDOMNode = function (componentOrElement) {
};
var internals$jscomp$inline_2315 = {
bundleType: 0,
version: "19.2.0-native-fb-acada303-20250909",
version: "19.2.0-native-fb-835b0090-20250910",
rendererPackageName: "react-dom",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-native-fb-acada303-20250909",
reconcilerVersion: "19.2.0-native-fb-835b0090-20250910",
getLaneLabelMap: function () {
for (
var map = new Map(), lane = 1, index$324 = 0;
@@ -19553,4 +19553,4 @@ exports.hydrateRoot = function (container, initialChildren, options) {
listenToAllSupportedEvents(container);
return new ReactDOMHydrationRoot(initialChildren);
};
exports.version = "19.2.0-native-fb-acada303-20250909";
exports.version = "19.2.0-native-fb-835b0090-20250910";
@@ -7,7 +7,7 @@
* @noflow
* @nolint
* @preventMunge
* @generated SignedSource<<0aa22a809d1bf5ee48537bd1f47d39b6>>
* @generated SignedSource<<cbcb999bbf26ed9dbf441e6a4f38413b>>
*/
/*
@@ -29636,11 +29636,11 @@ __DEV__ &&
};
(function () {
var isomorphicReactPackageVersion = React.version;
if ("19.2.0-native-fb-acada303-20250909" !== isomorphicReactPackageVersion)
if ("19.2.0-native-fb-835b0090-20250910" !== isomorphicReactPackageVersion)
throw Error(
'Incompatible React versions: The "react" and "react-dom" packages must have the exact same version. Instead got:\n - react: ' +
(isomorphicReactPackageVersion +
"\n - react-dom: 19.2.0-native-fb-acada303-20250909\nLearn more: https://react.dev/warnings/version-mismatch")
"\n - react-dom: 19.2.0-native-fb-835b0090-20250910\nLearn more: https://react.dev/warnings/version-mismatch")
);
})();
("function" === typeof Map &&
@@ -29677,10 +29677,10 @@ __DEV__ &&
!(function () {
var internals = {
bundleType: 1,
version: "19.2.0-native-fb-acada303-20250909",
version: "19.2.0-native-fb-835b0090-20250910",
rendererPackageName: "react-dom",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-native-fb-acada303-20250909"
reconcilerVersion: "19.2.0-native-fb-835b0090-20250910"
};
internals.overrideHookState = overrideHookState;
internals.overrideHookStateDeletePath = overrideHookStateDeletePath;
@@ -30145,7 +30145,7 @@ __DEV__ &&
exports.useFormStatus = function () {
return resolveDispatcher().useHostTransitionStatus();
};
exports.version = "19.2.0-native-fb-acada303-20250909";
exports.version = "19.2.0-native-fb-835b0090-20250910";
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
"function" ===
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&
@@ -7,7 +7,7 @@
* @noflow
* @nolint
* @preventMunge
* @generated SignedSource<<1c441878bcb6366039b2be6739fa9e9a>>
* @generated SignedSource<<03d550cef6e9a60aa89139a94ac7fd6c>>
*/
/*
@@ -17399,14 +17399,14 @@ ReactDOMHydrationRoot.prototype.unstable_scheduleHydration = function (target) {
};
var isomorphicReactPackageVersion$jscomp$inline_2058 = React.version;
if (
"19.2.0-native-fb-acada303-20250909" !==
"19.2.0-native-fb-835b0090-20250910" !==
isomorphicReactPackageVersion$jscomp$inline_2058
)
throw Error(
formatProdErrorMessage(
527,
isomorphicReactPackageVersion$jscomp$inline_2058,
"19.2.0-native-fb-acada303-20250909"
"19.2.0-native-fb-835b0090-20250910"
)
);
ReactDOMSharedInternals.findDOMNode = function (componentOrElement) {
@@ -17428,10 +17428,10 @@ ReactDOMSharedInternals.findDOMNode = function (componentOrElement) {
};
var internals$jscomp$inline_2633 = {
bundleType: 0,
version: "19.2.0-native-fb-acada303-20250909",
version: "19.2.0-native-fb-835b0090-20250910",
rendererPackageName: "react-dom",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-native-fb-acada303-20250909"
reconcilerVersion: "19.2.0-native-fb-835b0090-20250910"
};
if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
var hook$jscomp$inline_2634 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
@@ -17691,4 +17691,4 @@ exports.useFormState = function (action, initialState, permalink) {
exports.useFormStatus = function () {
return ReactSharedInternals.H.useHostTransitionStatus();
};
exports.version = "19.2.0-native-fb-acada303-20250909";
exports.version = "19.2.0-native-fb-835b0090-20250910";
@@ -7,7 +7,7 @@
* @noflow
* @nolint
* @preventMunge
* @generated SignedSource<<0d4ea1a53add816963156d530eff95a8>>
* @generated SignedSource<<68da7ccc89e191ec0b030d1fd2c5799c>>
*/
/*
@@ -19413,14 +19413,14 @@ ReactDOMHydrationRoot.prototype.unstable_scheduleHydration = function (target) {
};
var isomorphicReactPackageVersion$jscomp$inline_2309 = React.version;
if (
"19.2.0-native-fb-acada303-20250909" !==
"19.2.0-native-fb-835b0090-20250910" !==
isomorphicReactPackageVersion$jscomp$inline_2309
)
throw Error(
formatProdErrorMessage(
527,
isomorphicReactPackageVersion$jscomp$inline_2309,
"19.2.0-native-fb-acada303-20250909"
"19.2.0-native-fb-835b0090-20250910"
)
);
ReactDOMSharedInternals.findDOMNode = function (componentOrElement) {
@@ -19442,10 +19442,10 @@ ReactDOMSharedInternals.findDOMNode = function (componentOrElement) {
};
var internals$jscomp$inline_2316 = {
bundleType: 0,
version: "19.2.0-native-fb-acada303-20250909",
version: "19.2.0-native-fb-835b0090-20250910",
rendererPackageName: "react-dom",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-native-fb-acada303-20250909",
reconcilerVersion: "19.2.0-native-fb-835b0090-20250910",
getLaneLabelMap: function () {
for (
var map = new Map(), lane = 1, index$324 = 0;
@@ -19721,7 +19721,7 @@ exports.useFormState = function (action, initialState, permalink) {
exports.useFormStatus = function () {
return ReactSharedInternals.H.useHostTransitionStatus();
};
exports.version = "19.2.0-native-fb-acada303-20250909";
exports.version = "19.2.0-native-fb-835b0090-20250910";
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
"function" ===
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&
@@ -7,7 +7,7 @@
* @noflow
* @nolint
* @preventMunge
* @generated SignedSource<<c63be7ce3c0b49edbe6e932969f4be23>>
* @generated SignedSource<<beaa9189864fb897412c71bf963a34ea>>
*/
"use strict";
@@ -15881,10 +15881,10 @@ __DEV__ &&
(function () {
var internals = {
bundleType: 1,
version: "19.2.0-native-fb-acada303-20250909",
version: "19.2.0-native-fb-835b0090-20250910",
rendererPackageName: "react-test-renderer",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-native-fb-acada303-20250909"
reconcilerVersion: "19.2.0-native-fb-835b0090-20250910"
};
internals.overrideHookState = overrideHookState;
internals.overrideHookStateDeletePath = overrideHookStateDeletePath;
@@ -16029,5 +16029,5 @@ __DEV__ &&
flushSyncWorkAcrossRoots_impl(0, !0));
}
};
exports.version = "19.2.0-native-fb-acada303-20250909";
exports.version = "19.2.0-native-fb-835b0090-20250910";
})();
@@ -7,7 +7,7 @@
* @noflow
* @nolint
* @preventMunge
* @generated SignedSource<<6025031dfbbde4eb834234dcea614c3d>>
* @generated SignedSource<<ba17dfb6062d83fb4f7d4fc004c5d4a7>>
*/
"use strict";
@@ -10045,10 +10045,10 @@ function wrapFiber(fiber) {
}
var internals$jscomp$inline_1469 = {
bundleType: 0,
version: "19.2.0-native-fb-acada303-20250909",
version: "19.2.0-native-fb-835b0090-20250910",
rendererPackageName: "react-test-renderer",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-native-fb-acada303-20250909"
reconcilerVersion: "19.2.0-native-fb-835b0090-20250910"
};
if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
var hook$jscomp$inline_1470 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
@@ -10184,4 +10184,4 @@ exports.unstable_batchedUpdates = function (fn, a) {
flushSyncWorkAcrossRoots_impl(0, !0));
}
};
exports.version = "19.2.0-native-fb-acada303-20250909";
exports.version = "19.2.0-native-fb-835b0090-20250910";
@@ -7,7 +7,7 @@
* @noflow
* @nolint
* @preventMunge
* @generated SignedSource<<3d64f0c5c793946b8bfa35f57fb62814>>
* @generated SignedSource<<dcd25c2dfe176203be91d2c21e25705f>>
*/
"use strict";
@@ -10666,10 +10666,10 @@ function wrapFiber(fiber) {
}
var internals$jscomp$inline_1260 = {
bundleType: 0,
version: "19.2.0-native-fb-acada303-20250909",
version: "19.2.0-native-fb-835b0090-20250910",
rendererPackageName: "react-test-renderer",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-native-fb-acada303-20250909",
reconcilerVersion: "19.2.0-native-fb-835b0090-20250910",
getLaneLabelMap: function () {
for (
var map = new Map(), lane = 1, index$145 = 0;
@@ -10820,4 +10820,4 @@ exports.unstable_batchedUpdates = function (fn, a) {
flushSyncWorkAcrossRoots_impl(0, !0));
}
};
exports.version = "19.2.0-native-fb-acada303-20250909";
exports.version = "19.2.0-native-fb-835b0090-20250910";
@@ -7,7 +7,7 @@
* @noflow
* @nolint
* @preventMunge
* @generated SignedSource<<46aa73f9986563db3a3ec38bb2ea0c94>>
* @generated SignedSource<<77d9678d80ba13d3eb9f952d0562960e>>
*/
"use strict";
@@ -1397,7 +1397,7 @@ __DEV__ &&
exports.useTransition = function () {
return resolveDispatcher().useTransition();
};
exports.version = "19.2.0-native-fb-acada303-20250909";
exports.version = "19.2.0-native-fb-835b0090-20250910";
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
"function" ===
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&
@@ -7,7 +7,7 @@
* @noflow
* @nolint
* @preventMunge
* @generated SignedSource<<7e1a50827d8c57dccdd0e26fa2363fe4>>
* @generated SignedSource<<feec0ed83dce15f3e8755f884cbc1f23>>
*/
"use strict";
@@ -579,4 +579,4 @@ exports.useSyncExternalStore = function (
exports.useTransition = function () {
return ReactSharedInternals.H.useTransition();
};
exports.version = "19.2.0-native-fb-acada303-20250909";
exports.version = "19.2.0-native-fb-835b0090-20250910";
@@ -7,7 +7,7 @@
* @noflow
* @nolint
* @preventMunge
* @generated SignedSource<<aa3ffa43acf0b7f157bee35b73f8e0cf>>
* @generated SignedSource<<1cafd6f445556f46867ede44906e7236>>
*/
"use strict";
@@ -583,7 +583,7 @@ exports.useSyncExternalStore = function (
exports.useTransition = function () {
return ReactSharedInternals.H.useTransition();
};
exports.version = "19.2.0-native-fb-acada303-20250909";
exports.version = "19.2.0-native-fb-835b0090-20250910";
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
"function" ===
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&
@@ -1 +1 @@
acada3035fe2a0dacfafc0ad78914e77d11fb823
835b00908b1b1c522323162b735a85c5f620ac81
@@ -7,7 +7,7 @@
* @noflow
* @nolint
* @preventMunge
* @generated SignedSource<<dd4aefc182db4ed5aff5343b4d5573b6>>
* @generated SignedSource<<fcb8a346357214f631894fd244f26b57>>
*/
"use strict";
@@ -19705,10 +19705,10 @@ __DEV__ &&
(function () {
var internals = {
bundleType: 1,
version: "19.2.0-native-fb-acada303-20250909",
version: "19.2.0-native-fb-835b0090-20250910",
rendererPackageName: "react-native-renderer",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-native-fb-acada303-20250909"
reconcilerVersion: "19.2.0-native-fb-835b0090-20250910"
};
null !== extraDevToolsConfig &&
(internals.rendererConfig = extraDevToolsConfig);
@@ -7,7 +7,7 @@
* @noflow
* @nolint
* @preventMunge
* @generated SignedSource<<e751d22b76ced019d12b0deaf16d2f49>>
* @generated SignedSource<<9a97146561f7308719fa052542d23c69>>
*/
"use strict";
@@ -11211,10 +11211,10 @@ batchedUpdatesImpl = function (fn, a) {
var roots = new Map(),
internals$jscomp$inline_1281 = {
bundleType: 0,
version: "19.2.0-native-fb-acada303-20250909",
version: "19.2.0-native-fb-835b0090-20250910",
rendererPackageName: "react-native-renderer",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-native-fb-acada303-20250909"
reconcilerVersion: "19.2.0-native-fb-835b0090-20250910"
};
null !== extraDevToolsConfig &&
(internals$jscomp$inline_1281.rendererConfig = extraDevToolsConfig);
@@ -7,7 +7,7 @@
* @noflow
* @nolint
* @preventMunge
* @generated SignedSource<<81a0c91c74a9851d37293e0e45f92570>>
* @generated SignedSource<<bf8e6c712611037c82ffaf56a0d6d0a8>>
*/
"use strict";
@@ -13162,10 +13162,10 @@ batchedUpdatesImpl = function (fn, a) {
var roots = new Map(),
internals$jscomp$inline_1525 = {
bundleType: 0,
version: "19.2.0-native-fb-acada303-20250909",
version: "19.2.0-native-fb-835b0090-20250910",
rendererPackageName: "react-native-renderer",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-native-fb-acada303-20250909"
reconcilerVersion: "19.2.0-native-fb-835b0090-20250910"
};
null !== extraDevToolsConfig &&
(internals$jscomp$inline_1525.rendererConfig = extraDevToolsConfig);
@@ -7,7 +7,7 @@
* @noflow
* @nolint
* @preventMunge
* @generated SignedSource<<b15c0be08aa09092a957cc81f4cb8eb2>>
* @generated SignedSource<<524fc0b78d985c6dc3831481e4e9e566>>
*/
"use strict";
@@ -19985,11 +19985,11 @@ __DEV__ &&
shouldSuspendImpl = newShouldSuspendImpl;
};
var isomorphicReactPackageVersion = React.version;
if ("19.2.0-native-fb-acada303-20250909" !== isomorphicReactPackageVersion)
if ("19.2.0-native-fb-835b0090-20250910" !== isomorphicReactPackageVersion)
throw Error(
'Incompatible React versions: The "react" and "react-native-renderer" packages must have the exact same version. Instead got:\n - react: ' +
(isomorphicReactPackageVersion +
"\n - react-native-renderer: 19.2.0-native-fb-acada303-20250909\nLearn more: https://react.dev/warnings/version-mismatch")
"\n - react-native-renderer: 19.2.0-native-fb-835b0090-20250910\nLearn more: https://react.dev/warnings/version-mismatch")
);
if (
"function" !==
@@ -20015,10 +20015,10 @@ __DEV__ &&
(function () {
var internals = {
bundleType: 1,
version: "19.2.0-native-fb-acada303-20250909",
version: "19.2.0-native-fb-835b0090-20250910",
rendererPackageName: "react-native-renderer",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-native-fb-acada303-20250909"
reconcilerVersion: "19.2.0-native-fb-835b0090-20250910"
};
null !== extraDevToolsConfig &&
(internals.rendererConfig = extraDevToolsConfig);
@@ -7,7 +7,7 @@
* @noflow
* @nolint
* @preventMunge
* @generated SignedSource<<20ae2fb92edbed5348ff2f63c998aba1>>
* @generated SignedSource<<309b6979c94c6cd4c463c883a3b9a192>>
*/
"use strict";
@@ -11370,11 +11370,11 @@ function updateContainer(element, container, parentComponent, callback) {
return lane;
}
var isomorphicReactPackageVersion = React.version;
if ("19.2.0-native-fb-acada303-20250909" !== isomorphicReactPackageVersion)
if ("19.2.0-native-fb-835b0090-20250910" !== isomorphicReactPackageVersion)
throw Error(
'Incompatible React versions: The "react" and "react-native-renderer" packages must have the exact same version. Instead got:\n - react: ' +
(isomorphicReactPackageVersion +
"\n - react-native-renderer: 19.2.0-native-fb-acada303-20250909\nLearn more: https://react.dev/warnings/version-mismatch")
"\n - react-native-renderer: 19.2.0-native-fb-835b0090-20250910\nLearn more: https://react.dev/warnings/version-mismatch")
);
if (
"function" !==
@@ -11424,10 +11424,10 @@ batchedUpdatesImpl = function (fn, a) {
var roots = new Map(),
internals$jscomp$inline_1312 = {
bundleType: 0,
version: "19.2.0-native-fb-acada303-20250909",
version: "19.2.0-native-fb-835b0090-20250910",
rendererPackageName: "react-native-renderer",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-native-fb-acada303-20250909"
reconcilerVersion: "19.2.0-native-fb-835b0090-20250910"
};
null !== extraDevToolsConfig &&
(internals$jscomp$inline_1312.rendererConfig = extraDevToolsConfig);
@@ -7,7 +7,7 @@
* @noflow
* @nolint
* @preventMunge
* @generated SignedSource<<2f17e647accea17be3d1a72a0145339f>>
* @generated SignedSource<<c82cb3a6cc7a6f1330976e34d727e42f>>
*/
"use strict";
@@ -13311,11 +13311,11 @@ function updateContainer(element, container, parentComponent, callback) {
return lane;
}
var isomorphicReactPackageVersion = React.version;
if ("19.2.0-native-fb-acada303-20250909" !== isomorphicReactPackageVersion)
if ("19.2.0-native-fb-835b0090-20250910" !== isomorphicReactPackageVersion)
throw Error(
'Incompatible React versions: The "react" and "react-native-renderer" packages must have the exact same version. Instead got:\n - react: ' +
(isomorphicReactPackageVersion +
"\n - react-native-renderer: 19.2.0-native-fb-acada303-20250909\nLearn more: https://react.dev/warnings/version-mismatch")
"\n - react-native-renderer: 19.2.0-native-fb-835b0090-20250910\nLearn more: https://react.dev/warnings/version-mismatch")
);
if (
"function" !==
@@ -13365,10 +13365,10 @@ batchedUpdatesImpl = function (fn, a) {
var roots = new Map(),
internals$jscomp$inline_1556 = {
bundleType: 0,
version: "19.2.0-native-fb-acada303-20250909",
version: "19.2.0-native-fb-835b0090-20250910",
rendererPackageName: "react-native-renderer",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-native-fb-acada303-20250909"
reconcilerVersion: "19.2.0-native-fb-835b0090-20250910"
};
null !== extraDevToolsConfig &&
(internals$jscomp$inline_1556.rendererConfig = extraDevToolsConfig);
@@ -12,7 +12,7 @@
* @lightSyntaxTransform
* @preventMunge
* @oncall react_core
* @generated SignedSource<<d1a4a4ca9738d7c1b3ac9a79a7d0b9a8>>
* @generated SignedSource<<d663b270cebf5545630af438e4010831>>
*/
'use strict';
@@ -32145,6 +32145,7 @@ const EnvironmentConfigSchema = zod.z.object({
lowerContextAccess: ExternalFunctionSchema.nullable().default(null),
validateNoVoidUseMemo: zod.z.boolean().default(false),
validateNoDynamicallyCreatedComponentsOrHooks: zod.z.boolean().default(false),
enableAllowSetStateFromRefsInEffects: zod.z.boolean().default(true),
});
class Environment {
constructor(scope, fnType, compilerMode, config, contextIdentifiers, parentFunction, logger, filename, code, programContext) {
@@ -50580,7 +50581,7 @@ function emitArrayInstr(elements, env) {
return arrayInstr;
}
function validateNoSetStateInEffects(fn) {
function validateNoSetStateInEffects(fn, env) {
const setStateFunctions = new Map();
const errors = new CompilerError();
for (const [, block] of fn.body.blocks) {
@@ -50602,7 +50603,7 @@ function validateNoSetStateInEffects(fn) {
case 'FunctionExpression': {
if ([...eachInstructionValueOperand(instr.value)].some(operand => isSetStateType(operand.identifier) ||
setStateFunctions.has(operand.identifier.id))) {
const callee = getSetStateCall(instr.value.loweredFunc.func, setStateFunctions);
const callee = getSetStateCall(instr.value.loweredFunc.func, setStateFunctions, env);
if (callee !== null) {
setStateFunctions.set(instr.lvalue.identifier.id, callee);
}
@@ -50646,9 +50647,29 @@ function validateNoSetStateInEffects(fn) {
}
return errors.asResult();
}
function getSetStateCall(fn, setStateFunctions) {
function getSetStateCall(fn, setStateFunctions, env) {
const refDerivedValues = new Set();
const isDerivedFromRef = (place) => {
return (refDerivedValues.has(place.identifier.id) ||
isUseRefType(place.identifier) ||
isRefValueType(place.identifier));
};
for (const [, block] of fn.body.blocks) {
for (const instr of block.instructions) {
if (env.config.enableAllowSetStateFromRefsInEffects) {
const hasRefOperand = Iterable_some(eachInstructionValueOperand(instr.value), isDerivedFromRef);
if (hasRefOperand) {
for (const lvalue of eachInstructionLValue(instr)) {
refDerivedValues.add(lvalue.identifier.id);
}
}
if (instr.value.kind === 'PropertyLoad' &&
instr.value.property === 'current' &&
(isUseRefType(instr.value.object.identifier) ||
isRefValueType(instr.value.object.identifier))) {
refDerivedValues.add(instr.lvalue.identifier.id);
}
}
switch (instr.value.kind) {
case 'LoadLocal': {
if (setStateFunctions.has(instr.value.place.identifier.id)) {
@@ -50667,6 +50688,14 @@ function getSetStateCall(fn, setStateFunctions) {
const callee = instr.value.callee;
if (isSetStateType(callee.identifier) ||
setStateFunctions.has(callee.identifier.id)) {
if (env.config.enableAllowSetStateFromRefsInEffects) {
const arg = instr.value.args.at(0);
if (arg !== undefined &&
arg.kind === 'Identifier' &&
refDerivedValues.has(arg.identifier.id)) {
return null;
}
}
return callee;
}
}
@@ -52130,7 +52159,7 @@ function runWithEnvironment(func, env) {
validateNoDerivedComputationsInEffects(hir);
}
if (env.config.validateNoSetStateInEffects) {
env.logErrors(validateNoSetStateInEffects(hir));
env.logErrors(validateNoSetStateInEffects(hir, env));
}
if (env.config.validateNoJSXInTryStatements) {
env.logErrors(validateNoJSXInTryStatement(hir));
@@ -6,7 +6,7 @@
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
* @generated SignedSource<<90a8f315ff9621e5c0c789808fc69b53>>
* @generated SignedSource<<6130aa4e0aebb8a78493e1f22dcb25e1>>
*/
'use strict';
@@ -31924,6 +31924,7 @@ const EnvironmentConfigSchema = zod.z.object({
lowerContextAccess: ExternalFunctionSchema.nullable().default(null),
validateNoVoidUseMemo: zod.z.boolean().default(false),
validateNoDynamicallyCreatedComponentsOrHooks: zod.z.boolean().default(false),
enableAllowSetStateFromRefsInEffects: zod.z.boolean().default(true),
});
class Environment {
constructor(scope, fnType, compilerMode, config, contextIdentifiers, parentFunction, logger, filename, code, programContext) {
@@ -50359,7 +50360,7 @@ function emitArrayInstr(elements, env) {
return arrayInstr;
}
function validateNoSetStateInEffects(fn) {
function validateNoSetStateInEffects(fn, env) {
const setStateFunctions = new Map();
const errors = new CompilerError();
for (const [, block] of fn.body.blocks) {
@@ -50381,7 +50382,7 @@ function validateNoSetStateInEffects(fn) {
case 'FunctionExpression': {
if ([...eachInstructionValueOperand(instr.value)].some(operand => isSetStateType(operand.identifier) ||
setStateFunctions.has(operand.identifier.id))) {
const callee = getSetStateCall(instr.value.loweredFunc.func, setStateFunctions);
const callee = getSetStateCall(instr.value.loweredFunc.func, setStateFunctions, env);
if (callee !== null) {
setStateFunctions.set(instr.lvalue.identifier.id, callee);
}
@@ -50425,9 +50426,29 @@ function validateNoSetStateInEffects(fn) {
}
return errors.asResult();
}
function getSetStateCall(fn, setStateFunctions) {
function getSetStateCall(fn, setStateFunctions, env) {
const refDerivedValues = new Set();
const isDerivedFromRef = (place) => {
return (refDerivedValues.has(place.identifier.id) ||
isUseRefType(place.identifier) ||
isRefValueType(place.identifier));
};
for (const [, block] of fn.body.blocks) {
for (const instr of block.instructions) {
if (env.config.enableAllowSetStateFromRefsInEffects) {
const hasRefOperand = Iterable_some(eachInstructionValueOperand(instr.value), isDerivedFromRef);
if (hasRefOperand) {
for (const lvalue of eachInstructionLValue(instr)) {
refDerivedValues.add(lvalue.identifier.id);
}
}
if (instr.value.kind === 'PropertyLoad' &&
instr.value.property === 'current' &&
(isUseRefType(instr.value.object.identifier) ||
isRefValueType(instr.value.object.identifier))) {
refDerivedValues.add(instr.lvalue.identifier.id);
}
}
switch (instr.value.kind) {
case 'LoadLocal': {
if (setStateFunctions.has(instr.value.place.identifier.id)) {
@@ -50446,6 +50467,14 @@ function getSetStateCall(fn, setStateFunctions) {
const callee = instr.value.callee;
if (isSetStateType(callee.identifier) ||
setStateFunctions.has(callee.identifier.id)) {
if (env.config.enableAllowSetStateFromRefsInEffects) {
const arg = instr.value.args.at(0);
if (arg !== undefined &&
arg.kind === 'Identifier' &&
refDerivedValues.has(arg.identifier.id)) {
return null;
}
}
return callee;
}
}
@@ -51909,7 +51938,7 @@ function runWithEnvironment(func, env) {
validateNoDerivedComputationsInEffects(hir);
}
if (env.config.validateNoSetStateInEffects) {
env.logErrors(validateNoSetStateInEffects(hir));
env.logErrors(validateNoSetStateInEffects(hir, env));
}
if (env.config.validateNoJSXInTryStatements) {
env.logErrors(validateNoJSXInTryStatement(hir));
@@ -1,7 +1,7 @@
{
"name": "eslint-plugin-react-hooks",
"description": "ESLint rules for React Hooks",
"version": "0.0.0-experimental-acada303-20250909",
"version": "0.0.0-experimental-835b0090-20250910",
"repository": {
"type": "git",
"url": "https://github.com/facebook/react.git",