diff --git a/compiler/packages/babel-plugin-react-compiler/src/HIR/Environment.ts b/compiler/packages/babel-plugin-react-compiler/src/HIR/Environment.ts index e74fb4a8c1..4188e536a4 100644 --- a/compiler/packages/babel-plugin-react-compiler/src/HIR/Environment.ts +++ b/compiler/packages/babel-plugin-react-compiler/src/HIR/Environment.ts @@ -480,19 +480,28 @@ export function parseConfigPragma(pragma: string): EnvironmentConfig { } if ( - key === "enablePreserveExistingManualUseMemoAsHook" && - (val === undefined || val === "true") + key === "enablePreserveExistingManualUseMemo" && + (val === undefined || val === "true" || val === "scope") ) { - maybeConfig["enablePreserveExistingManualUseMemo"] = "hook"; + maybeConfig[key] = "scope"; + continue; + } + + if (key === "enablePreserveExistingManualUseMemo" && val === "hook") { + maybeConfig[key] = "hook"; continue; } if ( - key === "enablePreserveExistingManualUseMemoAsScope" && - (val === undefined || val === "true") + key === "enablePreserveExistingManualUseMemo" && + !(val === "false" || val === "off") ) { - maybeConfig["enablePreserveExistingManualUseMemo"] = "scope"; - continue; + CompilerError.throwInvalidConfig({ + reason: `Invalid setting '${val}' for 'enablePreserveExistingManualUseMemo'. Valid settings are 'hook', 'scope', or 'off'.`, + description: null, + loc: null, + suggestions: null, + }); } if (typeof defaultConfig[key as keyof EnvironmentConfig] !== "boolean") { diff --git a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-preserve-non-idempotent.expect.md b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-preserve-non-idempotent.expect.md index 87bba8504d..deb36c578b 100644 --- a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-preserve-non-idempotent.expect.md +++ b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-preserve-non-idempotent.expect.md @@ -2,7 +2,7 @@ ## Input ```javascript -// @enablePreserveExistingManualUseMemoAsScope +// @enablePreserveExistingManualUseMemo import { useMemo } from "react"; let cur = 99; function random(id) { @@ -28,7 +28,7 @@ export const FIXTURE_ENTRYPOINT = { ## Code ```javascript -import { c as _c } from "react/compiler-runtime"; // @enablePreserveExistingManualUseMemoAsScope +import { c as _c } from "react/compiler-runtime"; // @enablePreserveExistingManualUseMemo import { useMemo } from "react"; let cur = 99; function random(id) { diff --git a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-preserve-non-idempotent.js b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-preserve-non-idempotent.js index dfe6e8de63..63a5be8eee 100644 --- a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-preserve-non-idempotent.js +++ b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-preserve-non-idempotent.js @@ -1,4 +1,4 @@ -// @enablePreserveExistingManualUseMemoAsScope +// @enablePreserveExistingManualUseMemo import { useMemo } from "react"; let cur = 99; function random(id) { diff --git a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-simple-preserved.expect.md b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-simple-preserved.expect.md index 0a78356a5e..c72e3a140d 100644 --- a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-simple-preserved.expect.md +++ b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-simple-preserved.expect.md @@ -2,7 +2,7 @@ ## Input ```javascript -// @enablePreserveExistingManualUseMemoAsScope +// @enablePreserveExistingManualUseMemo import { useMemo } from "react"; function Component({ a }) { @@ -21,7 +21,7 @@ export const FIXTURE_ENTRYPOINT = { ## Code ```javascript -import { c as _c } from "react/compiler-runtime"; // @enablePreserveExistingManualUseMemoAsScope +import { c as _c } from "react/compiler-runtime"; // @enablePreserveExistingManualUseMemo import { useMemo } from "react"; function Component(t0) { diff --git a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-simple-preserved.js b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-simple-preserved.js index 52a88490f2..a5731f2f09 100644 --- a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-simple-preserved.js +++ b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/useMemo-simple-preserved.js @@ -1,4 +1,4 @@ -// @enablePreserveExistingManualUseMemoAsScope +// @enablePreserveExistingManualUseMemo import { useMemo } from "react"; function Component({ a }) { diff --git a/compiler/packages/snap/src/compiler.ts b/compiler/packages/snap/src/compiler.ts index 889514bd34..8afbecde8a 100644 --- a/compiler/packages/snap/src/compiler.ts +++ b/compiler/packages/snap/src/compiler.ts @@ -141,17 +141,28 @@ function makePluginOptions( }, }; } - if (firstLine.includes("@enablePreserveExistingManualUseMemoAsHook")) { - enablePreserveExistingManualUseMemo = "hook"; - } else if ( - firstLine.includes("@enablePreserveExistingManualUseMemoAsScope") + + const useMemoMatch = /@enablePreserveExistingManualUseMemo:"([^"]+)"/.exec( + firstLine + ); + if ( + useMemoMatch && + (useMemoMatch[1] === "hook" || useMemoMatch[1] === "scope") ) { - enablePreserveExistingManualUseMemo = "scope"; - } else if (firstLine.includes("@enablePreserveExistingManualUseMemo")) { + enablePreserveExistingManualUseMemo = useMemoMatch[1]; + } else if ( + useMemoMatch && + (useMemoMatch[1] === "false" || useMemoMatch[1] === "off") + ) { + enablePreserveExistingManualUseMemo = null; + } else if (useMemoMatch) { throw new Error( - "Use either @enablePreserveExistingManualUseMemoAsScope or @enablePreserveExistingManualUseMemoAsHook" + `Invalid setting '${useMemoMatch[1]}' for 'enablePreserveExistingManualUseMemo'. Valid settings are 'hook', 'scope', or 'off'.` ); + } else if (firstLine.includes("@enablePreserveExistingManualUseMemo")) { + enablePreserveExistingManualUseMemo = "scope"; } + const hookPatternMatch = /@hookPattern:"([^"]+)"/.exec(firstLine); if ( hookPatternMatch &&