@@ -14,6 +14,9 @@ import {
14
14
DIFF ,
15
15
DIFFED ,
16
16
DIRTY ,
17
+ MODE_ASYNC ,
18
+ MODE_STREAM ,
19
+ MODE_SYNC ,
17
20
NEXT_STATE ,
18
21
PARENT ,
19
22
RENDER ,
@@ -79,7 +82,7 @@ export function renderToString(vnode, context) {
79
82
false ,
80
83
undefined ,
81
84
parent ,
82
- false
85
+ MODE_SYNC
83
86
) ;
84
87
} catch ( e ) {
85
88
if ( e . then ) {
@@ -92,14 +95,57 @@ export function renderToString(vnode, context) {
92
95
}
93
96
}
94
97
95
- const DEFAULT_RENDER_SLOT = ( idx ) =>
96
- `<!--preact-slot:${ idx } --><!--/preact-slot:${ idx } -->` ;
98
+ /**
99
+ * Render Preact JSX + Components to an HTML string.
100
+ * @param {VNode } vnode JSX Element / VNode to render
101
+ * @param {Object } [context={}] Initial root context object
102
+ * @returns {Promise<string> } serialized HTML
103
+ */
104
+ export async function renderToStringAsync ( vnode , context ) {
105
+ const previousSkipEffects = prepare ( ) ;
106
+
107
+ const parent = h ( Fragment , null ) ;
108
+ parent [ CHILDREN ] = [ vnode ] ;
109
+
110
+ try {
111
+ const rendered = _renderToString (
112
+ vnode ,
113
+ context || EMPTY_OBJ ,
114
+ false ,
115
+ undefined ,
116
+ parent ,
117
+ MODE_ASYNC
118
+ ) ;
119
+
120
+ if ( Array . isArray ( rendered ) ) {
121
+ let count = 0 ;
122
+ let resolved = rendered ;
123
+
124
+ // Resolving nested Promises with a maximum depth of 25
125
+ while (
126
+ resolved . some ( ( element ) => typeof element . then === 'function' ) &&
127
+ count ++ < 25
128
+ ) {
129
+ resolved = ( await Promise . all ( resolved ) ) . flat ( ) ;
130
+ }
131
+
132
+ return resolved . join ( '' ) ;
133
+ }
134
+
135
+ return rendered ;
136
+ } finally {
137
+ finalize ( vnode , previousSkipEffects ) ;
138
+ }
139
+ }
140
+
141
+ const DEFAULT_RENDER_SLOT = ( idx , content ) =>
142
+ `<!--p:slot:${ idx } -->${ content } <!--/p:slot:${ idx } -->` ;
97
143
98
144
/**
99
145
* Render Preact JSX + Components to an HTML string.
100
146
* @param {VNode } vnode JSX Element / VNode to render
101
147
* @param {Object } [context={}] Initial root context object
102
- * @param {(idx: number) => string } [renderSlot] Render slot marker
148
+ * @param {(idx: number, content: string ) => string } [renderSlot] Render slot marker
103
149
* @returns {ReadableStream<string>|string } serialized HTML
104
150
*/
105
151
export function renderToStream (
@@ -119,7 +165,7 @@ export function renderToStream(
119
165
false ,
120
166
undefined ,
121
167
parent ,
122
- true
168
+ MODE_STREAM
123
169
) ;
124
170
125
171
if ( Array . isArray ( rendered ) ) {
@@ -180,49 +226,6 @@ export function renderToStream(
180
226
}
181
227
}
182
228
183
- /**
184
- * Render Preact JSX + Components to an HTML string.
185
- * @param {VNode } vnode JSX Element / VNode to render
186
- * @param {Object } [context={}] Initial root context object
187
- * @returns {Promise<string> } serialized HTML
188
- */
189
- export async function renderToStringAsync ( vnode , context ) {
190
- const previousSkipEffects = prepare ( ) ;
191
-
192
- const parent = h ( Fragment , null ) ;
193
- parent [ CHILDREN ] = [ vnode ] ;
194
-
195
- try {
196
- const rendered = _renderToString (
197
- vnode ,
198
- context || EMPTY_OBJ ,
199
- false ,
200
- undefined ,
201
- parent ,
202
- true
203
- ) ;
204
-
205
- if ( Array . isArray ( rendered ) ) {
206
- let count = 0 ;
207
- let resolved = rendered ;
208
-
209
- // Resolving nested Promises with a maximum depth of 25
210
- while (
211
- resolved . some ( ( element ) => typeof element . then === 'function' ) &&
212
- count ++ < 25
213
- ) {
214
- resolved = ( await Promise . all ( resolved ) ) . flat ( ) ;
215
- }
216
-
217
- return resolved . join ( '' ) ;
218
- }
219
-
220
- return rendered ;
221
- } finally {
222
- finalize ( vnode , previousSkipEffects ) ;
223
- }
224
- }
225
-
226
229
// Installed as setState/forceUpdate for function components
227
230
function markAsDirty ( ) {
228
231
this . __d = true ;
@@ -290,6 +293,7 @@ function renderClassComponent(vnode, context) {
290
293
* @param {any } selectValue
291
294
* @param {VNode } parent
292
295
* @param {boolean } asyncMode
296
+ * @param {number } renderMode
293
297
* @returns {string | Promise<string> | (string | Promise<string>)[] }
294
298
*/
295
299
function _renderToString (
@@ -298,7 +302,7 @@ function _renderToString(
298
302
isSvgMode ,
299
303
selectValue ,
300
304
parent ,
301
- asyncMode
305
+ renderMode
302
306
) {
303
307
// Ignore non-rendered VNodes/values
304
308
if ( vnode == null || vnode === true || vnode === false || vnode === '' ) {
@@ -326,7 +330,7 @@ function _renderToString(
326
330
isSvgMode ,
327
331
selectValue ,
328
332
parent ,
329
- asyncMode
333
+ renderMode
330
334
) ;
331
335
332
336
if ( typeof childRender === 'string' ) {
@@ -391,7 +395,7 @@ function _renderToString(
391
395
isSvgMode ,
392
396
selectValue ,
393
397
vnode ,
394
- asyncMode
398
+ renderMode
395
399
) ;
396
400
} else {
397
401
// Values are pre-escaped by the JSX transform
@@ -472,7 +476,7 @@ function _renderToString(
472
476
isSvgMode ,
473
477
selectValue ,
474
478
vnode ,
475
- asyncMode
479
+ renderMode
476
480
) ;
477
481
return str ;
478
482
} catch ( err ) {
@@ -504,7 +508,7 @@ function _renderToString(
504
508
isSvgMode ,
505
509
selectValue ,
506
510
vnode ,
507
- asyncMode
511
+ renderMode
508
512
) ;
509
513
}
510
514
@@ -531,7 +535,7 @@ function _renderToString(
531
535
isSvgMode ,
532
536
selectValue ,
533
537
vnode ,
534
- asyncMode
538
+ renderMode
535
539
) ;
536
540
537
541
try {
@@ -545,10 +549,11 @@ function _renderToString(
545
549
546
550
return str ;
547
551
} catch ( error ) {
548
- if ( ! asyncMode ) throw error ;
552
+ if ( renderMode === MODE_SYNC ) throw error ;
549
553
550
554
if ( ! error || typeof error . then !== 'function' ) throw error ;
551
555
556
+ console . log ( renderMode , error ) ;
552
557
const renderNestedChildren = ( ) => {
553
558
try {
554
559
return renderChildren ( ) ;
@@ -699,7 +704,7 @@ function _renderToString(
699
704
childSvgMode ,
700
705
selectValue ,
701
706
vnode ,
702
- asyncMode
707
+ renderMode
703
708
) ;
704
709
}
705
710
0 commit comments