From 511f10e4d5c64bb857817eb6a474a3ca352e0da1 Mon Sep 17 00:00:00 2001 From: Lauren Tan Date: Mon, 7 Oct 2024 15:18:21 -0400 Subject: [PATCH 1/4] Update [ghstack-poisoned] --- compiler/packages/snap/src/sprout/evaluator.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/packages/snap/src/sprout/evaluator.ts b/compiler/packages/snap/src/sprout/evaluator.ts index 60da5dc53ce..ee998d6317e 100644 --- a/compiler/packages/snap/src/sprout/evaluator.ts +++ b/compiler/packages/snap/src/sprout/evaluator.ts @@ -282,7 +282,7 @@ export function doEval(source: string): EvaluatorResult { } else { return { kind: "exception", - value: e.message, + value: e.stack, }; } } From 089b882a5c518f108d1985964ff788d60baaeeb7 Mon Sep 17 00:00:00 2001 From: Lauren Tan Date: Mon, 7 Oct 2024 15:18:25 -0400 Subject: [PATCH 2/4] Update [ghstack-poisoned] --- .../src/Entrypoint/Options.ts | 63 +++++++++++++++---- compiler/packages/snap/src/compiler.ts | 21 +++++-- 2 files changed, 65 insertions(+), 19 deletions(-) diff --git a/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Options.ts b/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Options.ts index e9664972565..b092800a2e1 100644 --- a/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Options.ts +++ b/compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Options.ts @@ -14,6 +14,7 @@ import { parseEnvironmentConfig, } from '../HIR/Environment'; import {hasOwnProperty} from '../Utils/utils'; +import {fromZodError} from 'zod-validation-error'; const PanicThresholdOptionsSchema = z.enum([ /* @@ -121,8 +122,19 @@ export type PluginOptions = { * Set this flag (on by default) to automatically check for this library and activate the support. */ enableReanimatedCheck: boolean; + + /** + * The minimum major version of React that the compiler should emit code for. If the target is 19 + * or higher, the compiler emits direct imports of React runtime APIs needed by the compiler. On + * versions prior to 19, an extra runtime package react-compiler-runtime is necessary to provide + * a userspace approximation of runtime APIs. + */ + target: CompilerReactTarget; }; +const CompilerReactTargetSchema = z.enum(['17', '18', '19']); +export type CompilerReactTarget = z.infer; + const CompilationModeSchema = z.enum([ /* * Compiles functions annotated with "use forget" or component/hook-like functions. @@ -210,6 +222,7 @@ export const defaultOptions: PluginOptions = { return filename.indexOf('node_modules') === -1; }, enableReanimatedCheck: true, + target: '19', } as const; export function parsePluginOptions(obj: unknown): PluginOptions { @@ -222,25 +235,49 @@ export function parsePluginOptions(obj: unknown): PluginOptions { // normalize string configs to be case insensitive value = value.toLowerCase(); } - if (key === 'environment') { - const environmentResult = parseEnvironmentConfig(value); - if (environmentResult.isErr()) { - CompilerError.throwInvalidConfig({ - reason: - 'Error in validating environment config. This is an advanced setting and not meant to be used directly', - description: environmentResult.unwrapErr().toString(), - suggestions: null, - loc: null, - }); + if (isCompilerFlag(key)) { + switch (key) { + case 'environment': { + const environmentResult = parseEnvironmentConfig(value); + if (environmentResult.isErr()) { + CompilerError.throwInvalidConfig({ + reason: + 'Error in validating environment config. This is an advanced setting and not meant to be used directly', + description: environmentResult.unwrapErr().toString(), + suggestions: null, + loc: null, + }); + } + parsedOptions[key] = environmentResult.unwrap(); + break; + } + case 'target': { + parsedOptions[key] = parseTargetConfig(value); + break; + } + default: { + parsedOptions[key] = value; + } } - parsedOptions[key] = environmentResult.unwrap(); - } else if (isCompilerFlag(key)) { - parsedOptions[key] = value; } } return {...defaultOptions, ...parsedOptions}; } +export function parseTargetConfig(value: unknown): CompilerReactTarget { + const parsed = CompilerReactTargetSchema.safeParse(value); + if (parsed.success) { + return parsed.data; + } else { + CompilerError.throwInvalidConfig({ + reason: 'Not a valid target', + description: `${fromZodError(parsed.error)}`, + suggestions: null, + loc: null, + }); + } +} + function isCompilerFlag(s: string): s is keyof PluginOptions { return hasOwnProperty(defaultOptions, s); } diff --git a/compiler/packages/snap/src/compiler.ts b/compiler/packages/snap/src/compiler.ts index bbb6aeded75..f38c6f5fc2f 100644 --- a/compiler/packages/snap/src/compiler.ts +++ b/compiler/packages/snap/src/compiler.ts @@ -12,12 +12,12 @@ import * as BabelParser from '@babel/parser'; import {NodePath} from '@babel/traverse'; import * as t from '@babel/types'; import assert from 'assert'; -import type { - CompilationMode, - Logger, - LoggerEvent, - PanicThresholdOptions, - PluginOptions, +import { + type CompilationMode, + type Logger, + type LoggerEvent, + type PanicThresholdOptions, + type PluginOptions, } from 'babel-plugin-react-compiler/src/Entrypoint'; import type {Effect, ValueKind} from 'babel-plugin-react-compiler/src/HIR'; import type { @@ -56,6 +56,7 @@ function makePluginOptions( let enableChangeDetectionForDebugging = null; let customMacros: null | Array = null; let validateBlocklistedImports = null; + let target = '19' as const; if (firstLine.indexOf('@compilationMode(annotation)') !== -1) { assert( @@ -107,6 +108,13 @@ function makePluginOptions( if (runtimeModuleMatch) { runtimeModule = runtimeModuleMatch[1]; } + + const targetMatch = /@target="([^"]+)"/.exec(firstLine); + if (targetMatch) { + // @ts-ignore + target = targetMatch[1]; + } + if (firstLine.includes('@panicThreshold(none)')) { panicThreshold = 'none'; } @@ -248,6 +256,7 @@ function makePluginOptions( flowSuppressions, ignoreUseNoForget, enableReanimatedCheck: false, + target, }; return [options, logs]; } From 52939fa41e0f7a90cc3352e81364da5cad095d68 Mon Sep 17 00:00:00 2001 From: Lauren Tan Date: Mon, 7 Oct 2024 15:20:25 -0400 Subject: [PATCH 3/4] Update [ghstack-poisoned] --- compiler/packages/snap/src/sprout/evaluator.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/packages/snap/src/sprout/evaluator.ts b/compiler/packages/snap/src/sprout/evaluator.ts index ee998d6317e..60da5dc53ce 100644 --- a/compiler/packages/snap/src/sprout/evaluator.ts +++ b/compiler/packages/snap/src/sprout/evaluator.ts @@ -282,7 +282,7 @@ export function doEval(source: string): EvaluatorResult { } else { return { kind: "exception", - value: e.stack, + value: e.message, }; } } From d6b5fa8c8253f421e6fcff7f7ff8f609521c3773 Mon Sep 17 00:00:00 2001 From: Lauren Tan Date: Mon, 7 Oct 2024 15:22:21 -0400 Subject: [PATCH 4/4] Update [ghstack-poisoned] --- compiler/packages/snap/src/compiler.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/compiler/packages/snap/src/compiler.ts b/compiler/packages/snap/src/compiler.ts index f38c6f5fc2f..72212ea0e94 100644 --- a/compiler/packages/snap/src/compiler.ts +++ b/compiler/packages/snap/src/compiler.ts @@ -12,12 +12,12 @@ import * as BabelParser from '@babel/parser'; import {NodePath} from '@babel/traverse'; import * as t from '@babel/types'; import assert from 'assert'; -import { - type CompilationMode, - type Logger, - type LoggerEvent, - type PanicThresholdOptions, - type PluginOptions, +import type { + CompilationMode, + Logger, + LoggerEvent, + PanicThresholdOptions, + PluginOptions, } from 'babel-plugin-react-compiler/src/Entrypoint'; import type {Effect, ValueKind} from 'babel-plugin-react-compiler/src/HIR'; import type {