[compiler] Add new ValidateNoVoidUseMemo pass (#33990)

Adds a new validation pass to validate against `useMemo`s that don't
return anything. This usually indicates some kind of "useEffect"-like
code that has side effects that need to be memoized to prevent
overfiring, and is an anti-pattern.

A follow up validation could also look at the return value of `useMemo`s
to see if they are being used.

---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/facebook/react/pull/33990).
* #34022
* #34002
* #34001
* __->__ #33990
* #33989

DiffTrain build for [c60eebffea](https://github.com/facebook/react/commit/c60eebffea94a67f35c6ebbf7019e5b2145d4284)
This commit is contained in:
poteto
2025-07-28 10:00:02 -07:00
parent b723ffdb55
commit cf7bb43316
35 changed files with 193 additions and 88 deletions
+107 -2
View File
@@ -30734,6 +30734,7 @@ const EnvironmentConfigSchema = zod.z.object({
hookPattern: zod.z.string().nullable().default(null),
enableTreatRefLikeIdentifiersAsRefs: zod.z.boolean().default(false),
lowerContextAccess: ExternalFunctionSchema.nullable().default(null),
validateNoVoidUseMemo: zod.z.boolean().default(false),
});
class Environment {
constructor(scope, fnType, compilerMode, config, contextIdentifiers, parentFunction, logger, filename, code, programContext) {
@@ -43754,7 +43755,7 @@ function collectMaybeMemoDependencies(value, maybeDeps, optional) {
}
return null;
}
function collectTemporaries(instr, env, sidemap) {
function collectTemporaries$1(instr, env, sidemap) {
const { value, lvalue } = instr;
switch (value.kind) {
case 'FunctionExpression': {
@@ -43945,7 +43946,7 @@ function dropManualMemoization(func) {
}
}
else {
collectTemporaries(instr, func.env, sidemap);
collectTemporaries$1(instr, func.env, sidemap);
}
}
}
@@ -47617,6 +47618,107 @@ function visit(identifiers, place, kind) {
identifiers.set(place.identifier.id, { place, kind });
}
function validateNoVoidUseMemo(fn) {
const errors = new CompilerError();
const sidemap = {
useMemoHooks: new Map(),
funcExprs: new Map(),
react: new Set(),
};
for (const [, block] of fn.body.blocks) {
for (const instr of block.instructions) {
collectTemporaries(instr, fn.env, sidemap);
}
}
for (const [, block] of fn.body.blocks) {
for (const instr of block.instructions) {
if (instr.value.kind === 'CallExpression') {
const callee = instr.value.callee.identifier;
const useMemoHook = sidemap.useMemoHooks.get(callee.id);
if (useMemoHook !== undefined && instr.value.args.length > 0) {
const firstArg = instr.value.args[0];
if (firstArg.kind !== 'Identifier') {
continue;
}
let funcToCheck = sidemap.funcExprs.get(firstArg.identifier.id);
if (!funcToCheck) {
for (const [, searchBlock] of fn.body.blocks) {
for (const searchInstr of searchBlock.instructions) {
if (searchInstr.lvalue &&
searchInstr.lvalue.identifier.id === firstArg.identifier.id &&
searchInstr.value.kind === 'FunctionExpression') {
funcToCheck = searchInstr.value;
break;
}
}
if (funcToCheck)
break;
}
}
if (funcToCheck) {
const hasReturn = checkFunctionHasNonVoidReturn(funcToCheck.loweredFunc.func);
if (!hasReturn) {
errors.push({
severity: ErrorSeverity.InvalidReact,
reason: `React Compiler has skipped optimizing this component because ${useMemoHook.name} doesn't return a value. ${useMemoHook.name} should only be used for memoizing values, not running arbitrary side effects.`,
loc: useMemoHook.loc,
suggestions: null,
description: null,
});
}
}
}
}
}
}
return errors.asResult();
}
function checkFunctionHasNonVoidReturn(func) {
for (const [, block] of func.body.blocks) {
if (block.terminal.kind === 'return') {
if (block.terminal.returnVariant === 'Explicit' ||
block.terminal.returnVariant === 'Implicit') {
return true;
}
}
}
return false;
}
function collectTemporaries(instr, env, sidemap) {
const { value, lvalue } = instr;
switch (value.kind) {
case 'FunctionExpression': {
sidemap.funcExprs.set(lvalue.identifier.id, value);
break;
}
case 'LoadGlobal': {
const global = env.getGlobalDeclaration(value.binding, value.loc);
const hookKind = global !== null ? getHookKindForType(env, global) : null;
if (hookKind === 'useMemo') {
sidemap.useMemoHooks.set(lvalue.identifier.id, {
name: value.binding.name,
loc: instr.loc,
});
}
else if (value.binding.name === 'React') {
sidemap.react.add(lvalue.identifier.id);
}
break;
}
case 'PropertyLoad': {
if (sidemap.react.has(value.object.identifier.id)) {
if (value.property === 'useMemo') {
sidemap.useMemoHooks.set(lvalue.identifier.id, {
name: value.property,
loc: instr.loc,
});
}
}
break;
}
}
}
function computeUnconditionalBlocks(fn) {
const unconditionalBlocks = new Set();
const dominators = computePostDominatorTree(fn, {
@@ -50709,6 +50811,9 @@ function runWithEnvironment(func, env) {
log({ kind: 'hir', name: 'PruneMaybeThrows', value: hir });
validateContextVariableLValues(hir);
validateUseMemo(hir).unwrap();
if (env.config.validateNoVoidUseMemo) {
validateNoVoidUseMemo(hir).unwrap();
}
if (env.isInferredMemoEnabled &&
!env.config.enablePreserveExistingManualUseMemo &&
!env.config.disableMemoizationForDebugging &&
+1 -1
View File
@@ -1 +1 @@
5dd622eabe38e01781b3699d0d81c4a16e302f09
c60eebffea94a67f35c6ebbf7019e5b2145d4284
+1 -1
View File
@@ -1 +1 @@
5dd622eabe38e01781b3699d0d81c4a16e302f09
c60eebffea94a67f35c6ebbf7019e5b2145d4284
+1 -1
View File
@@ -1434,7 +1434,7 @@ __DEV__ &&
exports.useTransition = function () {
return resolveDispatcher().useTransition();
};
exports.version = "19.2.0-www-classic-5dd622ea-20250728";
exports.version = "19.2.0-www-classic-c60eebff-20250728";
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
"function" ===
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&
+1 -1
View File
@@ -1434,7 +1434,7 @@ __DEV__ &&
exports.useTransition = function () {
return resolveDispatcher().useTransition();
};
exports.version = "19.2.0-www-modern-5dd622ea-20250728";
exports.version = "19.2.0-www-modern-c60eebff-20250728";
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
"function" ===
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&
+1 -1
View File
@@ -610,4 +610,4 @@ exports.useSyncExternalStore = function (
exports.useTransition = function () {
return ReactSharedInternals.H.useTransition();
};
exports.version = "19.2.0-www-classic-5dd622ea-20250728";
exports.version = "19.2.0-www-classic-c60eebff-20250728";
+1 -1
View File
@@ -610,4 +610,4 @@ exports.useSyncExternalStore = function (
exports.useTransition = function () {
return ReactSharedInternals.H.useTransition();
};
exports.version = "19.2.0-www-modern-5dd622ea-20250728";
exports.version = "19.2.0-www-modern-c60eebff-20250728";
@@ -614,7 +614,7 @@ exports.useSyncExternalStore = function (
exports.useTransition = function () {
return ReactSharedInternals.H.useTransition();
};
exports.version = "19.2.0-www-classic-5dd622ea-20250728";
exports.version = "19.2.0-www-classic-c60eebff-20250728";
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
"function" ===
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&
@@ -614,7 +614,7 @@ exports.useSyncExternalStore = function (
exports.useTransition = function () {
return ReactSharedInternals.H.useTransition();
};
exports.version = "19.2.0-www-modern-5dd622ea-20250728";
exports.version = "19.2.0-www-modern-c60eebff-20250728";
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
"function" ===
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&
@@ -19305,10 +19305,10 @@ __DEV__ &&
(function () {
var internals = {
bundleType: 1,
version: "19.2.0-www-classic-5dd622ea-20250728",
version: "19.2.0-www-classic-c60eebff-20250728",
rendererPackageName: "react-art",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-www-classic-5dd622ea-20250728"
reconcilerVersion: "19.2.0-www-classic-c60eebff-20250728"
};
internals.overrideHookState = overrideHookState;
internals.overrideHookStateDeletePath = overrideHookStateDeletePath;
@@ -19342,7 +19342,7 @@ __DEV__ &&
exports.Shape = Shape;
exports.Surface = Surface;
exports.Text = Text;
exports.version = "19.2.0-www-classic-5dd622ea-20250728";
exports.version = "19.2.0-www-classic-c60eebff-20250728";
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
"function" ===
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&
+3 -3
View File
@@ -19076,10 +19076,10 @@ __DEV__ &&
(function () {
var internals = {
bundleType: 1,
version: "19.2.0-www-modern-5dd622ea-20250728",
version: "19.2.0-www-modern-c60eebff-20250728",
rendererPackageName: "react-art",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-www-modern-5dd622ea-20250728"
reconcilerVersion: "19.2.0-www-modern-c60eebff-20250728"
};
internals.overrideHookState = overrideHookState;
internals.overrideHookStateDeletePath = overrideHookStateDeletePath;
@@ -19113,7 +19113,7 @@ __DEV__ &&
exports.Shape = Shape;
exports.Surface = Surface;
exports.Text = Text;
exports.version = "19.2.0-www-modern-5dd622ea-20250728";
exports.version = "19.2.0-www-modern-c60eebff-20250728";
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
"function" ===
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&
@@ -11305,10 +11305,10 @@ var slice = Array.prototype.slice,
})(React.Component);
var internals$jscomp$inline_1610 = {
bundleType: 0,
version: "19.2.0-www-classic-5dd622ea-20250728",
version: "19.2.0-www-classic-c60eebff-20250728",
rendererPackageName: "react-art",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-www-classic-5dd622ea-20250728"
reconcilerVersion: "19.2.0-www-classic-c60eebff-20250728"
};
if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
var hook$jscomp$inline_1611 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
@@ -11334,4 +11334,4 @@ exports.RadialGradient = RadialGradient;
exports.Shape = TYPES.SHAPE;
exports.Surface = Surface;
exports.Text = Text;
exports.version = "19.2.0-www-classic-5dd622ea-20250728";
exports.version = "19.2.0-www-classic-c60eebff-20250728";
@@ -11017,10 +11017,10 @@ var slice = Array.prototype.slice,
})(React.Component);
var internals$jscomp$inline_1583 = {
bundleType: 0,
version: "19.2.0-www-modern-5dd622ea-20250728",
version: "19.2.0-www-modern-c60eebff-20250728",
rendererPackageName: "react-art",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-www-modern-5dd622ea-20250728"
reconcilerVersion: "19.2.0-www-modern-c60eebff-20250728"
};
if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
var hook$jscomp$inline_1584 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
@@ -11046,4 +11046,4 @@ exports.RadialGradient = RadialGradient;
exports.Shape = TYPES.SHAPE;
exports.Surface = Surface;
exports.Text = Text;
exports.version = "19.2.0-www-modern-5dd622ea-20250728";
exports.version = "19.2.0-www-modern-c60eebff-20250728";
@@ -31754,11 +31754,11 @@ __DEV__ &&
return_targetInst = null;
(function () {
var isomorphicReactPackageVersion = React.version;
if ("19.2.0-www-classic-5dd622ea-20250728" !== isomorphicReactPackageVersion)
if ("19.2.0-www-classic-c60eebff-20250728" !== 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-www-classic-5dd622ea-20250728\nLearn more: https://react.dev/warnings/version-mismatch")
"\n - react-dom: 19.2.0-www-classic-c60eebff-20250728\nLearn more: https://react.dev/warnings/version-mismatch")
);
})();
("function" === typeof Map &&
@@ -31801,10 +31801,10 @@ __DEV__ &&
!(function () {
var internals = {
bundleType: 1,
version: "19.2.0-www-classic-5dd622ea-20250728",
version: "19.2.0-www-classic-c60eebff-20250728",
rendererPackageName: "react-dom",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-www-classic-5dd622ea-20250728"
reconcilerVersion: "19.2.0-www-classic-c60eebff-20250728"
};
internals.overrideHookState = overrideHookState;
internals.overrideHookStateDeletePath = overrideHookStateDeletePath;
@@ -32404,7 +32404,7 @@ __DEV__ &&
exports.useFormStatus = function () {
return resolveDispatcher().useHostTransitionStatus();
};
exports.version = "19.2.0-www-classic-5dd622ea-20250728";
exports.version = "19.2.0-www-classic-c60eebff-20250728";
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
"function" ===
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&
+5 -5
View File
@@ -31539,11 +31539,11 @@ __DEV__ &&
return_targetInst = null;
(function () {
var isomorphicReactPackageVersion = React.version;
if ("19.2.0-www-modern-5dd622ea-20250728" !== isomorphicReactPackageVersion)
if ("19.2.0-www-modern-c60eebff-20250728" !== 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-www-modern-5dd622ea-20250728\nLearn more: https://react.dev/warnings/version-mismatch")
"\n - react-dom: 19.2.0-www-modern-c60eebff-20250728\nLearn more: https://react.dev/warnings/version-mismatch")
);
})();
("function" === typeof Map &&
@@ -31586,10 +31586,10 @@ __DEV__ &&
!(function () {
var internals = {
bundleType: 1,
version: "19.2.0-www-modern-5dd622ea-20250728",
version: "19.2.0-www-modern-c60eebff-20250728",
rendererPackageName: "react-dom",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-www-modern-5dd622ea-20250728"
reconcilerVersion: "19.2.0-www-modern-c60eebff-20250728"
};
internals.overrideHookState = overrideHookState;
internals.overrideHookStateDeletePath = overrideHookStateDeletePath;
@@ -32189,7 +32189,7 @@ __DEV__ &&
exports.useFormStatus = function () {
return resolveDispatcher().useHostTransitionStatus();
};
exports.version = "19.2.0-www-modern-5dd622ea-20250728";
exports.version = "19.2.0-www-modern-c60eebff-20250728";
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
"function" ===
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&
@@ -19564,14 +19564,14 @@ function getCrossOriginStringAs(as, input) {
}
var isomorphicReactPackageVersion$jscomp$inline_2069 = React.version;
if (
"19.2.0-www-classic-5dd622ea-20250728" !==
"19.2.0-www-classic-c60eebff-20250728" !==
isomorphicReactPackageVersion$jscomp$inline_2069
)
throw Error(
formatProdErrorMessage(
527,
isomorphicReactPackageVersion$jscomp$inline_2069,
"19.2.0-www-classic-5dd622ea-20250728"
"19.2.0-www-classic-c60eebff-20250728"
)
);
Internals.findDOMNode = function (componentOrElement) {
@@ -19589,10 +19589,10 @@ Internals.Events = [
];
var internals$jscomp$inline_2682 = {
bundleType: 0,
version: "19.2.0-www-classic-5dd622ea-20250728",
version: "19.2.0-www-classic-c60eebff-20250728",
rendererPackageName: "react-dom",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-www-classic-5dd622ea-20250728"
reconcilerVersion: "19.2.0-www-classic-c60eebff-20250728"
};
if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
var hook$jscomp$inline_2683 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
@@ -20004,4 +20004,4 @@ exports.useFormState = function (action, initialState, permalink) {
exports.useFormStatus = function () {
return ReactSharedInternals.H.useHostTransitionStatus();
};
exports.version = "19.2.0-www-classic-5dd622ea-20250728";
exports.version = "19.2.0-www-classic-c60eebff-20250728";
@@ -19293,14 +19293,14 @@ function getCrossOriginStringAs(as, input) {
}
var isomorphicReactPackageVersion$jscomp$inline_2059 = React.version;
if (
"19.2.0-www-modern-5dd622ea-20250728" !==
"19.2.0-www-modern-c60eebff-20250728" !==
isomorphicReactPackageVersion$jscomp$inline_2059
)
throw Error(
formatProdErrorMessage(
527,
isomorphicReactPackageVersion$jscomp$inline_2059,
"19.2.0-www-modern-5dd622ea-20250728"
"19.2.0-www-modern-c60eebff-20250728"
)
);
Internals.findDOMNode = function (componentOrElement) {
@@ -19318,10 +19318,10 @@ Internals.Events = [
];
var internals$jscomp$inline_2664 = {
bundleType: 0,
version: "19.2.0-www-modern-5dd622ea-20250728",
version: "19.2.0-www-modern-c60eebff-20250728",
rendererPackageName: "react-dom",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-www-modern-5dd622ea-20250728"
reconcilerVersion: "19.2.0-www-modern-c60eebff-20250728"
};
if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
var hook$jscomp$inline_2665 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
@@ -19733,4 +19733,4 @@ exports.useFormState = function (action, initialState, permalink) {
exports.useFormStatus = function () {
return ReactSharedInternals.H.useHostTransitionStatus();
};
exports.version = "19.2.0-www-modern-5dd622ea-20250728";
exports.version = "19.2.0-www-modern-c60eebff-20250728";
@@ -21572,14 +21572,14 @@ function getCrossOriginStringAs(as, input) {
}
var isomorphicReactPackageVersion$jscomp$inline_2315 = React.version;
if (
"19.2.0-www-classic-5dd622ea-20250728" !==
"19.2.0-www-classic-c60eebff-20250728" !==
isomorphicReactPackageVersion$jscomp$inline_2315
)
throw Error(
formatProdErrorMessage(
527,
isomorphicReactPackageVersion$jscomp$inline_2315,
"19.2.0-www-classic-5dd622ea-20250728"
"19.2.0-www-classic-c60eebff-20250728"
)
);
Internals.findDOMNode = function (componentOrElement) {
@@ -21597,10 +21597,10 @@ Internals.Events = [
];
var internals$jscomp$inline_2317 = {
bundleType: 0,
version: "19.2.0-www-classic-5dd622ea-20250728",
version: "19.2.0-www-classic-c60eebff-20250728",
rendererPackageName: "react-dom",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-www-classic-5dd622ea-20250728"
reconcilerVersion: "19.2.0-www-classic-c60eebff-20250728"
};
enableSchedulingProfiler &&
((internals$jscomp$inline_2317.getLaneLabelMap = getLaneLabelMap),
@@ -22015,7 +22015,7 @@ exports.useFormState = function (action, initialState, permalink) {
exports.useFormStatus = function () {
return ReactSharedInternals.H.useHostTransitionStatus();
};
exports.version = "19.2.0-www-classic-5dd622ea-20250728";
exports.version = "19.2.0-www-classic-c60eebff-20250728";
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
"function" ===
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&
@@ -21366,14 +21366,14 @@ function getCrossOriginStringAs(as, input) {
}
var isomorphicReactPackageVersion$jscomp$inline_2305 = React.version;
if (
"19.2.0-www-modern-5dd622ea-20250728" !==
"19.2.0-www-modern-c60eebff-20250728" !==
isomorphicReactPackageVersion$jscomp$inline_2305
)
throw Error(
formatProdErrorMessage(
527,
isomorphicReactPackageVersion$jscomp$inline_2305,
"19.2.0-www-modern-5dd622ea-20250728"
"19.2.0-www-modern-c60eebff-20250728"
)
);
Internals.findDOMNode = function (componentOrElement) {
@@ -21391,10 +21391,10 @@ Internals.Events = [
];
var internals$jscomp$inline_2307 = {
bundleType: 0,
version: "19.2.0-www-modern-5dd622ea-20250728",
version: "19.2.0-www-modern-c60eebff-20250728",
rendererPackageName: "react-dom",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-www-modern-5dd622ea-20250728"
reconcilerVersion: "19.2.0-www-modern-c60eebff-20250728"
};
enableSchedulingProfiler &&
((internals$jscomp$inline_2307.getLaneLabelMap = getLaneLabelMap),
@@ -21809,7 +21809,7 @@ exports.useFormState = function (action, initialState, permalink) {
exports.useFormStatus = function () {
return ReactSharedInternals.H.useHostTransitionStatus();
};
exports.version = "19.2.0-www-modern-5dd622ea-20250728";
exports.version = "19.2.0-www-modern-c60eebff-20250728";
"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ &&
"function" ===
typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop &&
@@ -10155,5 +10155,5 @@ __DEV__ &&
'The server used "renderToString" which does not support Suspense. If you intended for this Suspense boundary to render the fallback content on the server consider throwing an Error somewhere within the Suspense boundary. If you intended to have the server wait for the suspended component please switch to "renderToReadableStream" which supports Suspense on the server'
);
};
exports.version = "19.2.0-www-classic-5dd622ea-20250728";
exports.version = "19.2.0-www-classic-c60eebff-20250728";
})();
@@ -10084,5 +10084,5 @@ __DEV__ &&
'The server used "renderToString" which does not support Suspense. If you intended for this Suspense boundary to render the fallback content on the server consider throwing an Error somewhere within the Suspense boundary. If you intended to have the server wait for the suspended component please switch to "renderToReadableStream" which supports Suspense on the server'
);
};
exports.version = "19.2.0-www-modern-5dd622ea-20250728";
exports.version = "19.2.0-www-modern-c60eebff-20250728";
})();
@@ -6886,4 +6886,4 @@ exports.renderToString = function (children, options) {
'The server used "renderToString" which does not support Suspense. If you intended for this Suspense boundary to render the fallback content on the server consider throwing an Error somewhere within the Suspense boundary. If you intended to have the server wait for the suspended component please switch to "renderToReadableStream" which supports Suspense on the server'
);
};
exports.version = "19.2.0-www-classic-5dd622ea-20250728";
exports.version = "19.2.0-www-classic-c60eebff-20250728";
@@ -6819,4 +6819,4 @@ exports.renderToString = function (children, options) {
'The server used "renderToString" which does not support Suspense. If you intended for this Suspense boundary to render the fallback content on the server consider throwing an Error somewhere within the Suspense boundary. If you intended to have the server wait for the suspended component please switch to "renderToReadableStream" which supports Suspense on the server'
);
};
exports.version = "19.2.0-www-modern-5dd622ea-20250728";
exports.version = "19.2.0-www-modern-c60eebff-20250728";
@@ -32075,11 +32075,11 @@ __DEV__ &&
return_targetInst = null;
(function () {
var isomorphicReactPackageVersion = React.version;
if ("19.2.0-www-classic-5dd622ea-20250728" !== isomorphicReactPackageVersion)
if ("19.2.0-www-classic-c60eebff-20250728" !== 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-www-classic-5dd622ea-20250728\nLearn more: https://react.dev/warnings/version-mismatch")
"\n - react-dom: 19.2.0-www-classic-c60eebff-20250728\nLearn more: https://react.dev/warnings/version-mismatch")
);
})();
("function" === typeof Map &&
@@ -32122,10 +32122,10 @@ __DEV__ &&
!(function () {
var internals = {
bundleType: 1,
version: "19.2.0-www-classic-5dd622ea-20250728",
version: "19.2.0-www-classic-c60eebff-20250728",
rendererPackageName: "react-dom",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-www-classic-5dd622ea-20250728"
reconcilerVersion: "19.2.0-www-classic-c60eebff-20250728"
};
internals.overrideHookState = overrideHookState;
internals.overrideHookStateDeletePath = overrideHookStateDeletePath;
@@ -32891,5 +32891,5 @@ __DEV__ &&
exports.useFormStatus = function () {
return resolveDispatcher().useHostTransitionStatus();
};
exports.version = "19.2.0-www-classic-5dd622ea-20250728";
exports.version = "19.2.0-www-classic-c60eebff-20250728";
})();
@@ -31860,11 +31860,11 @@ __DEV__ &&
return_targetInst = null;
(function () {
var isomorphicReactPackageVersion = React.version;
if ("19.2.0-www-modern-5dd622ea-20250728" !== isomorphicReactPackageVersion)
if ("19.2.0-www-modern-c60eebff-20250728" !== 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-www-modern-5dd622ea-20250728\nLearn more: https://react.dev/warnings/version-mismatch")
"\n - react-dom: 19.2.0-www-modern-c60eebff-20250728\nLearn more: https://react.dev/warnings/version-mismatch")
);
})();
("function" === typeof Map &&
@@ -31907,10 +31907,10 @@ __DEV__ &&
!(function () {
var internals = {
bundleType: 1,
version: "19.2.0-www-modern-5dd622ea-20250728",
version: "19.2.0-www-modern-c60eebff-20250728",
rendererPackageName: "react-dom",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-www-modern-5dd622ea-20250728"
reconcilerVersion: "19.2.0-www-modern-c60eebff-20250728"
};
internals.overrideHookState = overrideHookState;
internals.overrideHookStateDeletePath = overrideHookStateDeletePath;
@@ -32676,5 +32676,5 @@ __DEV__ &&
exports.useFormStatus = function () {
return resolveDispatcher().useHostTransitionStatus();
};
exports.version = "19.2.0-www-modern-5dd622ea-20250728";
exports.version = "19.2.0-www-modern-c60eebff-20250728";
})();
@@ -19880,14 +19880,14 @@ function getCrossOriginStringAs(as, input) {
}
var isomorphicReactPackageVersion$jscomp$inline_2098 = React.version;
if (
"19.2.0-www-classic-5dd622ea-20250728" !==
"19.2.0-www-classic-c60eebff-20250728" !==
isomorphicReactPackageVersion$jscomp$inline_2098
)
throw Error(
formatProdErrorMessage(
527,
isomorphicReactPackageVersion$jscomp$inline_2098,
"19.2.0-www-classic-5dd622ea-20250728"
"19.2.0-www-classic-c60eebff-20250728"
)
);
Internals.findDOMNode = function (componentOrElement) {
@@ -19905,10 +19905,10 @@ Internals.Events = [
];
var internals$jscomp$inline_2716 = {
bundleType: 0,
version: "19.2.0-www-classic-5dd622ea-20250728",
version: "19.2.0-www-classic-c60eebff-20250728",
rendererPackageName: "react-dom",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-www-classic-5dd622ea-20250728"
reconcilerVersion: "19.2.0-www-classic-c60eebff-20250728"
};
if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
var hook$jscomp$inline_2717 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
@@ -20471,4 +20471,4 @@ exports.useFormState = function (action, initialState, permalink) {
exports.useFormStatus = function () {
return ReactSharedInternals.H.useHostTransitionStatus();
};
exports.version = "19.2.0-www-classic-5dd622ea-20250728";
exports.version = "19.2.0-www-classic-c60eebff-20250728";
@@ -19609,14 +19609,14 @@ function getCrossOriginStringAs(as, input) {
}
var isomorphicReactPackageVersion$jscomp$inline_2088 = React.version;
if (
"19.2.0-www-modern-5dd622ea-20250728" !==
"19.2.0-www-modern-c60eebff-20250728" !==
isomorphicReactPackageVersion$jscomp$inline_2088
)
throw Error(
formatProdErrorMessage(
527,
isomorphicReactPackageVersion$jscomp$inline_2088,
"19.2.0-www-modern-5dd622ea-20250728"
"19.2.0-www-modern-c60eebff-20250728"
)
);
Internals.findDOMNode = function (componentOrElement) {
@@ -19634,10 +19634,10 @@ Internals.Events = [
];
var internals$jscomp$inline_2698 = {
bundleType: 0,
version: "19.2.0-www-modern-5dd622ea-20250728",
version: "19.2.0-www-modern-c60eebff-20250728",
rendererPackageName: "react-dom",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-www-modern-5dd622ea-20250728"
reconcilerVersion: "19.2.0-www-modern-c60eebff-20250728"
};
if ("undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {
var hook$jscomp$inline_2699 = __REACT_DEVTOOLS_GLOBAL_HOOK__;
@@ -20200,4 +20200,4 @@ exports.useFormState = function (action, initialState, permalink) {
exports.useFormStatus = function () {
return ReactSharedInternals.H.useHostTransitionStatus();
};
exports.version = "19.2.0-www-modern-5dd622ea-20250728";
exports.version = "19.2.0-www-modern-c60eebff-20250728";
@@ -22132,7 +22132,7 @@ __DEV__ &&
version: rendererVersion,
rendererPackageName: rendererPackageName,
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-www-classic-5dd622ea-20250728"
reconcilerVersion: "19.2.0-www-classic-c60eebff-20250728"
};
null !== extraDevToolsConfig &&
(internals.rendererConfig = extraDevToolsConfig);
@@ -21912,7 +21912,7 @@ __DEV__ &&
version: rendererVersion,
rendererPackageName: rendererPackageName,
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-www-modern-5dd622ea-20250728"
reconcilerVersion: "19.2.0-www-modern-c60eebff-20250728"
};
null !== extraDevToolsConfig &&
(internals.rendererConfig = extraDevToolsConfig);
@@ -14061,7 +14061,7 @@ module.exports = function ($$$config) {
version: rendererVersion,
rendererPackageName: rendererPackageName,
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-www-classic-5dd622ea-20250728"
reconcilerVersion: "19.2.0-www-classic-c60eebff-20250728"
};
null !== extraDevToolsConfig &&
(internals.rendererConfig = extraDevToolsConfig);
@@ -13778,7 +13778,7 @@ module.exports = function ($$$config) {
version: rendererVersion,
rendererPackageName: rendererPackageName,
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-www-modern-5dd622ea-20250728"
reconcilerVersion: "19.2.0-www-modern-c60eebff-20250728"
};
null !== extraDevToolsConfig &&
(internals.rendererConfig = extraDevToolsConfig);
@@ -15433,10 +15433,10 @@ __DEV__ &&
(function () {
var internals = {
bundleType: 1,
version: "19.2.0-www-classic-5dd622ea-20250728",
version: "19.2.0-www-classic-c60eebff-20250728",
rendererPackageName: "react-test-renderer",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-www-classic-5dd622ea-20250728"
reconcilerVersion: "19.2.0-www-classic-c60eebff-20250728"
};
internals.overrideHookState = overrideHookState;
internals.overrideHookStateDeletePath = overrideHookStateDeletePath;
@@ -15571,5 +15571,5 @@ __DEV__ &&
exports.unstable_batchedUpdates = function (fn, a) {
return fn(a);
};
exports.version = "19.2.0-www-classic-5dd622ea-20250728";
exports.version = "19.2.0-www-classic-c60eebff-20250728";
})();
@@ -15433,10 +15433,10 @@ __DEV__ &&
(function () {
var internals = {
bundleType: 1,
version: "19.2.0-www-modern-5dd622ea-20250728",
version: "19.2.0-www-modern-c60eebff-20250728",
rendererPackageName: "react-test-renderer",
currentDispatcherRef: ReactSharedInternals,
reconcilerVersion: "19.2.0-www-modern-5dd622ea-20250728"
reconcilerVersion: "19.2.0-www-modern-c60eebff-20250728"
};
internals.overrideHookState = overrideHookState;
internals.overrideHookStateDeletePath = overrideHookStateDeletePath;
@@ -15571,5 +15571,5 @@ __DEV__ &&
exports.unstable_batchedUpdates = function (fn, a) {
return fn(a);
};
exports.version = "19.2.0-www-modern-5dd622ea-20250728";
exports.version = "19.2.0-www-modern-c60eebff-20250728";
})();
+1 -1
View File
@@ -1 +1 @@
19.2.0-www-classic-5dd622ea-20250728
19.2.0-www-classic-c60eebff-20250728
+1 -1
View File
@@ -1 +1 @@
19.2.0-www-modern-5dd622ea-20250728
19.2.0-www-modern-c60eebff-20250728