diff --git a/compiler/packages/babel-plugin-react-compiler/src/HIR/BuildHIR.ts b/compiler/packages/babel-plugin-react-compiler/src/HIR/BuildHIR.ts index d0335fb3a43..cd7d6a7a35b 100644 --- a/compiler/packages/babel-plugin-react-compiler/src/HIR/BuildHIR.ts +++ b/compiler/packages/babel-plugin-react-compiler/src/HIR/BuildHIR.ts @@ -3001,6 +3001,8 @@ function isReorderableExpression( } } } + case 'TSAsExpression': + case 'TSNonNullExpression': case 'TypeCastExpression': { return isReorderableExpression( builder, diff --git a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/ts-as-expression-default-value.expect.md b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/ts-as-expression-default-value.expect.md new file mode 100644 index 00000000000..505224cf9ed --- /dev/null +++ b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/ts-as-expression-default-value.expect.md @@ -0,0 +1,67 @@ + +## Input + +```javascript +type Status = 'pending' | 'success' | 'error'; + +const StatusIndicator = ({status}: {status: Status}) => { + return
Status: {status}
; +}; + +const Component = ({status = 'pending' as Status}) => { + return ; +}; + +export const FIXTURE_ENTRYPOINT = { + fn: Component, + params: [{status: 'success'}], +}; + +``` + +## Code + +```javascript +import { c as _c } from "react/compiler-runtime"; +type Status = "pending" | "success" | "error"; + +const StatusIndicator = (t0) => { + const $ = _c(3); + const { status } = t0; + const t1 = `status-${status}`; + let t2; + if ($[0] !== status || $[1] !== t1) { + t2 =
Status: {status}
; + $[0] = status; + $[1] = t1; + $[2] = t2; + } else { + t2 = $[2]; + } + return t2; +}; + +const Component = (t0) => { + const $ = _c(2); + const { status: t1 } = t0; + const status = t1 === undefined ? ("pending" as Status) : t1; + let t2; + if ($[0] !== status) { + t2 = ; + $[0] = status; + $[1] = t2; + } else { + t2 = $[1]; + } + return t2; +}; + +export const FIXTURE_ENTRYPOINT = { + fn: Component, + params: [{ status: "success" }], +}; + +``` + +### Eval output +(kind: ok)
Status: success
\ No newline at end of file diff --git a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/ts-as-expression-default-value.tsx b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/ts-as-expression-default-value.tsx new file mode 100644 index 00000000000..715efd5bdc8 --- /dev/null +++ b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/ts-as-expression-default-value.tsx @@ -0,0 +1,14 @@ +type Status = 'pending' | 'success' | 'error'; + +const StatusIndicator = ({status}: {status: Status}) => { + return
Status: {status}
; +}; + +const Component = ({status = 'pending' as Status}) => { + return ; +}; + +export const FIXTURE_ENTRYPOINT = { + fn: Component, + params: [{status: 'success'}], +}; diff --git a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/ts-non-null-expression-default-value.expect.md b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/ts-non-null-expression-default-value.expect.md new file mode 100644 index 00000000000..7af6bc996a9 --- /dev/null +++ b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/ts-non-null-expression-default-value.expect.md @@ -0,0 +1,54 @@ + +## Input + +```javascript +const THEME_MAP: ReadonlyMap = new Map([ + ['default', 'light'], + ['dark', 'dark'], +]); + +export const Component = ({theme = THEME_MAP.get('default')!}) => { + return
User preferences
; +}; + +export const FIXTURE_ENTRYPOINT = { + fn: Component, + params: [{status: 'success'}], +}; + +``` + +## Code + +```javascript +import { c as _c } from "react/compiler-runtime"; +const THEME_MAP: ReadonlyMap = new Map([ + ["default", "light"], + ["dark", "dark"], +]); + +export const Component = (t0) => { + const $ = _c(2); + const { theme: t1 } = t0; + const theme = t1 === undefined ? THEME_MAP.get("default") : t1; + const t2 = `theme-${theme}`; + let t3; + if ($[0] !== t2) { + t3 =
User preferences
; + $[0] = t2; + $[1] = t3; + } else { + t3 = $[1]; + } + return t3; +}; + +export const FIXTURE_ENTRYPOINT = { + fn: Component, + params: [{ status: "success" }], +}; + +``` + +### Eval output +(kind: ok)
User preferences
\ No newline at end of file diff --git a/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/ts-non-null-expression-default-value.tsx b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/ts-non-null-expression-default-value.tsx new file mode 100644 index 00000000000..c1d835d6f0f --- /dev/null +++ b/compiler/packages/babel-plugin-react-compiler/src/__tests__/fixtures/compiler/ts-non-null-expression-default-value.tsx @@ -0,0 +1,13 @@ +const THEME_MAP: ReadonlyMap = new Map([ + ['default', 'light'], + ['dark', 'dark'], +]); + +export const Component = ({theme = THEME_MAP.get('default')!}) => { + return
User preferences
; +}; + +export const FIXTURE_ENTRYPOINT = { + fn: Component, + params: [{status: 'success'}], +};