From 46732f2a83e79378954ceb4ecbddb13968bed355 Mon Sep 17 00:00:00 2001 From: Dipak Halkude Date: Tue, 23 Sep 2025 16:44:20 +0530 Subject: [PATCH] fix(eject): preserve React 17 automatic JSX runtime in Babel config after eject --- packages/react-scripts/scripts/eject.js | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/packages/react-scripts/scripts/eject.js b/packages/react-scripts/scripts/eject.js index 67e2bb71cde..0addfda6ed4 100644 --- a/packages/react-scripts/scripts/eject.js +++ b/packages/react-scripts/scripts/eject.js @@ -237,8 +237,29 @@ prompts({ // Add Babel config console.log(` Adding ${cyan('Babel')} preset`); + // Detect if the new JSX transform is available and prefer it after eject + const hasJsxRuntime = (() => { + if (process.env.DISABLE_NEW_JSX_TRANSFORM === 'true') { + return false; + } + try { + require.resolve('react/jsx-runtime'); + return true; + } catch (e) { + return false; + } + })(); + appPackage.babel = { - presets: ['react-app'], + // Preserve preset with explicit runtime so ejected apps keep working without importing React + presets: [ + [ + 'react-app', + { + runtime: hasJsxRuntime ? 'automatic' : 'classic', + }, + ], + ], }; // Add ESlint config