1+ /* eslint-disable global-require,@typescript-eslint/no-require-imports */
12import type { ReactElement } from 'react' ;
2- import * as ReactDOM from 'react-dom' ;
33import type { RenderReturnType } from './_types.ts' ;
44import { supportsRootApi } from './reactApis.ts' ;
55
@@ -8,26 +8,33 @@ type HydrateOrRenderType = (domNode: Element, reactElement: ReactElement) => Ren
88// TODO: once React dependency is updated to >= 18, we can remove this and just
99// import ReactDOM from 'react-dom/client';
1010let reactDomClient : typeof import ( 'react-dom/client' ) ;
11+ // Can't just import react-dom because that breaks ESM under React 19
12+ let reactDom : typeof import ( 'react-dom' ) ;
1113if ( supportsRootApi ) {
1214 // This will never throw an exception, but it's the way to tell Webpack the dependency is optional
1315 // https://github.com/webpack/webpack/issues/339#issuecomment-47739112
1416 // Unfortunately, it only converts the error to a warning.
1517 try {
16- // eslint-disable-next-line global-require,@typescript-eslint/no-require-imports
1718 reactDomClient = require ( 'react-dom/client' ) as typeof import ( 'react-dom/client' ) ;
1819 } catch ( _e ) {
1920 // We should never get here, but if we do, we'll just use the default ReactDOM
2021 // and live with the warning.
21- reactDomClient = ReactDOM as unknown as typeof import ( 'react-dom/client' ) ;
22+ reactDomClient = require ( 'react-dom' ) as unknown as typeof import ( 'react-dom/client' ) ;
23+ }
24+ } else {
25+ try {
26+ reactDom = require ( 'react-dom' ) as typeof import ( 'react-dom' ) ;
27+ } catch ( _e ) {
28+ // Also should never happen
2229 }
2330}
2431
25- /* eslint-disable react/no-deprecated, @typescript-eslint/no-deprecated,@typescript-eslint/no-non-null-assertion --
32+ /* eslint-disable @typescript-eslint/no-deprecated,@typescript-eslint/no-non-null-assertion --
2633 * while we need to support React 16
2734 */
2835const reactHydrate : HydrateOrRenderType = supportsRootApi
2936 ? reactDomClient ! . hydrateRoot
30- : ( domNode , reactElement ) => ReactDOM . hydrate ( reactElement , domNode ) ;
37+ : ( domNode , reactElement ) => reactDom ! . hydrate ( reactElement , domNode ) ;
3138
3239function reactRender ( domNode : Element , reactElement : ReactElement ) : RenderReturnType {
3340 if ( supportsRootApi ) {
@@ -36,10 +43,9 @@ function reactRender(domNode: Element, reactElement: ReactElement): RenderReturn
3643 return root ;
3744 }
3845
39- // eslint-disable-next-line react/no-render-return-value
40- return ReactDOM . render ( reactElement , domNode ) ;
46+ return reactDom ! . render ( reactElement , domNode ) ;
4147}
42- /* eslint-enable react/no-deprecated, @typescript-eslint/no-deprecated,@typescript-eslint/no-non-null-assertion */
48+ /* eslint-enable @typescript-eslint/no-deprecated,@typescript-eslint/no-non-null-assertion */
4349
4450export default function reactHydrateOrRender (
4551 domNode : Element ,
0 commit comments