11import React from 'react' ;
22import ReactDOM from 'react-dom/server' ;
33import StaticHtml from './static-html.js' ;
4+ import { incrementId } from './context.js' ;
45
56const slotName = ( str ) => str . trim ( ) . replace ( / [ - _ ] ( [ a - z ] ) / g, ( _ , w ) => w . toUpperCase ( ) ) ;
67const reactTypeof = Symbol . for ( 'react.element' ) ;
@@ -58,6 +59,12 @@ async function getNodeWritable() {
5859}
5960
6061async function renderToStaticMarkup ( Component , props , { default : children , ...slotted } , metadata ) {
62+ let prefix ;
63+ if ( this && this . result ) {
64+ prefix = incrementId ( this . result )
65+ }
66+ const attrs = { prefix } ;
67+
6168 delete props [ 'class' ] ;
6269 const slots = { } ;
6370 for ( const [ key , value ] of Object . entries ( slotted ) ) {
@@ -74,29 +81,33 @@ async function renderToStaticMarkup(Component, props, { default: children, ...sl
7481 newProps . children = React . createElement ( StaticHtml , { value : newChildren } ) ;
7582 }
7683 const vnode = React . createElement ( Component , newProps ) ;
84+ const renderOptions = {
85+ identifierPrefix : prefix
86+ }
7787 let html ;
7888 if ( metadata && metadata . hydrate ) {
7989 if ( 'renderToReadableStream' in ReactDOM ) {
80- html = await renderToReadableStreamAsync ( vnode ) ;
90+ html = await renderToReadableStreamAsync ( vnode , renderOptions ) ;
8191 } else {
82- html = await renderToPipeableStreamAsync ( vnode ) ;
92+ html = await renderToPipeableStreamAsync ( vnode , renderOptions ) ;
8393 }
8494 } else {
8595 if ( 'renderToReadableStream' in ReactDOM ) {
86- html = await renderToReadableStreamAsync ( vnode ) ;
96+ html = await renderToReadableStreamAsync ( vnode , renderOptions ) ;
8797 } else {
88- html = await renderToStaticNodeStreamAsync ( vnode ) ;
98+ html = await renderToStaticNodeStreamAsync ( vnode , renderOptions ) ;
8999 }
90100 }
91- return { html } ;
101+ return { html, attrs } ;
92102}
93103
94- async function renderToPipeableStreamAsync ( vnode ) {
104+ async function renderToPipeableStreamAsync ( vnode , options ) {
95105 const Writable = await getNodeWritable ( ) ;
96106 let html = '' ;
97107 return new Promise ( ( resolve , reject ) => {
98108 let error = undefined ;
99109 let stream = ReactDOM . renderToPipeableStream ( vnode , {
110+ ...options ,
100111 onError ( err ) {
101112 error = err ;
102113 reject ( error ) ;
@@ -118,11 +129,11 @@ async function renderToPipeableStreamAsync(vnode) {
118129 } ) ;
119130}
120131
121- async function renderToStaticNodeStreamAsync ( vnode ) {
132+ async function renderToStaticNodeStreamAsync ( vnode , options ) {
122133 const Writable = await getNodeWritable ( ) ;
123134 let html = '' ;
124135 return new Promise ( ( resolve , reject ) => {
125- let stream = ReactDOM . renderToStaticNodeStream ( vnode ) ;
136+ let stream = ReactDOM . renderToStaticNodeStream ( vnode , options ) ;
126137 stream . on ( 'error' , ( err ) => {
127138 reject ( err ) ;
128139 } ) ;
@@ -164,8 +175,8 @@ async function readResult(stream) {
164175 }
165176}
166177
167- async function renderToReadableStreamAsync ( vnode ) {
168- return await readResult ( await ReactDOM . renderToReadableStream ( vnode ) ) ;
178+ async function renderToReadableStreamAsync ( vnode , options ) {
179+ return await readResult ( await ReactDOM . renderToReadableStream ( vnode , options ) ) ;
169180}
170181
171182export default {
0 commit comments