Files
openclaude/scripts/reactJsxDevRuntimeProductionShim.js
203f05538e fix(build): shim jsxDEV when bundling production React — TUI rendered nothing (#1863)
Since 354feb48 (#1856) mapped react/jsx-dev-runtime to React's production
file, the CLI launched to the startup banner and then rendered no UI at
all — no prompt box, no typing, no visible error.

Root cause: Bun transpiles our JSX with the dev transform (no
NODE_ENV=production at build time), so every JSX callsite compiles to
jsxDEV(). React's react-jsx-dev-runtime.production.js deliberately exports
`jsxDEV: undefined` (production bundles are expected to use the non-dev
transform), so every element creation invoked undefined() and React never
committed a single frame. Nothing surfaced because the failure happens
while building the element tree, before the renderer's error callbacks.

Fix: map react/jsx-dev-runtime to a local shim that dispatches jsxDEV onto
the production jsx/jsxs — the same dispatch React's own dev runtime
performs, minus dev-only validation. The shim's own react/jsx-runtime
import is remapped by the plugin, so the bundle stays all-production
(memory goal of #1856 intact): react, jsx-runtime, reconciler, constants,
and scheduler all resolve to .production.js, with no development copies.

Regression tests (per review) pin the shim's dispatch: jsxDEV must exist,
route to jsx/jsxs on isStaticChildren, pass the key through, re-export the
real Fragment, and produce the standard element shape — compared directly
against the real react/jsx-runtime exports so the tests track React.

Verified live in the TUI (tmux): prompt box renders, typing echoes, slash
menu opens and filters, Esc dismisses; sourcemap shows only production
React modules plus the shim.

Co-authored-by: OpenClaude <openclaude@gitlawb.com>
2026-07-05 21:24:12 +08:00

19 lines
914 B
JavaScript

// React's cjs/react-jsx-dev-runtime.production.js deliberately exports
// `jsxDEV: undefined` — production bundles are expected to compile JSX with
// the non-dev transform. Our CLI build runs Bun's transpiler without
// NODE_ENV=production, so every JSX callsite compiles to a jsxDEV() call.
// Mapping the specifier straight to React's production file therefore left
// the whole UI invoking undefined() and nothing past the startup banner ever
// rendered. Implement jsxDEV in terms of the production jsx/jsxs instead —
// the same dispatch React's own dev runtime performs, minus dev-only
// validation. The extra dev-transform args (source, self) are ignorable.
import { Fragment, jsx, jsxs } from 'react/jsx-runtime'
export { Fragment }
export function jsxDEV(type, config, maybeKey, isStaticChildren) {
return isStaticChildren
? jsxs(type, config, maybeKey)
: jsx(type, config, maybeKey)
}