@@ -324,14 +324,24 @@ function mapChildren<TEl extends object>(
324324 return children
325325}
326326
327- let els_seen = new Set < any > ( )
327+ let els_seen = new Set < object > ( )
328328
329329const make_el_json = < TEl extends object > ( el : TEl , eli : ElementInterface < TEl > ) : Mapped . Owner => ( {
330330 id : get_id_el ( el ) ,
331331 type : NodeType . Element ,
332332 name : eli . getName ( el ) ?? UNKNOWN ,
333333 children : [ ] ,
334334} )
335+ const push_make_el_json = < TEl extends object > (
336+ arr : Mapped . Owner [ ] ,
337+ el : TEl ,
338+ eli : ElementInterface < TEl > ,
339+ ) : Mapped . Owner => {
340+ let el_json = make_el_json ( el , eli )
341+ arr . push ( el_json )
342+ els_seen . add ( el )
343+ return el_json
344+ }
335345
336346function mapOwner < TEl extends object > (
337347 owner : Solid . Owner ,
@@ -408,7 +418,6 @@ function mapOwner<TEl extends object>(
408418 let stack_child_len = 1
409419
410420 while ( stack_child_len > 0 ) {
411-
412421 let child_arr = stack_child_arr [ stack_child_len - 1 ] !
413422 let child_idx = stack_child_idx [ stack_child_len - 1 ] !
414423
@@ -430,13 +439,15 @@ function mapOwner<TEl extends object>(
430439 }
431440
432441 // Don't go over added element children
433- // TODO: add children cap stack
434- if ( stack_child_len - 1 === 0 ) {
442+ if ( stack_child_len === 1 )
435443 continue
436- }
437-
444+
445+ /* Check each element and its children
446+ - not seen -> add it to the owner
447+ - a child of the current child -> add it to the owner
448+ - already seen -> skip it
449+ */
438450 while ( stack_els_len > 0 ) {
439-
440451 let el_arr = stack_els_arr [ stack_els_len - 1 ] !
441452 let el_idx = stack_els_idx [ stack_els_len - 1 ] !
442453 let el_own = stack_els_own [ stack_els_len - 1 ] !
@@ -450,7 +461,7 @@ function mapOwner<TEl extends object>(
450461
451462 let el = el_arr [ el_idx ] !
452463
453- // Child has this element
464+ /* Child has this element */
454465 if ( get_id_el ( el ) === child . id ) {
455466 /*
456467 Push child to the owner
@@ -475,13 +486,9 @@ function mapOwner<TEl extends object>(
475486
476487 /* Not seen yet */
477488 if ( ! els_seen . has ( el ) ) {
478- let el_json = make_el_json ( el , config . eli )
479- el_own . children . push ( el_json )
480- els_seen . add ( el )
481-
482489 stack_els_arr [ stack_els_len ] = config . eli . getChildren ( el )
483490 stack_els_idx [ stack_els_len ] = 0
484- stack_els_own [ stack_els_len ] = el_json
491+ stack_els_own [ stack_els_len ] = push_make_el_json ( el_own . children , el , config . eli )
485492 stack_els_len += 1
486493 }
487494 }
@@ -502,16 +509,12 @@ function mapOwner<TEl extends object>(
502509
503510 let el = el_arr [ el_idx ] !
504511
505- if ( els_seen . has ( el ) ) continue
506-
507- let el_json = make_el_json ( el , config . eli )
508- el_own . children . push ( el_json )
509- els_seen . add ( el )
510-
511- stack_els_arr [ stack_els_len ] = config . eli . getChildren ( el )
512- stack_els_idx [ stack_els_len ] = 0
513- stack_els_own [ stack_els_len ] = el_json
514- stack_els_len += 1
512+ if ( ! els_seen . has ( el ) ) {
513+ stack_els_arr [ stack_els_len ] = config . eli . getChildren ( el )
514+ stack_els_idx [ stack_els_len ] = 0
515+ stack_els_own [ stack_els_len ] = push_make_el_json ( el_own . children , el , config . eli )
516+ stack_els_len += 1
517+ }
515518 }
516519 }
517520
0 commit comments