@@ -43,8 +43,8 @@ export function set_current_each_item(item) {
43
43
* @param {number } flags
44
44
* @param {() => V[] } get_collection
45
45
* @param {null | ((item: V) => string) } get_key
46
- * @param {(anchor: null , item: V, index: import('#client').MaybeSource<number>) => void } render_fn
47
- * @param {null | ((anchor: Node | null ) => void) } fallback_fn
46
+ * @param {(anchor: Node , item: V, index: import('#client').MaybeSource<number>) => void } render_fn
47
+ * @param {null | ((anchor: Node) => void) } fallback_fn
48
48
* @param {typeof reconcile_indexed_array | reconcile_tracked_array } reconcile_fn
49
49
* @returns {void }
50
50
*/
@@ -126,7 +126,7 @@ function each(anchor, flags, get_collection, get_key, render_fn, fallback_fn, re
126
126
}
127
127
128
128
child_anchor = hydrate_anchor ( child_anchor ) ;
129
- b_items [ i ] = create_item ( array [ i ] , keys ?. [ i ] , i , render_fn , flags ) ;
129
+ b_items [ i ] = create_item ( child_anchor , array [ i ] , keys ?. [ i ] , i , render_fn , flags ) ;
130
130
child_anchor = /** @type {Comment } */ ( child_anchor . nextSibling ) ;
131
131
}
132
132
@@ -153,7 +153,7 @@ function each(anchor, flags, get_collection, get_key, render_fn, fallback_fn, re
153
153
resume_effect ( fallback ) ;
154
154
} else {
155
155
fallback = render_effect ( ( ) => {
156
- var dom = fallback_fn ( hydrating ? null : anchor ) ;
156
+ var dom = fallback_fn ( anchor ) ;
157
157
158
158
return ( ) => {
159
159
if ( dom !== undefined ) {
@@ -193,8 +193,8 @@ function each(anchor, flags, get_collection, get_key, render_fn, fallback_fn, re
193
193
* @param {number } flags
194
194
* @param {() => V[] } get_collection
195
195
* @param {null | ((item: V) => string) } get_key
196
- * @param {(anchor: null , item: V, index: import('#client').MaybeSource<number>) => void } render_fn
197
- * @param {null | ((anchor: Node | null ) => void) } [fallback_fn]
196
+ * @param {(anchor: Node , item: V, index: import('#client').MaybeSource<number>) => void } render_fn
197
+ * @param {null | ((anchor: Node) => void) } [fallback_fn]
198
198
* @returns {void }
199
199
*/
200
200
export function each_keyed ( anchor , flags , get_collection , get_key , render_fn , fallback_fn = null ) {
@@ -206,8 +206,8 @@ export function each_keyed(anchor, flags, get_collection, get_key, render_fn, fa
206
206
* @param {Element | Comment } anchor
207
207
* @param {number } flags
208
208
* @param {() => V[] } get_collection
209
- * @param {(anchor: null , item: V, index: import('#client').MaybeSource<number>) => void } render_fn
210
- * @param {null | ((anchor: Node | null ) => void) } [fallback_fn]
209
+ * @param {(anchor: Node , item: V, index: import('#client').MaybeSource<number>) => void } render_fn
210
+ * @param {null | ((anchor: Node) => void) } [fallback_fn]
211
211
* @returns {void }
212
212
*/
213
213
export function each_indexed ( anchor , flags , get_collection , render_fn , fallback_fn = null ) {
@@ -219,7 +219,7 @@ export function each_indexed(anchor, flags, get_collection, render_fn, fallback_
219
219
* @param {Array<V> } array
220
220
* @param {import('#client').EachState } state
221
221
* @param {Element | Comment | Text } anchor
222
- * @param {(anchor: null , item: V, index: number | import('#client').Source<number>) => void } render_fn
222
+ * @param {(anchor: Node , item: V, index: number | import('#client').Source<number>) => void } render_fn
223
223
* @param {number } flags
224
224
* @returns {void }
225
225
*/
@@ -249,9 +249,8 @@ function reconcile_indexed_array(array, state, anchor, render_fn, flags) {
249
249
// add items
250
250
for ( ; i < b ; i += 1 ) {
251
251
value = array [ i ] ;
252
- item = create_item ( value , null , i , render_fn , flags ) ;
252
+ item = create_item ( anchor , value , null , i , render_fn , flags ) ;
253
253
b_items [ i ] = item ;
254
- insert_item ( item , anchor ) ;
255
254
}
256
255
257
256
state . items = b_items ;
@@ -276,7 +275,7 @@ function reconcile_indexed_array(array, state, anchor, render_fn, flags) {
276
275
* @param {Array<V> } array
277
276
* @param {import('#client').EachState } state
278
277
* @param {Element | Comment | Text } anchor
279
- * @param {(anchor: null , item: V, index: number | import('#client').Source<number>) => void } render_fn
278
+ * @param {(anchor: Node , item: V, index: number | import('#client').Source<number>) => void } render_fn
280
279
* @param {number } flags
281
280
* @param {any[] } keys
282
281
* @returns {void }
@@ -327,9 +326,8 @@ function reconcile_tracked_array(array, state, anchor, render_fn, flags, keys) {
327
326
if ( start === a ) {
328
327
// add only
329
328
while ( start < b ) {
330
- item = create_item ( array [ start ] , keys [ start ] , start , render_fn , flags ) ;
329
+ item = create_item ( anchor , array [ start ] , keys [ start ] , start , render_fn , flags ) ;
331
330
b_items [ start ++ ] = item ;
332
- insert_item ( item , anchor ) ;
333
331
}
334
332
} else if ( start === b ) {
335
333
// remove only
@@ -398,20 +396,21 @@ function reconcile_tracked_array(array, state, anchor, render_fn, flags, keys) {
398
396
// working from the back, insert new or moved items
399
397
while ( b -- > start ) {
400
398
index = sources [ b - start ] ;
401
- var insert = index === NEW_ITEM ;
399
+ var should_insert = index === NEW_ITEM ;
402
400
403
- if ( insert ) {
404
- item = create_item ( array [ b ] , keys [ b ] , b , render_fn , flags ) ;
401
+ if ( should_insert ) {
402
+ if ( last_item !== undefined ) anchor = get_first_child ( last_item ) ;
403
+ item = create_item ( anchor , array [ b ] , keys [ b ] , b , render_fn , flags ) ;
405
404
} else {
406
405
item = b_items [ b ] ;
407
406
if ( should_update ) {
408
407
update_item ( item , array [ b ] , b , flags ) ;
409
408
}
410
- }
411
409
412
- if ( insert || ( moved && index !== LIS_ITEM ) ) {
413
- last_sibling = last_item === undefined ? anchor : get_first_child ( last_item ) ;
414
- anchor = insert_item ( item , last_sibling ) ;
410
+ if ( moved && index !== LIS_ITEM ) {
411
+ if ( last_item !== undefined ) anchor = get_first_child ( last_item ) ;
412
+ insert ( /** @type {import('#client').Dom } */ ( item . e . dom ) , anchor ) ;
413
+ }
415
414
}
416
415
417
416
last_item = b_items [ b ] = item ;
@@ -510,16 +509,6 @@ function mark_lis(a) {
510
509
}
511
510
}
512
511
513
- /**
514
- * @param {import('#client').EachItem } item
515
- * @param {Text | Element | Comment } anchor
516
- * @returns {Text | Element | Comment }
517
- */
518
- function insert_item ( item , anchor ) {
519
- var current = /** @type {import('#client').Dom } */ ( item . e . dom ) ;
520
- return insert ( current , anchor ) ;
521
- }
522
-
523
512
/**
524
513
* @param {import('#client').EachItem } item
525
514
* @returns {Text | Element | Comment }
@@ -555,14 +544,15 @@ function update_item(item, value, index, type) {
555
544
556
545
/**
557
546
* @template V
547
+ * @param {Node } anchor
558
548
* @param {V } value
559
549
* @param {unknown } key
560
550
* @param {number } index
561
- * @param {(anchor: null , item: V, index: number | import('#client').Value<number>) => void } render_fn
551
+ * @param {(anchor: Node , item: V, index: number | import('#client').Value<number>) => void } render_fn
562
552
* @param {number } flags
563
553
* @returns {import('#client').EachItem }
564
554
*/
565
- function create_item ( value , key , index , render_fn , flags ) {
555
+ function create_item ( anchor , value , key , index , render_fn , flags ) {
566
556
var each_item_not_reactive = ( flags & EACH_ITEM_REACTIVE ) === 0 ;
567
557
568
558
/** @type {import('#client').EachItem } */
@@ -589,7 +579,7 @@ function create_item(value, key, index, render_fn, flags) {
589
579
current_each_item = item ;
590
580
591
581
item . e = render_effect ( ( ) => {
592
- var dom = render_fn ( null , item . v , item . i ) ;
582
+ var dom = render_fn ( anchor , item . v , item . i ) ;
593
583
594
584
return ( ) => {
595
585
if ( dom !== undefined ) {
0 commit comments