mirror of
https://github.com/Gitlawb/openclaude.git
synced 2026-08-24 02:34:15 -05:00
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>
19 lines
914 B
JavaScript
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)
|
|
}
|