@@ -18,7 +18,9 @@ import {
18
18
NEXT_STATE ,
19
19
RENDER ,
20
20
SKIP_EFFECTS ,
21
- VNODE
21
+ VNODE ,
22
+ PARENT ,
23
+ CHILDREN
22
24
} from './constants' ;
23
25
24
26
/** @typedef {import('preact').VNode } VNode */
@@ -72,7 +74,7 @@ function renderToString(vnode, context, opts) {
72
74
) {
73
75
res = _renderToStringPretty ( vnode , context , opts ) ;
74
76
} else {
75
- res = _renderToString ( vnode , context , false , undefined ) ;
77
+ res = _renderToString ( vnode , context , false , undefined , vnode ) ;
76
78
}
77
79
78
80
// options._commit, we don't schedule any effects in this library right now,
@@ -181,7 +183,7 @@ const isArray = Array.isArray;
181
183
const assign = Object . assign ;
182
184
183
185
/** The default export is an alias of `render()`. */
184
- function _renderToString ( vnode , context , isSvgMode , selectValue ) {
186
+ function _renderToString ( vnode , context , isSvgMode , selectValue , parent ) {
185
187
if ( vnode == null || vnode === true || vnode === false || vnode === '' ) {
186
188
return '' ;
187
189
}
@@ -193,9 +195,15 @@ function _renderToString(vnode, context, isSvgMode, selectValue) {
193
195
194
196
if ( isArray ( vnode ) ) {
195
197
let rendered = '' ;
198
+ parent [ CHILDREN ] = [ ] ;
196
199
for ( let i = 0 ; i < vnode . length ; i ++ ) {
200
+ if ( typeof vnode [ i ] === 'object' && parent ) {
201
+ vnode [ i ] [ PARENT ] = parent ;
202
+ parent [ CHILDREN ] . push ( vnode [ i ] ) ;
203
+ }
197
204
rendered =
198
- rendered + _renderToString ( vnode [ i ] , context , isSvgMode , selectValue ) ;
205
+ rendered +
206
+ _renderToString ( vnode [ i ] , context , isSvgMode , selectValue , parent ) ;
199
207
}
200
208
return rendered ;
201
209
}
@@ -206,12 +214,14 @@ function _renderToString(vnode, context, isSvgMode, selectValue) {
206
214
207
215
// components
208
216
if ( isComponent ) {
217
+ vnode [ PARENT ] = parent ;
209
218
if ( nodeName === Fragment ) {
210
219
return _renderToString (
211
220
vnode . props . children ,
212
221
context ,
213
222
isSvgMode ,
214
- selectValue
223
+ selectValue ,
224
+ vnode
215
225
) ;
216
226
}
217
227
@@ -231,7 +241,8 @@ function _renderToString(vnode, context, isSvgMode, selectValue) {
231
241
232
242
if ( options [ DIFFED ] ) options [ DIFFED ] ( vnode ) ;
233
243
234
- return _renderToString ( rendered , context , isSvgMode , selectValue ) ;
244
+ vnode [ CHILDREN ] = Array . isArray ( rendered ) ? rendered : [ rendered ] ;
245
+ return _renderToString ( rendered , context , isSvgMode , selectValue , vnode ) ;
235
246
}
236
247
237
248
// render JSX to HTML
@@ -246,36 +257,6 @@ function _renderToString(vnode, context, isSvgMode, selectValue) {
246
257
for ( let name in props ) {
247
258
let v = props [ name ] ;
248
259
249
- // switch (name) {
250
- // case 'className':
251
- // if ('class' in props) continue;
252
- // name = 'class';
253
- // break;
254
- // case 'htmlFor':
255
- // if ('for' in props) continue;
256
- // name = 'for';
257
- // break;
258
- // case 'defaultValue':
259
- // name = 'value';
260
- // break;
261
- // case 'defaultChecked':
262
- // name = 'checked';
263
- // break;
264
- // case 'defaultSelected':
265
- // name = 'selected';
266
- // break;
267
- // case 'key':
268
- // case 'ref':
269
- // case '__self':
270
- // case '__source':
271
- // case 'children':
272
- // continue;
273
- // default:
274
- // if (isSvgMode && XLINK.test(name)) {
275
- // name = name.toLowerCase().replace(/^xlink:?/, 'xlink:');
276
- // }
277
- // }
278
-
279
260
if (
280
261
name === 'key' ||
281
262
name === 'ref' ||
@@ -335,11 +316,6 @@ function _renderToString(vnode, context, isSvgMode, selectValue) {
335
316
let pieces = '' ;
336
317
let hasChildren = false ;
337
318
338
- // let children = isArray(propChildren)
339
- // ? propChildren
340
- // : propChildren != null
341
- // ? [propChildren]
342
- // : undefined;
343
319
if ( html ) {
344
320
// return s + html + '</' + nodeName + '>';
345
321
// s = s + html;
@@ -350,13 +326,24 @@ function _renderToString(vnode, context, isSvgMode, selectValue) {
350
326
pieces = pieces + encodeEntities ( children ) ;
351
327
hasChildren = true ;
352
328
} else if ( isArray ( children ) ) {
329
+ vnode [ CHILDREN ] = [ ] ;
330
+
353
331
for ( let i = 0 ; i < children . length ; i ++ ) {
354
332
let child = children [ i ] ;
355
-
333
+ vnode [ CHILDREN ] . push ( child ) ;
356
334
if ( child != null && child !== false ) {
335
+ if ( typeof child === 'object' ) {
336
+ child [ PARENT ] = vnode ;
337
+ }
357
338
let childSvgMode =
358
339
nodeName === 'svg' || ( nodeName !== 'foreignObject' && isSvgMode ) ;
359
- let ret = _renderToString ( child , context , childSvgMode , selectValue ) ;
340
+ let ret = _renderToString (
341
+ child ,
342
+ context ,
343
+ childSvgMode ,
344
+ selectValue ,
345
+ vnode
346
+ ) ;
360
347
361
348
// Skip if we received an empty string
362
349
if ( ret ) {
@@ -367,9 +354,19 @@ function _renderToString(vnode, context, isSvgMode, selectValue) {
367
354
}
368
355
}
369
356
} else if ( children != null && children !== false && children !== true ) {
357
+ vnode [ CHILDREN ] = [ children ] ;
358
+ if ( typeof children === 'object' ) {
359
+ children [ PARENT ] = vnode ;
360
+ }
370
361
let childSvgMode =
371
362
nodeName === 'svg' || ( nodeName !== 'foreignObject' && isSvgMode ) ;
372
- let ret = _renderToString ( children , context , childSvgMode , selectValue ) ;
363
+ let ret = _renderToString (
364
+ children ,
365
+ context ,
366
+ childSvgMode ,
367
+ selectValue ,
368
+ vnode
369
+ ) ;
373
370
374
371
// Skip if we received an empty string
375
372
if ( ret ) {
0 commit comments