@askrjs/askr 0.0.35 → 0.0.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/README.md +17 -9
  2. package/dist/bench/components/benchmark-row.js.map +1 -1
  3. package/dist/bench/components/benchmark-table.js +1 -1
  4. package/dist/bench/components/benchmark-table.js.map +1 -1
  5. package/dist/benchmark.js +3 -3
  6. package/dist/benchmark.js.map +1 -1
  7. package/dist/bin/askr-ssg.js.map +1 -1
  8. package/dist/boot/index.d.ts +1 -7
  9. package/dist/boot/index.d.ts.map +1 -1
  10. package/dist/boot/index.js +31 -42
  11. package/dist/boot/index.js.map +1 -1
  12. package/dist/common/control.js.map +1 -1
  13. package/dist/common/env.js.map +1 -1
  14. package/dist/common/ssr-errors.js.map +1 -1
  15. package/dist/common/vnode.js.map +1 -1
  16. package/dist/components/error-boundary.js.map +1 -1
  17. package/dist/components/index.d.ts +2 -0
  18. package/dist/components/index.js +2 -0
  19. package/dist/components/link.d.ts +4 -5
  20. package/dist/components/link.d.ts.map +1 -1
  21. package/dist/components/link.js +2 -1
  22. package/dist/components/link.js.map +1 -1
  23. package/dist/control/case.js.map +1 -1
  24. package/dist/control/for.js.map +1 -1
  25. package/dist/control/shared.js.map +1 -1
  26. package/dist/control/show.js.map +1 -1
  27. package/dist/data/index.d.ts.map +1 -1
  28. package/dist/data/index.js +165 -23
  29. package/dist/data/index.js.map +1 -1
  30. package/dist/dev/invariant.js.map +1 -1
  31. package/dist/dev/logger.js.map +1 -1
  32. package/dist/foundations/icon/icon.d.ts.map +1 -1
  33. package/dist/foundations/icon/icon.js.map +1 -1
  34. package/dist/foundations/icon/icon.types.d.ts +2 -1
  35. package/dist/foundations/icon/icon.types.d.ts.map +1 -1
  36. package/dist/foundations/icon/index.d.ts +3 -0
  37. package/dist/foundations/icon/index.js +2 -0
  38. package/dist/foundations/index.d.ts +1 -18
  39. package/dist/foundations/index.js +2 -18
  40. package/dist/foundations/interactions/dismissable.js.map +1 -1
  41. package/dist/foundations/interactions/focusable.js.map +1 -1
  42. package/dist/foundations/interactions/hoverable.js.map +1 -1
  43. package/dist/foundations/interactions/index.d.ts +7 -0
  44. package/dist/foundations/interactions/index.js +7 -0
  45. package/dist/foundations/interactions/interaction-policy.js +2 -2
  46. package/dist/foundations/interactions/interaction-policy.js.map +1 -1
  47. package/dist/foundations/interactions/pressable.js.map +1 -1
  48. package/dist/foundations/interactions/roving-focus.js.map +1 -1
  49. package/dist/foundations/state/controllable.js.map +1 -1
  50. package/dist/foundations/state/index.d.ts +2 -0
  51. package/dist/foundations/state/index.js +2 -0
  52. package/dist/foundations/structures/collection.js.map +1 -1
  53. package/dist/foundations/structures/index.d.ts +8 -0
  54. package/dist/foundations/structures/index.js +7 -0
  55. package/dist/foundations/structures/layer.js.map +1 -1
  56. package/dist/foundations/structures/layout.js.map +1 -1
  57. package/dist/foundations/structures/portal.js.map +1 -1
  58. package/dist/foundations/structures/presence.js.map +1 -1
  59. package/dist/foundations/structures/slot.js.map +1 -1
  60. package/dist/foundations/utilities/aria.js.map +1 -1
  61. package/dist/foundations/utilities/compose-handlers.js.map +1 -1
  62. package/dist/foundations/utilities/compose-ref.js.map +1 -1
  63. package/dist/foundations/utilities/index.d.ts +7 -0
  64. package/dist/foundations/utilities/index.js +6 -0
  65. package/dist/foundations/utilities/merge-props.js.map +1 -1
  66. package/dist/foundations/utilities/use-id.js.map +1 -1
  67. package/dist/fx/fx.js.map +1 -1
  68. package/dist/fx/timing.js.map +1 -1
  69. package/dist/index.d.ts +2 -16
  70. package/dist/index.js +1 -17
  71. package/dist/index.js.map +1 -1
  72. package/dist/jsx/utils.js.map +1 -1
  73. package/dist/jsx-dev-runtime.d.ts +1 -1
  74. package/dist/jsx-dev-runtime.js.map +1 -1
  75. package/dist/jsx-runtime.d.ts +1 -1
  76. package/dist/jsx-runtime.js.map +1 -1
  77. package/dist/renderer/children.js.map +1 -1
  78. package/dist/renderer/cleanup.js.map +1 -1
  79. package/dist/renderer/dom.js +92 -357
  80. package/dist/renderer/dom.js.map +1 -1
  81. package/dist/renderer/evaluate.js +7 -0
  82. package/dist/renderer/evaluate.js.map +1 -1
  83. package/dist/renderer/fastpath.js +20 -18
  84. package/dist/renderer/fastpath.js.map +1 -1
  85. package/dist/renderer/for-commit.js +486 -0
  86. package/dist/renderer/for-commit.js.map +1 -0
  87. package/dist/renderer/index.js.map +1 -1
  88. package/dist/renderer/keyed.js +84 -23
  89. package/dist/renderer/keyed.js.map +1 -1
  90. package/dist/renderer/reconcile.js +11 -18
  91. package/dist/renderer/reconcile.js.map +1 -1
  92. package/dist/renderer/utils.js +5 -1
  93. package/dist/renderer/utils.js.map +1 -1
  94. package/dist/resources/index.d.ts +1 -2
  95. package/dist/resources/index.js +1 -2
  96. package/dist/router/index.d.ts +2 -2
  97. package/dist/router/index.js +2 -2
  98. package/dist/router/match.js.map +1 -1
  99. package/dist/router/navigate.d.ts.map +1 -1
  100. package/dist/router/navigate.js +4 -2
  101. package/dist/router/navigate.js.map +1 -1
  102. package/dist/router/policy.js.map +1 -1
  103. package/dist/router/route-context.js.map +1 -1
  104. package/dist/router/route.d.ts +1 -1
  105. package/dist/router/route.d.ts.map +1 -1
  106. package/dist/router/route.js +2 -33
  107. package/dist/router/route.js.map +1 -1
  108. package/dist/runtime/child-scope.d.ts +1 -0
  109. package/dist/runtime/child-scope.d.ts.map +1 -1
  110. package/dist/runtime/child-scope.js +2 -0
  111. package/dist/runtime/child-scope.js.map +1 -1
  112. package/dist/runtime/component.js +1 -1
  113. package/dist/runtime/component.js.map +1 -1
  114. package/dist/runtime/context.js.map +1 -1
  115. package/dist/runtime/control.js.map +1 -1
  116. package/dist/runtime/derive.d.ts +2 -1
  117. package/dist/runtime/derive.d.ts.map +1 -1
  118. package/dist/runtime/derive.js +15 -10
  119. package/dist/runtime/derive.js.map +1 -1
  120. package/dist/runtime/dev-namespace.js.map +1 -1
  121. package/dist/runtime/effect.d.ts.map +1 -1
  122. package/dist/runtime/effect.js +34 -9
  123. package/dist/runtime/effect.js.map +1 -1
  124. package/dist/runtime/events.js.map +1 -1
  125. package/dist/runtime/execution-model.js.map +1 -1
  126. package/dist/runtime/fastlane.js.map +1 -1
  127. package/dist/runtime/for-bench.d.ts +1 -1
  128. package/dist/runtime/for-bench.d.ts.map +1 -1
  129. package/dist/runtime/for-bench.js +15 -14
  130. package/dist/runtime/for-bench.js.map +1 -1
  131. package/dist/runtime/for.d.ts +1 -0
  132. package/dist/runtime/for.d.ts.map +1 -1
  133. package/dist/runtime/for.js +90 -31
  134. package/dist/runtime/for.js.map +1 -1
  135. package/dist/runtime/operations.d.ts.map +1 -1
  136. package/dist/runtime/operations.js +10 -8
  137. package/dist/runtime/operations.js.map +1 -1
  138. package/dist/runtime/perf-metrics.js +8 -2
  139. package/dist/runtime/perf-metrics.js.map +1 -1
  140. package/dist/runtime/readable.js.map +1 -1
  141. package/dist/runtime/resource-cell.js +3 -2
  142. package/dist/runtime/resource-cell.js.map +1 -1
  143. package/dist/runtime/scheduler.d.ts +0 -1
  144. package/dist/runtime/scheduler.d.ts.map +1 -1
  145. package/dist/runtime/scheduler.js +6 -19
  146. package/dist/runtime/scheduler.js.map +1 -1
  147. package/dist/runtime/selector.d.ts.map +1 -1
  148. package/dist/runtime/selector.js +182 -103
  149. package/dist/runtime/selector.js.map +1 -1
  150. package/dist/runtime/snapshot-source.d.ts +10 -0
  151. package/dist/runtime/snapshot-source.d.ts.map +1 -0
  152. package/dist/runtime/snapshot-source.js +17 -0
  153. package/dist/runtime/snapshot-source.js.map +1 -0
  154. package/dist/runtime/ssr-bridge.js.map +1 -1
  155. package/dist/runtime/state.d.ts.map +1 -1
  156. package/dist/runtime/state.js +1 -5
  157. package/dist/runtime/state.js.map +1 -1
  158. package/dist/ssg/batch-render.js.map +1 -1
  159. package/dist/ssg/create-static-gen.js.map +1 -1
  160. package/dist/ssg/generate-metadata.js.map +1 -1
  161. package/dist/ssg/incremental-manifest.js.map +1 -1
  162. package/dist/ssg/index.d.ts +1 -6
  163. package/dist/ssg/index.js +1 -6
  164. package/dist/ssg/resolve-ssg-data.js.map +1 -1
  165. package/dist/ssg/route-utils.js.map +1 -1
  166. package/dist/ssg/write-static-files.js.map +1 -1
  167. package/dist/ssr/attrs.js.map +1 -1
  168. package/dist/ssr/context.d.ts +3 -1
  169. package/dist/ssr/context.d.ts.map +1 -1
  170. package/dist/ssr/context.js +31 -11
  171. package/dist/ssr/context.js.map +1 -1
  172. package/dist/ssr/escape.js +56 -16
  173. package/dist/ssr/escape.js.map +1 -1
  174. package/dist/ssr/index.d.ts +2 -31
  175. package/dist/ssr/index.d.ts.map +1 -1
  176. package/dist/ssr/index.js +19 -49
  177. package/dist/ssr/index.js.map +1 -1
  178. package/dist/ssr/render-keys.js +1 -12
  179. package/dist/ssr/render-keys.js.map +1 -1
  180. package/dist/ssr/sink.js.map +1 -1
  181. package/dist/ssr/verify-hydration.js +25 -0
  182. package/dist/ssr/verify-hydration.js.map +1 -0
  183. package/package.json +44 -19
  184. package/dist/_virtual/_rolldown/runtime.js +0 -7
  185. package/dist/foundations/core.d.ts +0 -15
  186. package/dist/foundations/core.js +0 -13
  187. package/dist/foundations/structures.d.ts +0 -7
  188. package/dist/foundations/structures.js +0 -6
  189. package/dist/ssg/batch-render.d.ts +0 -16
  190. package/dist/ssg/batch-render.d.ts.map +0 -1
  191. package/dist/ssg/generate-metadata.d.ts +0 -24
  192. package/dist/ssg/generate-metadata.d.ts.map +0 -1
  193. package/dist/ssg/resolve-ssg-data.d.ts +0 -23
  194. package/dist/ssg/resolve-ssg-data.d.ts.map +0 -1
  195. package/dist/ssg/route-utils.d.ts +0 -16
  196. package/dist/ssg/route-utils.d.ts.map +0 -1
  197. package/dist/ssg/write-static-files.d.ts +0 -15
  198. package/dist/ssg/write-static-files.d.ts.map +0 -1
  199. package/dist/ssr/render-keys.d.ts +0 -37
  200. package/dist/ssr/render-keys.d.ts.map +0 -1
  201. package/dist/ssr/stream-render.js +0 -76
  202. package/dist/ssr/stream-render.js.map +0 -1
@@ -31,6 +31,7 @@ function createForState(eachSource, byFn, renderFn, fallback) {
31
31
  fallbackScope: null,
32
32
  items: /* @__PURE__ */ new Map(),
33
33
  orderedKeys: [],
34
+ orderedItems: [],
34
35
  orderedVNodes: [],
35
36
  byFn,
36
37
  renderFn,
@@ -105,9 +106,11 @@ function createForItemSignal(initialItem) {
105
106
  itemSignal.set = (newValue, notifyReaders = true) => {
106
107
  if (Object.is(itemValue, newValue)) return;
107
108
  itemValue = newValue;
108
- markReadableDerivedSubscribersDirty(itemSignal);
109
- markReactivePropsDirtySource(itemSignal);
110
- if (notifyReaders) notifyReadableReaders(itemSignal);
109
+ if (notifyReaders) {
110
+ markReadableDerivedSubscribersDirty(itemSignal);
111
+ markReactivePropsDirtySource(itemSignal);
112
+ notifyReadableReaders(itemSignal);
113
+ }
111
114
  };
112
115
  itemSignal._hasBeenRead = false;
113
116
  return itemSignal;
@@ -125,9 +128,11 @@ function createForItemPropertySignal(initialValue) {
125
128
  propertySignal.set = (newValue, notifyReaders = true) => {
126
129
  if (Object.is(propertyValue, newValue)) return;
127
130
  propertyValue = newValue;
128
- markReadableDerivedSubscribersDirty(propertySignal);
129
- markReactivePropsDirtySource(propertySignal);
130
- if (notifyReaders) notifyReadableReaders(propertySignal);
131
+ if (notifyReaders) {
132
+ markReadableDerivedSubscribersDirty(propertySignal);
133
+ markReactivePropsDirtySource(propertySignal);
134
+ notifyReadableReaders(propertySignal);
135
+ }
131
136
  };
132
137
  propertySignal._hasBeenRead = false;
133
138
  return propertySignal;
@@ -135,6 +140,16 @@ function createForItemPropertySignal(initialValue) {
135
140
  function readForItemProperty(item, prop) {
136
141
  return Reflect.get(Object(item), prop);
137
142
  }
143
+ function haveSameOwnKeys(previousItem, nextItem) {
144
+ const previousKeys = Reflect.ownKeys(Object(previousItem));
145
+ const nextKeys = Reflect.ownKeys(Object(nextItem));
146
+ if (previousKeys.length !== nextKeys.length) return false;
147
+ for (let i = 0; i < previousKeys.length; i += 1) if (previousKeys[i] !== nextKeys[i]) return false;
148
+ return true;
149
+ }
150
+ function scopeReadsSource(scope, source) {
151
+ return source._readers?.has(scope.componentInstance) ?? false;
152
+ }
138
153
  function getOrCreateForItemPropertySignal(item, propertySignals, prop) {
139
154
  const existingSignal = propertySignals.get(prop);
140
155
  if (existingSignal) return existingSignal;
@@ -232,6 +247,7 @@ function createItemInstance(key, item, index, forState) {
232
247
  const itemSignal = canProxyForItem(item) ? createForItemSignal(item) : null;
233
248
  const itemPropertySignals = itemSignal ? /* @__PURE__ */ new Map() : null;
234
249
  const reactiveItem = itemSignal && itemPropertySignals ? createReactiveForItem(itemSignal, itemPropertySignals) : item;
250
+ let itemInstance = null;
235
251
  const scope = createChildScope(forState.parentInstance, key, () => {
236
252
  if (forState._enqueueBoundaryCommit) {
237
253
  forState._enqueueBoundaryCommit();
@@ -241,7 +257,7 @@ function createItemInstance(key, item, index, forState) {
241
257
  if (parent) parent._enqueueRun?.();
242
258
  });
243
259
  renderItemScope(forState, scope, reactiveItem, indexSignal, key);
244
- return {
260
+ itemInstance = {
245
261
  key,
246
262
  item,
247
263
  reactiveItem,
@@ -250,6 +266,7 @@ function createItemInstance(key, item, index, forState) {
250
266
  indexSignal,
251
267
  scope
252
268
  };
269
+ return itemInstance;
253
270
  }
254
271
  function rerenderItemInstance(forState, itemInstance, item) {
255
272
  renderItemScope(forState, itemInstance.scope, item, itemInstance.indexSignal, itemInstance.key);
@@ -258,26 +275,30 @@ function updateItemInstance(forState, itemInstance, item) {
258
275
  if (itemInstance.item === item) return false;
259
276
  const previousItem = itemInstance.item;
260
277
  itemInstance.item = item;
261
- let needsRerender = false;
278
+ const scope = itemInstance.scope;
279
+ let scopeReadsChangedSignal = false;
262
280
  const itemSignal = itemInstance.itemSignal;
263
281
  if (!itemSignal) {
264
282
  rerenderItemInstance(forState, itemInstance, item);
265
283
  return true;
266
284
  }
267
285
  const propertySignals = itemInstance.itemPropertySignals;
286
+ const changedPropertySignals = [];
268
287
  if (propertySignals && propertySignals.size > 0) for (const [prop, propertySignal] of propertySignals) {
269
288
  const previousValue = readForItemProperty(previousItem, prop);
270
289
  const nextValue = readForItemProperty(item, prop);
271
290
  if (Object.is(previousValue, nextValue)) continue;
272
- const propertyHasRenderReaders = (propertySignal._readers?.size ?? 0) > 0;
273
- if (propertyHasRenderReaders) needsRerender = true;
274
- propertySignal.set(nextValue, !propertyHasRenderReaders);
291
+ if (scopeReadsSource(scope, propertySignal)) scopeReadsChangedSignal = true;
292
+ changedPropertySignals.push([propertySignal, nextValue]);
275
293
  }
276
- const hasRenderReaders = (itemSignal._readers?.size ?? 0) > 0;
277
- if (hasRenderReaders) needsRerender = true;
278
- itemSignal.set(item, hasRenderReaders);
279
- if (needsRerender) rerenderItemInstance(forState, itemInstance, itemInstance.reactiveItem);
280
- return true;
294
+ if (scopeReadsSource(scope, itemSignal)) scopeReadsChangedSignal = true;
295
+ const itemShapeChanged = changedPropertySignals.length === 0 && !haveSameOwnKeys(previousItem, item);
296
+ const notifyReaders = !scopeReadsChangedSignal && (changedPropertySignals.length > 0 || itemShapeChanged);
297
+ const visibleChange = scopeReadsChangedSignal || changedPropertySignals.length > 0 || itemShapeChanged;
298
+ for (const [propertySignal, nextValue] of changedPropertySignals) propertySignal.set(nextValue, notifyReaders);
299
+ itemSignal.set(item, notifyReaders);
300
+ if (scopeReadsChangedSignal) rerenderItemInstance(forState, itemInstance, itemInstance.reactiveItem);
301
+ return visibleChange;
281
302
  }
282
303
  const FOR_FALLBACK_SCOPE_KEY = "__for-fallback__";
283
304
  function disposeFallbackScope(forState, domCleanup) {
@@ -296,6 +317,7 @@ function renderFallbackScope(forState) {
296
317
  if (forState.fallback == null || forState.fallback === false) {
297
318
  if (forState.fallbackScope) disposeFallbackScope(forState, "none");
298
319
  forState.orderedVNodes = [];
320
+ forState.orderedItems = [];
299
321
  return [];
300
322
  }
301
323
  const fallbackScope = forState.fallbackScope ?? createChildScope(forState.parentInstance, FOR_FALLBACK_SCOPE_KEY, () => {
@@ -308,6 +330,7 @@ function renderFallbackScope(forState) {
308
330
  forState.fallbackScope = fallbackScope;
309
331
  const vnode = fallbackScope.render(() => forState.fallback);
310
332
  forState.orderedVNodes = vnode == null || vnode === false ? [] : [vnode];
333
+ forState.orderedItems = [];
311
334
  return forState.orderedVNodes;
312
335
  }
313
336
  function disposeAllItems(forState, domCleanup) {
@@ -355,20 +378,24 @@ function reconcileForItems(forState, newArray) {
355
378
  recordBenchFastLane("APPEND");
356
379
  forState.lastCommitStrategy = "APPEND";
357
380
  const resultVNodes = forState.orderedVNodes;
381
+ const resultItems = forState.orderedItems;
358
382
  resultVNodes.length = newLen;
383
+ resultItems.length = newLen;
359
384
  for (let i = 0; i < oldLen; i++) {
360
385
  const item = newArray[i];
361
386
  const key = orderedKeys[i];
362
- const existing = items.get(key);
363
- recordBenchEvent("itemReused");
387
+ const existing = resultItems[i] ?? items.get(key);
364
388
  updateItemInstance(forState, existing, item);
389
+ resultItems[i] = existing;
365
390
  resultVNodes[i] = existing.scope.vnode;
366
391
  }
392
+ recordBenchEvent("itemReused", oldLen);
367
393
  for (let i = oldLen; i < newLen; i++) {
368
394
  const item = newArray[i];
369
395
  const key = byFn(item, i);
370
396
  const itemInstance = createItemInstance(key, item, i, forState);
371
397
  items.set(key, itemInstance);
398
+ resultItems[i] = itemInstance;
372
399
  resultVNodes[i] = itemInstance.scope.vnode;
373
400
  orderedKeys[i] = key;
374
401
  }
@@ -399,22 +426,27 @@ function reconcileForItems(forState, newArray) {
399
426
  if (canUseRemoveOnePath) {
400
427
  recordBenchFastLane("REMOVE_ONE");
401
428
  forState.lastCommitStrategy = "NO_REORDER";
429
+ const previousOrderedItems = forState.orderedItems.slice();
402
430
  const resultVNodes = forState.orderedVNodes;
431
+ const resultItems = forState.orderedItems;
403
432
  resultVNodes.length = newLen;
433
+ resultItems.length = newLen;
404
434
  const dirtyIndices = [];
405
435
  for (let i = 0; i < newLen; i++) {
406
436
  const item = newArray[i];
407
437
  const key = i < removedIndex ? orderedKeys[i] : orderedKeys[i + 1];
408
438
  const existing = items.get(key);
409
- recordBenchEvent("itemReused");
439
+ const scopeNeedsDomUpdate = existing.scope.needsDomUpdate;
410
440
  const itemChanged = existing.item !== item;
411
- const needsDomUpdate = existing.scope.needsDomUpdate;
412
- const indexChanged = existing.indexSignal.peek() !== i;
441
+ const indexSignal = existing.indexSignal;
442
+ const indexChanged = indexSignal._hasBeenRead && indexSignal.peek() !== i;
413
443
  if (itemChanged) updateItemInstance(forState, existing, item);
414
- if (indexChanged && existing.indexSignal._hasBeenRead) existing.indexSignal.set(i);
415
- if (itemChanged || indexChanged || needsDomUpdate || existing.scope.needsDomUpdate) dirtyIndices.push(i);
444
+ if (indexChanged) indexSignal.set(i);
445
+ if (itemChanged || indexChanged || scopeNeedsDomUpdate) dirtyIndices.push(i);
446
+ resultItems[i] = existing;
416
447
  resultVNodes[i] = existing.scope.vnode;
417
448
  }
449
+ recordBenchEvent("itemReused", newLen);
418
450
  const removedKey = orderedKeys[removedIndex];
419
451
  const removedItem = items.get(removedKey);
420
452
  if (removedItem) {
@@ -422,8 +454,13 @@ function reconcileForItems(forState, newArray) {
422
454
  items.delete(removedKey);
423
455
  }
424
456
  const nextOrderedKeys = orderedKeys.slice(0, newLen);
425
- for (let i = removedIndex; i < newLen; i++) nextOrderedKeys[i] = orderedKeys[i + 1];
457
+ const nextOrderedItems = previousOrderedItems.slice(0, newLen);
458
+ for (let i = removedIndex; i < newLen; i++) {
459
+ nextOrderedKeys[i] = orderedKeys[i + 1];
460
+ nextOrderedItems[i] = previousOrderedItems[i + 1];
461
+ }
426
462
  forState.orderedKeys = nextOrderedKeys;
463
+ forState.orderedItems = nextOrderedItems;
427
464
  if (BENCH_BUILD_ENABLED) {
428
465
  recordBenchTiming("reconcile", performance.now() - reconcileStartMs);
429
466
  flushBenchMetrics();
@@ -444,16 +481,19 @@ function reconcileForItems(forState, newArray) {
444
481
  recordBenchFastLane("TRUNCATE");
445
482
  forState.lastCommitStrategy = "TRUNCATE";
446
483
  const resultVNodes = forState.orderedVNodes;
484
+ const resultItems = forState.orderedItems;
447
485
  resultVNodes.length = newLen;
486
+ resultItems.length = newLen;
448
487
  const isFullClear = newLen === 0;
449
488
  for (let i = 0; i < newLen; i++) {
450
489
  const item = newArray[i];
451
490
  const key = orderedKeys[i];
452
491
  const existing = items.get(key);
453
- recordBenchEvent("itemReused");
454
492
  updateItemInstance(forState, existing, item);
493
+ resultItems[i] = existing;
455
494
  resultVNodes[i] = existing.scope.vnode;
456
495
  }
496
+ recordBenchEvent("itemReused", newLen);
457
497
  for (let i = newLen; i < oldLen; i++) {
458
498
  const key = orderedKeys[i];
459
499
  const itemInstance = items.get(key);
@@ -464,6 +504,7 @@ function reconcileForItems(forState, newArray) {
464
504
  }
465
505
  orderedKeys.length = newLen;
466
506
  forState.orderedKeys = orderedKeys;
507
+ forState.orderedItems.length = newLen;
467
508
  if (BENCH_BUILD_ENABLED) {
468
509
  recordBenchTiming("reconcile", performance.now() - reconcileStartMs);
469
510
  flushBenchMetrics();
@@ -485,20 +526,21 @@ function reconcileForItems(forState, newArray) {
485
526
  recordBenchFastLane("NO_REORDER");
486
527
  forState.lastCommitStrategy = "NO_REORDER";
487
528
  const resultVNodes = forState.orderedVNodes;
529
+ const resultItems = forState.orderedItems;
488
530
  resultVNodes.length = oldLen;
531
+ resultItems.length = oldLen;
489
532
  const dirtyIndices = [];
490
533
  for (let i = 0; i < oldLen; i++) {
491
534
  const item = newArray[i];
492
535
  const key = orderedKeys[i];
493
536
  const existing = items.get(key);
494
- recordBenchEvent("itemReused");
495
537
  const itemChanged = existing.item !== item;
496
- const needsDomUpdate = existing.scope.needsDomUpdate;
497
- let rerendered = false;
498
- if (itemChanged) rerendered = updateItemInstance(forState, existing, item);
499
- if (rerendered || needsDomUpdate || existing.scope.needsDomUpdate) dirtyIndices.push(i);
538
+ if (itemChanged) updateItemInstance(forState, existing, item);
539
+ if (!itemChanged && existing.scope.needsDomUpdate) dirtyIndices.push(i);
540
+ resultItems[i] = existing;
500
541
  resultVNodes[i] = existing.scope.vnode;
501
542
  }
543
+ recordBenchEvent("itemReused", oldLen);
502
544
  if (BENCH_BUILD_ENABLED) {
503
545
  recordBenchTiming("reconcile", performance.now() - reconcileStartMs);
504
546
  flushBenchMetrics();
@@ -552,6 +594,9 @@ function reconcileForItems(forState, newArray) {
552
594
  const secondExisting = items.get(secondMismatchKey);
553
595
  const firstItem = newArray[firstMismatch];
554
596
  const secondItem = newArray[secondMismatch];
597
+ const nextOrderedItems = forState.orderedItems.slice();
598
+ nextOrderedItems[firstMismatch] = secondExisting;
599
+ nextOrderedItems[secondMismatch] = firstExisting;
555
600
  recordBenchEvent("itemReused");
556
601
  recordBenchEvent("itemReused");
557
602
  if (firstExisting.item !== firstItem) updateItemInstance(forState, firstExisting, firstItem);
@@ -561,6 +606,7 @@ function reconcileForItems(forState, newArray) {
561
606
  resultVNodes[firstMismatch] = firstExisting.scope.vnode;
562
607
  resultVNodes[secondMismatch] = secondExisting.scope.vnode;
563
608
  forState.orderedKeys = nextOrderedKeys;
609
+ forState.orderedItems = nextOrderedItems;
564
610
  if (BENCH_BUILD_ENABLED) {
565
611
  recordBenchTiming("reconcile", performance.now() - reconcileStartMs);
566
612
  flushBenchMetrics();
@@ -572,6 +618,7 @@ function reconcileForItems(forState, newArray) {
572
618
  }
573
619
  let canUseMoveOnlyPath = true;
574
620
  const moveOnlyKeys = [];
621
+ const moveOnlyItems = [];
575
622
  const moveOnlyVNodes = [];
576
623
  for (let i = 0; i < oldLen; i++) {
577
624
  const item = newArray[i];
@@ -582,6 +629,7 @@ function reconcileForItems(forState, newArray) {
582
629
  break;
583
630
  }
584
631
  moveOnlyKeys[i] = key;
632
+ moveOnlyItems[i] = existing;
585
633
  moveOnlyVNodes[i] = existing.scope.vnode;
586
634
  recordBenchEvent("itemReused");
587
635
  }
@@ -589,6 +637,7 @@ function reconcileForItems(forState, newArray) {
589
637
  recordBenchFastLane("FULL_KEYED");
590
638
  forState.lastCommitStrategy = "FULL_KEYED";
591
639
  forState.orderedKeys = moveOnlyKeys;
640
+ forState.orderedItems = moveOnlyItems;
592
641
  forState.orderedVNodes = moveOnlyVNodes;
593
642
  if (BENCH_BUILD_ENABLED) {
594
643
  recordBenchTiming("reconcile", performance.now() - reconcileStartMs);
@@ -604,6 +653,7 @@ function reconcileForItems(forState, newArray) {
604
653
  forState.lastCommitStrategy = "FULL_KEYED";
605
654
  const toRemove = new Set(orderedKeys);
606
655
  const newOrderedKeys = [];
656
+ const newOrderedItems = [];
607
657
  const resultVNodes = [];
608
658
  let moveOnly = toRemove.size === newArray.length;
609
659
  for (let i = 0; i < newArray.length; i++) {
@@ -617,6 +667,7 @@ function reconcileForItems(forState, newArray) {
617
667
  if (!existing) {
618
668
  const itemInstance = createItemInstance(key, item, i, forState);
619
669
  items.set(key, itemInstance);
670
+ newOrderedItems.push(itemInstance);
620
671
  resultVNodes.push(itemInstance.scope.vnode);
621
672
  } else {
622
673
  recordBenchEvent("itemReused");
@@ -627,6 +678,7 @@ function reconcileForItems(forState, newArray) {
627
678
  updateItemInstance(forState, existing, item);
628
679
  }
629
680
  if (indexChanged) existing.indexSignal.set(i);
681
+ newOrderedItems.push(existing);
630
682
  resultVNodes.push(existing.scope.vnode);
631
683
  }
632
684
  }
@@ -639,6 +691,7 @@ function reconcileForItems(forState, newArray) {
639
691
  }
640
692
  }
641
693
  forState.orderedKeys = newOrderedKeys;
694
+ forState.orderedItems = newOrderedItems;
642
695
  if (BENCH_BUILD_ENABLED) {
643
696
  recordBenchTiming("reconcile", performance.now() - reconcileStartMs);
644
697
  flushBenchMetrics();
@@ -655,7 +708,12 @@ function evaluateForState(forState) {
655
708
  return reconcileForItems(forState, forState.currentItems);
656
709
  }
657
710
  function clearForDomUpdateState(forState) {
658
- for (let i = 0; i < forState.orderedKeys.length; i++) {
711
+ const dirtyIndices = forState.pendingDirtyIndices;
712
+ if (dirtyIndices && dirtyIndices.length > 0) for (let i = 0; i < dirtyIndices.length; i++) {
713
+ const itemInstance = forState.orderedItems[dirtyIndices[i]];
714
+ if (itemInstance) itemInstance.scope.needsDomUpdate = false;
715
+ }
716
+ else for (let i = 0; i < forState.orderedKeys.length; i++) {
659
717
  const key = forState.orderedKeys[i];
660
718
  const itemInstance = forState.items.get(key);
661
719
  if (itemInstance) itemInstance.scope.needsDomUpdate = false;
@@ -666,6 +724,7 @@ function clearForDomUpdateState(forState) {
666
724
  forState.pendingSwapIndices = null;
667
725
  forState.pendingMoveOnly = false;
668
726
  forState._needsSourceReconcile = false;
727
+ forState._hasResolvedItemDom = forState.orderedKeys.length > 0;
669
728
  }
670
729
  //#endregion
671
730
  export { clearForDomUpdateState, evaluateForState, useForState };
@@ -1 +1 @@
1
- {"version":3,"file":"for.js","names":[],"sources":["../../src/runtime/for.ts"],"sourcesContent":["/**\n * For primitive runtime\n *\n * Manages per-item component instances and array reconciliation\n * to eliminate over-invalidation in list rendering.\n */\n\nimport { type ComponentInstance, getCurrentInstance } from './component';\nimport { claimHookIndex } from './component';\nimport { type DOMElement, type VNode } from '../common/vnode';\nimport { isDevelopmentEnvironment } from '../common/env';\nimport { teardownNodeSubtree } from '../renderer/cleanup';\nimport {\n createChildScope,\n disposeChildScope,\n type ChildScope,\n} from './child-scope';\nimport type { ForProps } from '../control/for';\nimport type { ForEachSource } from '../control/for';\nimport {\n markReactivePropsDirtySource,\n markReadableDerivedSubscribersDirty,\n notifyReadableReaders,\n recordReadableRead,\n type ReadableSource,\n} from './readable';\nimport type { FineGrainedEffectHandle } from './effect';\nimport {\n flushBenchMetrics,\n getBenchMetrics,\n isBenchBuildEnabled,\n isBenchMetricScopeActive,\n recordBenchEvent,\n recordBenchCounter,\n recordBenchFastLane,\n recordBenchTiming,\n resetBenchMetrics,\n withBenchMetricScope,\n} from './for-bench';\n\nconst BENCH_BUILD_ENABLED = isBenchBuildEnabled();\n\nexport {\n getBenchMetrics,\n isBenchMetricScopeActive,\n recordBenchEvent,\n recordBenchCounter,\n recordBenchTiming,\n resetBenchMetrics,\n withBenchMetricScope,\n};\n\nexport interface ForItemInstance<T> {\n key: string | number;\n item: T;\n reactiveItem: T;\n itemSignal: ForItemSignal<T> | null;\n itemPropertySignals: Map<PropertyKey, ForItemPropertySignal> | null;\n indexSignal: ForIndexSignal;\n scope: ChildScope;\n}\n\ntype ForItemSignal<T> = ReadableSource<T> &\n (() => T) & {\n peek(): T;\n set(newValue: T, notifyReaders?: boolean): void;\n };\n\ntype ForItemPropertySignal = ReadableSource<unknown> &\n (() => unknown) & {\n peek(): unknown;\n set(newValue: unknown, notifyReaders?: boolean): void;\n };\n\ntype ForIndexSignal = ReadableSource<number> &\n (() => number) & {\n peek(): number;\n set(newValue: number | ((prev: number) => number)): void;\n };\n\nexport type ForCommitStrategy =\n | 'APPEND'\n | 'TRUNCATE'\n | 'NO_REORDER'\n | 'SWAP'\n | 'FULL_KEYED';\n\nexport interface ForState<T> {\n kind: 'for';\n currentItems: T[];\n eachSource: ForEachSource<T>;\n fallback: VNode | null;\n fallbackScope: ChildScope | null;\n items: Map<string | number, ForItemInstance<T>>;\n orderedKeys: Array<string | number>;\n orderedVNodes: VNode[];\n byFn: NonNullable<ForProps<T>['by']> | ((item: T, index: number) => number);\n renderFn: (item: T, index: () => number) => VNode;\n parentInstance: ComponentInstance | null;\n lastCommitStrategy: ForCommitStrategy;\n lastRemovedNodes: Node[];\n pendingDirtyIndices: number[] | null;\n pendingSwapIndices: [number, number] | null;\n pendingMoveOnly: boolean;\n _hasResolvedItemDom: boolean;\n _needsSourceReconcile: boolean;\n _sourceEffect: FineGrainedEffectHandle<T[]> | null;\n _suspendSourceCommit: boolean;\n _enqueueBoundaryCommit?: (() => void) | null;\n _hasPendingBoundaryCommit?: boolean;\n devKeyKinds?: Map<string, 'number' | 'string'>;\n}\n\nconst forStates = new WeakMap<\n ComponentInstance,\n Map<number, ForState<unknown>>\n>();\n\nfunction getForStore(\n instance: ComponentInstance\n): Map<number, ForState<unknown>> {\n let store = forStates.get(instance);\n if (!store) {\n store = new Map();\n forStates.set(instance, store);\n }\n return store;\n}\n\nexport function createForState<T>(\n eachSource: ForEachSource<T>,\n byFn: ForState<T>['byFn'],\n renderFn: (item: T, index: () => number) => VNode,\n fallback: VNode | null\n): ForState<T> {\n const parentInstance = getCurrentInstance();\n\n return {\n kind: 'for',\n currentItems: [],\n eachSource,\n fallback,\n fallbackScope: null,\n items: new Map(),\n orderedKeys: [],\n orderedVNodes: [],\n byFn,\n renderFn,\n parentInstance,\n lastCommitStrategy: 'NO_REORDER',\n lastRemovedNodes: [],\n pendingDirtyIndices: null,\n pendingSwapIndices: null,\n pendingMoveOnly: false,\n _hasResolvedItemDom: false,\n _needsSourceReconcile: false,\n _sourceEffect: null,\n _suspendSourceCommit: false,\n _enqueueBoundaryCommit: null,\n _hasPendingBoundaryCommit: false,\n };\n}\n\nexport function useForState<T>(\n eachSource: ForEachSource<T>,\n byFn: ForState<T>['byFn'],\n renderFn: (item: T, index: () => number) => VNode,\n fallback: VNode | null\n): ForState<T> {\n const instance = getCurrentInstance();\n if (!instance) {\n throw new Error(\n 'For can only be created during component render execution.'\n );\n }\n\n const hookIndex = claimHookIndex(instance, 'For');\n const store = getForStore(instance);\n const existing = store.get(hookIndex) as ForState<T> | undefined;\n\n if (existing) {\n existing.eachSource = eachSource;\n existing.byFn = byFn;\n existing.renderFn = renderFn;\n existing.fallback = fallback;\n return existing;\n }\n\n const created = createForState(eachSource, byFn, renderFn, fallback);\n store.set(hookIndex, created as ForState<unknown>);\n\n (instance.cleanupFns ??= []).push(() => {\n created._sourceEffect?.cleanup();\n created._sourceEffect = null;\n store.delete(hookIndex);\n });\n\n return created;\n}\n\nfunction createForIndexSignal(initialIndex: number): ForIndexSignal {\n let indexValue = initialIndex;\n const readers = new Map<ComponentInstance, number>();\n\n const indexSignal = (() => {\n indexSignal._hasBeenRead = true;\n recordReadableRead(indexSignal);\n return indexValue;\n }) as ForIndexSignal;\n indexSignal._readers = readers;\n indexSignal.peek = () => indexValue;\n indexSignal.set = (newValue: number | ((prev: number) => number)) => {\n const nextValue =\n typeof newValue === 'function' ? newValue(indexValue) : newValue;\n if (nextValue !== indexValue) {\n indexValue = nextValue;\n markReadableDerivedSubscribersDirty(indexSignal);\n markReactivePropsDirtySource(indexSignal);\n notifyReadableReaders(indexSignal);\n }\n };\n indexSignal._hasBeenRead = false;\n\n return indexSignal;\n}\n\nfunction createForItemSignal<T>(initialItem: T): ForItemSignal<T> {\n let itemValue = initialItem;\n const readers = new Map<ComponentInstance, number>();\n\n const itemSignal = (() => {\n itemSignal._hasBeenRead = true;\n recordReadableRead(itemSignal);\n return itemValue;\n }) as ForItemSignal<T>;\n\n itemSignal._readers = readers;\n itemSignal.peek = () => itemValue;\n itemSignal.set = (newValue: T, notifyReaders = true) => {\n if (Object.is(itemValue, newValue)) {\n return;\n }\n\n itemValue = newValue;\n markReadableDerivedSubscribersDirty(itemSignal);\n markReactivePropsDirtySource(itemSignal);\n\n if (notifyReaders) {\n notifyReadableReaders(itemSignal);\n }\n };\n itemSignal._hasBeenRead = false;\n\n return itemSignal;\n}\n\nfunction createForItemPropertySignal(\n initialValue: unknown\n): ForItemPropertySignal {\n let propertyValue = initialValue;\n const readers = new Map<ComponentInstance, number>();\n\n const propertySignal = (() => {\n propertySignal._hasBeenRead = true;\n recordReadableRead(propertySignal);\n return propertyValue;\n }) as ForItemPropertySignal;\n\n propertySignal._readers = readers;\n propertySignal.peek = () => propertyValue;\n propertySignal.set = (newValue: unknown, notifyReaders = true) => {\n if (Object.is(propertyValue, newValue)) {\n return;\n }\n\n propertyValue = newValue;\n markReadableDerivedSubscribersDirty(propertySignal);\n markReactivePropsDirtySource(propertySignal);\n\n if (notifyReaders) {\n notifyReadableReaders(propertySignal);\n }\n };\n propertySignal._hasBeenRead = false;\n\n return propertySignal;\n}\n\nfunction readForItemProperty(item: unknown, prop: PropertyKey): unknown {\n return Reflect.get(Object(item), prop);\n}\n\nfunction getOrCreateForItemPropertySignal<T>(\n item: T,\n propertySignals: Map<PropertyKey, ForItemPropertySignal>,\n prop: PropertyKey\n): ForItemPropertySignal {\n const existingSignal = propertySignals.get(prop);\n if (existingSignal) {\n return existingSignal;\n }\n\n const propertySignal = createForItemPropertySignal(\n readForItemProperty(item, prop)\n );\n propertySignals.set(prop, propertySignal);\n return propertySignal;\n}\n\nfunction canProxyForItem(item: unknown): item is object {\n return (\n (typeof item === 'object' && item !== null) || typeof item === 'function'\n );\n}\n\nfunction createReactiveForItem<T>(\n itemSignal: ForItemSignal<T>,\n propertySignals: Map<PropertyKey, ForItemPropertySignal>\n): T {\n const target = Object.create(null) as Record<string | symbol, unknown>;\n\n return new Proxy(target, {\n get(target, prop, receiver) {\n const ownDescriptor = Reflect.getOwnPropertyDescriptor(target, prop);\n if (ownDescriptor) {\n return Reflect.get(target, prop, receiver);\n }\n\n const currentItem = itemSignal.peek();\n\n if (typeof prop !== 'symbol') {\n return getOrCreateForItemPropertySignal(\n currentItem,\n propertySignals,\n prop\n )();\n }\n\n recordReadableRead(itemSignal);\n return Reflect.get(Object(currentItem), prop, receiver);\n },\n has(target, prop) {\n recordReadableRead(itemSignal);\n return prop in target || prop in Object(itemSignal.peek());\n },\n ownKeys(target) {\n recordReadableRead(itemSignal);\n const keys = new Set<string | symbol>(Reflect.ownKeys(target));\n for (const key of Reflect.ownKeys(Object(itemSignal.peek()))) {\n keys.add(key);\n }\n\n return Array.from(keys);\n },\n getOwnPropertyDescriptor(target, prop) {\n recordReadableRead(itemSignal);\n const ownDescriptor = Reflect.getOwnPropertyDescriptor(target, prop);\n if (ownDescriptor) {\n return ownDescriptor;\n }\n\n return Object.getOwnPropertyDescriptor(Object(itemSignal.peek()), prop);\n },\n getPrototypeOf() {\n recordReadableRead(itemSignal);\n return Object.getPrototypeOf(Object(itemSignal.peek()));\n },\n }) as T;\n}\n\nfunction materializeItemVnode(\n key: string | number,\n vnode: VNode | undefined\n): void {\n if (vnode && typeof vnode === 'object' && 'type' in vnode) {\n const vn = vnode as DOMElement;\n vn.key = key;\n\n if (typeof vn.type === 'string') {\n if (!vn.props) vn.props = {};\n if (vn.props['data-key'] === undefined) {\n vn.props['data-key'] = String(key);\n }\n }\n }\n}\n\nfunction renderItemScope<T>(\n forState: ForState<T>,\n scope: ChildScope,\n item: T,\n indexSignal: ForIndexSignal,\n key: string | number\n): VNode {\n recordBenchEvent('rowFactory');\n const vnode = scope.render(() => forState.renderFn(item, indexSignal));\n materializeItemVnode(key, vnode);\n return vnode;\n}\n\nfunction failForValidation(message: string): never {\n throw new Error(message);\n}\n\nfunction validateForKeys<T>(forState: ForState<T>, newArray: T[]): void {\n if (!isDevelopmentEnvironment()) {\n return;\n }\n\n const seen = new Set<string | number>();\n const keyKinds = new Map<string, 'number' | 'string'>();\n for (let i = 0; i < newArray.length; i++) {\n const key = forState.byFn(newArray[i], i);\n\n if (key === null || key === undefined) {\n failForValidation(\n '[askr] Invalid For key detected. Keys should be stable, non-null, and unique within a For list.'\n );\n }\n\n if (seen.has(key)) {\n failForValidation(\n `[askr] Duplicate For key detected: ${String(key)}. Keys should be stable, non-null, and unique within a For list.`\n );\n }\n\n seen.add(key);\n\n const keyString = String(key);\n const keyKind = typeof key;\n const previousKeyKind = forState.devKeyKinds?.get(keyString);\n if (previousKeyKind && previousKeyKind !== keyKind) {\n failForValidation(\n `[askr] For key type changed for ${keyString}. Keys must remain consistently typed across renders.`\n );\n }\n keyKinds.set(keyString, keyKind as 'number' | 'string');\n }\n\n forState.devKeyKinds = keyKinds;\n}\n\ntype RemovedDomCleanupMode = 'none' | 'teardown' | 'full-clear';\n\nfunction disposeItemInstance<T>(\n forState: ForState<T>,\n itemInstance: ForItemInstance<T>,\n domCleanup: RemovedDomCleanupMode\n): void {\n recordBenchEvent('itemRemoved');\n const removedDom = itemInstance.scope.dom;\n\n try {\n disposeChildScope(itemInstance.scope);\n } catch (err) {\n if (isDevelopmentEnvironment()) {\n console.error('[For] Cleanup error:', err);\n }\n }\n\n if (!removedDom) {\n return;\n }\n\n if (removedDom instanceof Element) {\n if (domCleanup === 'teardown') {\n teardownNodeSubtree(removedDom);\n }\n }\n\n forState.lastRemovedNodes.push(removedDom);\n}\n\nexport function createItemInstance<T>(\n key: string | number,\n item: T,\n index: number,\n forState: ForState<T>\n): ForItemInstance<T> {\n recordBenchEvent('itemCreated');\n\n // Create index signal manually without going through state() hook\n // to avoid hook order violations (each For item creates its signal dynamically)\n const indexSignal = createForIndexSignal(index);\n const itemSignal = canProxyForItem(item) ? createForItemSignal(item) : null;\n const itemPropertySignals = itemSignal\n ? new Map<PropertyKey, ForItemPropertySignal>()\n : null;\n const reactiveItem =\n itemSignal && itemPropertySignals\n ? createReactiveForItem(itemSignal, itemPropertySignals)\n : item;\n const scope = createChildScope(forState.parentInstance, key, () => {\n if (forState._enqueueBoundaryCommit) {\n forState._enqueueBoundaryCommit();\n return;\n }\n\n const parent = forState.parentInstance;\n if (parent) {\n parent._enqueueRun?.();\n }\n });\n\n renderItemScope(forState, scope, reactiveItem, indexSignal, key);\n\n const itemInstance: ForItemInstance<T> = {\n key,\n item,\n reactiveItem,\n itemSignal,\n itemPropertySignals,\n indexSignal,\n scope,\n };\n\n return itemInstance;\n}\n\nfunction rerenderItemInstance<T>(\n forState: ForState<T>,\n itemInstance: ForItemInstance<T>,\n item: T\n): void {\n renderItemScope(\n forState,\n itemInstance.scope,\n item,\n itemInstance.indexSignal,\n itemInstance.key\n );\n}\n\nfunction updateItemInstance<T>(\n forState: ForState<T>,\n itemInstance: ForItemInstance<T>,\n item: T\n): boolean {\n if (itemInstance.item === item) {\n return false;\n }\n\n const previousItem = itemInstance.item;\n itemInstance.item = item;\n\n let needsRerender = false;\n const itemSignal = itemInstance.itemSignal;\n if (!itemSignal) {\n rerenderItemInstance(forState, itemInstance, item);\n return true;\n }\n\n const propertySignals = itemInstance.itemPropertySignals;\n if (propertySignals && propertySignals.size > 0) {\n for (const [prop, propertySignal] of propertySignals) {\n const previousValue = readForItemProperty(previousItem, prop);\n const nextValue = readForItemProperty(item, prop);\n if (Object.is(previousValue, nextValue)) {\n continue;\n }\n\n const propertyHasRenderReaders = (propertySignal._readers?.size ?? 0) > 0;\n if (propertyHasRenderReaders) {\n needsRerender = true;\n }\n\n propertySignal.set(nextValue, !propertyHasRenderReaders);\n }\n }\n\n const hasRenderReaders = (itemSignal._readers?.size ?? 0) > 0;\n if (hasRenderReaders) {\n needsRerender = true;\n }\n itemSignal.set(item, hasRenderReaders);\n\n if (needsRerender) {\n rerenderItemInstance(forState, itemInstance, itemInstance.reactiveItem);\n }\n return true;\n}\n\nconst FOR_FALLBACK_SCOPE_KEY = '__for-fallback__';\n\nfunction disposeFallbackScope<T>(\n forState: ForState<T>,\n domCleanup: RemovedDomCleanupMode\n): void {\n const fallbackScope = forState.fallbackScope;\n if (!fallbackScope) {\n return;\n }\n\n const removedDom = fallbackScope.dom;\n disposeChildScope(fallbackScope);\n forState.fallbackScope = null;\n\n if (!removedDom) {\n return;\n }\n\n if (removedDom instanceof Element) {\n if (domCleanup === 'teardown') {\n teardownNodeSubtree(removedDom);\n }\n }\n\n forState.lastRemovedNodes.push(removedDom);\n}\n\nfunction renderFallbackScope<T>(forState: ForState<T>): VNode[] {\n if (forState.fallback == null || forState.fallback === false) {\n if (forState.fallbackScope) {\n disposeFallbackScope(forState, 'none');\n }\n forState.orderedVNodes = [];\n return [];\n }\n\n const fallbackScope =\n forState.fallbackScope ??\n createChildScope(forState.parentInstance, FOR_FALLBACK_SCOPE_KEY, () => {\n if (forState._enqueueBoundaryCommit) {\n forState._enqueueBoundaryCommit();\n return;\n }\n\n forState.parentInstance?._enqueueRun?.();\n });\n forState.fallbackScope = fallbackScope;\n\n const vnode = fallbackScope.render(() => forState.fallback as VNode);\n forState.orderedVNodes = vnode == null || vnode === false ? [] : [vnode];\n return forState.orderedVNodes;\n}\n\nfunction disposeAllItems<T>(\n forState: ForState<T>,\n domCleanup: RemovedDomCleanupMode\n): void {\n const { items, orderedKeys } = forState;\n for (let index = 0; index < orderedKeys.length; index += 1) {\n const key = orderedKeys[index];\n const itemInstance = items.get(key);\n if (!itemInstance) {\n continue;\n }\n disposeItemInstance(forState, itemInstance, domCleanup);\n items.delete(key);\n }\n orderedKeys.length = 0;\n forState.orderedKeys = orderedKeys;\n}\n\nexport function reconcileForItems<T>(\n forState: ForState<T>,\n newArray: T[]\n): VNode[] {\n forState.currentItems = newArray;\n validateForKeys(forState, newArray);\n\n if (BENCH_BUILD_ENABLED) {\n resetBenchMetrics();\n }\n\n const reconcileStartMs = BENCH_BUILD_ENABLED ? performance.now() : 0;\n\n const { items, orderedKeys, byFn } = forState;\n const oldLen = orderedKeys.length;\n const newLen = newArray.length;\n forState.lastRemovedNodes = [];\n\n if (newLen === 0) {\n if (oldLen > 0) {\n disposeAllItems(forState, forState.fallback ? 'teardown' : 'none');\n }\n recordBenchFastLane('TRUNCATE');\n forState.lastCommitStrategy = 'TRUNCATE';\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n return renderFallbackScope(forState);\n }\n\n if (forState.fallbackScope) {\n disposeFallbackScope(forState, 'none');\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // FAST PATH A: APPEND\n // Guard: oldLen <= newLen && all old keys match new keys at same indices\n // ─────────────────────────────────────────────────────────────────────────\n if (oldLen < newLen) {\n let canUseAppendPath = true;\n for (let i = 0; i < oldLen; i++) {\n const key = byFn(newArray[i], i);\n if (key !== orderedKeys[i]) {\n canUseAppendPath = false;\n break;\n }\n }\n\n if (canUseAppendPath) {\n recordBenchFastLane('APPEND');\n forState.lastCommitStrategy = 'APPEND';\n const resultVNodes = forState.orderedVNodes;\n resultVNodes.length = newLen;\n\n // Update existing rows in-place\n for (let i = 0; i < oldLen; i++) {\n const item = newArray[i];\n const key = orderedKeys[i];\n const existing = items.get(key)!;\n recordBenchEvent('itemReused');\n\n updateItemInstance(forState, existing, item);\n\n resultVNodes[i] = existing.scope.vnode as VNode;\n }\n\n // Create and append new rows\n for (let i = oldLen; i < newLen; i++) {\n const item = newArray[i];\n const key = byFn(item, i);\n const itemInstance = createItemInstance(key, item, i, forState);\n items.set(key, itemInstance);\n resultVNodes[i] = itemInstance.scope.vnode as VNode;\n orderedKeys[i] = key;\n }\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n forState.orderedVNodes = resultVNodes;\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n\n return resultVNodes;\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // FAST PATH B: TRUNCATE\n // Guard: newLen <= oldLen && all new keys match old keys at same indices\n // ─────────────────────────────────────────────────────────────────────────\n if (newLen < oldLen) {\n if (oldLen === newLen + 1) {\n let removedIndex = -1;\n\n for (let i = 0; i < newLen; i++) {\n const nextKey = byFn(newArray[i], i);\n if (nextKey !== orderedKeys[i]) {\n removedIndex = i;\n break;\n }\n }\n\n if (removedIndex !== -1) {\n let canUseRemoveOnePath = true;\n for (let i = removedIndex; i < newLen; i++) {\n const nextKey = byFn(newArray[i], i);\n if (nextKey !== orderedKeys[i + 1]) {\n canUseRemoveOnePath = false;\n break;\n }\n }\n\n if (canUseRemoveOnePath) {\n recordBenchFastLane('REMOVE_ONE');\n forState.lastCommitStrategy = 'NO_REORDER';\n\n const resultVNodes = forState.orderedVNodes;\n resultVNodes.length = newLen;\n const dirtyIndices: number[] = [];\n\n for (let i = 0; i < newLen; i++) {\n const item = newArray[i];\n const key = i < removedIndex ? orderedKeys[i] : orderedKeys[i + 1];\n const existing = items.get(key)!;\n recordBenchEvent('itemReused');\n\n const itemChanged = existing.item !== item;\n const needsDomUpdate = existing.scope.needsDomUpdate;\n const indexChanged = existing.indexSignal.peek() !== i;\n\n if (itemChanged) {\n updateItemInstance(forState, existing, item);\n }\n\n if (indexChanged && existing.indexSignal._hasBeenRead) {\n existing.indexSignal.set(i);\n }\n\n if (\n itemChanged ||\n indexChanged ||\n needsDomUpdate ||\n existing.scope.needsDomUpdate\n ) {\n dirtyIndices.push(i);\n }\n\n resultVNodes[i] = existing.scope.vnode as VNode;\n }\n\n const removedKey = orderedKeys[removedIndex];\n const removedItem = items.get(removedKey);\n if (removedItem) {\n disposeItemInstance(forState, removedItem, 'teardown');\n items.delete(removedKey);\n }\n\n const nextOrderedKeys = orderedKeys.slice(0, newLen);\n for (let i = removedIndex; i < newLen; i++) {\n nextOrderedKeys[i] = orderedKeys[i + 1];\n }\n forState.orderedKeys = nextOrderedKeys;\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming(\n 'reconcile',\n performance.now() - reconcileStartMs\n );\n flushBenchMetrics();\n }\n\n forState.pendingDirtyIndices = dirtyIndices;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n\n return resultVNodes;\n }\n }\n }\n\n let canUseTruncatePath = true;\n for (let i = 0; i < newLen; i++) {\n const key = byFn(newArray[i], i);\n if (key !== orderedKeys[i]) {\n canUseTruncatePath = false;\n break;\n }\n }\n\n if (canUseTruncatePath) {\n recordBenchFastLane('TRUNCATE');\n forState.lastCommitStrategy = 'TRUNCATE';\n const resultVNodes = forState.orderedVNodes;\n resultVNodes.length = newLen;\n const isFullClear = newLen === 0;\n\n // Update existing rows in-place\n for (let i = 0; i < newLen; i++) {\n const item = newArray[i];\n const key = orderedKeys[i];\n const existing = items.get(key)!;\n recordBenchEvent('itemReused');\n\n updateItemInstance(forState, existing, item);\n\n resultVNodes[i] = existing.scope.vnode as VNode;\n }\n\n // Remove tail rows\n for (let i = newLen; i < oldLen; i++) {\n const key = orderedKeys[i];\n const itemInstance = items.get(key);\n if (itemInstance) {\n disposeItemInstance(\n forState,\n itemInstance,\n isFullClear ? 'full-clear' : 'teardown'\n );\n items.delete(key);\n }\n }\n\n orderedKeys.length = newLen;\n forState.orderedKeys = orderedKeys;\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n forState.orderedVNodes = resultVNodes;\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n\n return resultVNodes;\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // FAST PATH C: NO-REORDER (in-place update only)\n // Guard: oldLen === newLen && keys match at all indices\n // ─────────────────────────────────────────────────────────────────────────\n if (oldLen === newLen) {\n let canUseNoReorderPath = true;\n for (let i = 0; i < oldLen; i++) {\n const key = byFn(newArray[i], i);\n if (key !== orderedKeys[i]) {\n canUseNoReorderPath = false;\n break;\n }\n }\n\n if (canUseNoReorderPath) {\n recordBenchFastLane('NO_REORDER');\n forState.lastCommitStrategy = 'NO_REORDER';\n const resultVNodes = forState.orderedVNodes;\n resultVNodes.length = oldLen;\n const dirtyIndices: number[] = [];\n\n // Update in-place only, no DOM moves needed\n for (let i = 0; i < oldLen; i++) {\n const item = newArray[i];\n const key = orderedKeys[i];\n const existing = items.get(key)!;\n recordBenchEvent('itemReused');\n\n const itemChanged = existing.item !== item;\n const needsDomUpdate = existing.scope.needsDomUpdate;\n let rerendered = false;\n\n if (itemChanged) {\n rerendered = updateItemInstance(forState, existing, item);\n }\n\n if (rerendered || needsDomUpdate || existing.scope.needsDomUpdate) {\n dirtyIndices.push(i);\n }\n\n resultVNodes[i] = existing.scope.vnode as VNode;\n }\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n forState.pendingDirtyIndices = dirtyIndices;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n\n return resultVNodes;\n }\n\n let firstMismatch = -1;\n let secondMismatch = -1;\n let firstMismatchKey: string | number | null = null;\n let secondMismatchKey: string | number | null = null;\n let mismatchCount = 0;\n let canUseSwapPath = true;\n\n for (let i = 0; i < oldLen; i++) {\n const item = newArray[i];\n const key = byFn(newArray[i], i);\n if (key === orderedKeys[i]) {\n const existing = items.get(key);\n if (existing && existing.item !== item) {\n canUseSwapPath = false;\n break;\n }\n continue;\n }\n\n mismatchCount++;\n if (firstMismatch === -1) {\n firstMismatch = i;\n firstMismatchKey = key;\n continue;\n }\n\n if (secondMismatch === -1) {\n secondMismatch = i;\n secondMismatchKey = key;\n continue;\n }\n\n mismatchCount = 3;\n break;\n }\n\n if (\n canUseSwapPath &&\n mismatchCount === 2 &&\n firstMismatch !== -1 &&\n secondMismatch !== -1 &&\n firstMismatchKey === orderedKeys[secondMismatch] &&\n secondMismatchKey === orderedKeys[firstMismatch]\n ) {\n recordBenchFastLane('SWAP');\n recordBenchEvent('itemMoved');\n recordBenchEvent('itemMoved');\n\n forState.lastCommitStrategy = 'SWAP';\n\n const nextOrderedKeys = orderedKeys.slice();\n nextOrderedKeys[firstMismatch] = firstMismatchKey;\n nextOrderedKeys[secondMismatch] = secondMismatchKey;\n\n const resultVNodes = forState.orderedVNodes;\n const firstExisting = items.get(firstMismatchKey)!;\n const secondExisting = items.get(secondMismatchKey)!;\n const firstItem = newArray[firstMismatch];\n const secondItem = newArray[secondMismatch];\n\n recordBenchEvent('itemReused');\n recordBenchEvent('itemReused');\n\n if (firstExisting.item !== firstItem) {\n updateItemInstance(forState, firstExisting, firstItem);\n }\n\n if (secondExisting.item !== secondItem) {\n updateItemInstance(forState, secondExisting, secondItem);\n }\n\n if (\n firstExisting.indexSignal._hasBeenRead &&\n firstExisting.indexSignal.peek() !== firstMismatch\n ) {\n firstExisting.indexSignal.set(firstMismatch);\n }\n\n if (\n secondExisting.indexSignal._hasBeenRead &&\n secondExisting.indexSignal.peek() !== secondMismatch\n ) {\n secondExisting.indexSignal.set(secondMismatch);\n }\n\n resultVNodes[firstMismatch] = firstExisting.scope.vnode as VNode;\n resultVNodes[secondMismatch] = secondExisting.scope.vnode as VNode;\n\n forState.orderedKeys = nextOrderedKeys;\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = [firstMismatch, secondMismatch];\n forState.pendingMoveOnly = true;\n\n return resultVNodes;\n }\n\n let canUseMoveOnlyPath = true;\n const moveOnlyKeys: Array<string | number> = [];\n const moveOnlyVNodes: VNode[] = [];\n\n for (let i = 0; i < oldLen; i++) {\n const item = newArray[i];\n const key = byFn(item, i);\n const existing = items.get(key);\n\n if (\n !existing ||\n existing.item !== item ||\n (existing.indexSignal._hasBeenRead && existing.indexSignal.peek() !== i)\n ) {\n canUseMoveOnlyPath = false;\n break;\n }\n\n moveOnlyKeys[i] = key;\n moveOnlyVNodes[i] = existing.scope.vnode as VNode;\n recordBenchEvent('itemReused');\n }\n\n if (canUseMoveOnlyPath) {\n recordBenchFastLane('FULL_KEYED');\n forState.lastCommitStrategy = 'FULL_KEYED';\n forState.orderedKeys = moveOnlyKeys;\n forState.orderedVNodes = moveOnlyVNodes;\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = true;\n\n return moveOnlyVNodes;\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // FULL KEYED RECONCILIATION (slow path for complex reorders)\n // Avoid allocating newKeyMap: iterate directly and track removals\n // ─────────────────────────────────────────────────────────────────────────\n recordBenchFastLane('FULL_KEYED');\n forState.lastCommitStrategy = 'FULL_KEYED';\n\n const toRemove = new Set(orderedKeys);\n const newOrderedKeys: Array<string | number> = [];\n const resultVNodes: VNode[] = [];\n let moveOnly = toRemove.size === newArray.length;\n\n // Single pass: iterate new array directly, no intermediate map\n for (let i = 0; i < newArray.length; i++) {\n const item = newArray[i];\n const key = byFn(item, i);\n recordBenchEvent('keyLookup');\n\n toRemove.delete(key);\n newOrderedKeys.push(key);\n\n const existing = items.get(key);\n recordBenchEvent(existing ? 'keyHit' : 'keyMiss');\n\n if (!existing) {\n // Added: create new item instance\n const itemInstance = createItemInstance(key, item, i, forState);\n items.set(key, itemInstance);\n resultVNodes.push(itemInstance.scope.vnode as VNode);\n } else {\n // Exists: check if item changed (by identity)\n recordBenchEvent('itemReused');\n const itemChanged = existing.item !== item;\n const indexChanged =\n existing.indexSignal._hasBeenRead && existing.indexSignal.peek() !== i;\n\n if (itemChanged) {\n moveOnly = false;\n updateItemInstance(forState, existing, item);\n }\n\n if (indexChanged) {\n // Index changed: update index signal (triggers re-render if index is used)\n existing.indexSignal.set(i);\n }\n\n resultVNodes.push(existing.scope.vnode as VNode);\n }\n }\n\n // Remove deleted items\n for (const key of toRemove) {\n moveOnly = false;\n const itemInstance = items.get(key);\n if (itemInstance) {\n disposeItemInstance(forState, itemInstance, 'none');\n items.delete(key);\n }\n }\n\n forState.orderedKeys = newOrderedKeys;\n\n // Record reconcile timing\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n forState.orderedVNodes = resultVNodes;\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = moveOnly;\n\n return resultVNodes;\n}\n\nexport function evaluateForState<T>(forState: ForState<T>): VNode[] {\n if (!Array.isArray(forState.currentItems)) {\n throw new Error('For source must evaluate to an array');\n }\n\n forState._needsSourceReconcile = false;\n return reconcileForItems(forState, forState.currentItems);\n}\n\nexport function clearForDomUpdateState<T>(forState: ForState<T>): void {\n for (let i = 0; i < forState.orderedKeys.length; i++) {\n const key = forState.orderedKeys[i];\n const itemInstance = forState.items.get(key);\n if (itemInstance) {\n itemInstance.scope.needsDomUpdate = false;\n }\n }\n if (forState.fallbackScope) {\n forState.fallbackScope.needsDomUpdate = false;\n }\n forState.lastRemovedNodes = [];\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n forState._needsSourceReconcile = false;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"for.js","names":[],"sources":["../../src/runtime/for.ts"],"sourcesContent":["/**\n * For primitive runtime\n *\n * Manages per-item component instances and array reconciliation\n * to eliminate over-invalidation in list rendering.\n */\n\nimport { type ComponentInstance, getCurrentInstance } from './component';\nimport { claimHookIndex } from './component';\nimport { type DOMElement, type VNode } from '../common/vnode';\nimport { isDevelopmentEnvironment } from '../common/env';\nimport { teardownNodeSubtree } from '../renderer/cleanup';\nimport {\n createChildScope,\n disposeChildScope,\n type ChildScope,\n} from './child-scope';\nimport type { ForProps } from '../control/for';\nimport type { ForEachSource } from '../control/for';\nimport {\n markReactivePropsDirtySource,\n markReadableDerivedSubscribersDirty,\n notifyReadableReaders,\n recordReadableRead,\n type ReadableSource,\n} from './readable';\nimport type { FineGrainedEffectHandle } from './effect';\nimport {\n flushBenchMetrics,\n getBenchMetrics,\n isBenchBuildEnabled,\n isBenchMetricScopeActive,\n recordBenchEvent,\n recordBenchCounter,\n recordBenchFastLane,\n recordBenchTiming,\n resetBenchMetrics,\n withBenchMetricScope,\n} from './for-bench';\n\nconst BENCH_BUILD_ENABLED = isBenchBuildEnabled();\n\nexport {\n getBenchMetrics,\n isBenchMetricScopeActive,\n recordBenchEvent,\n recordBenchCounter,\n recordBenchTiming,\n resetBenchMetrics,\n withBenchMetricScope,\n};\n\nexport interface ForItemInstance<T> {\n key: string | number;\n item: T;\n reactiveItem: T;\n itemSignal: ForItemSignal<T> | null;\n itemPropertySignals: Map<PropertyKey, ForItemPropertySignal> | null;\n indexSignal: ForIndexSignal;\n scope: ChildScope;\n}\n\ntype ForItemSignal<T> = ReadableSource<T> &\n (() => T) & {\n peek(): T;\n set(newValue: T, notifyReaders?: boolean): void;\n };\n\ntype ForItemPropertySignal = ReadableSource<unknown> &\n (() => unknown) & {\n peek(): unknown;\n set(newValue: unknown, notifyReaders?: boolean): void;\n };\n\ntype ForIndexSignal = ReadableSource<number> &\n (() => number) & {\n peek(): number;\n set(newValue: number | ((prev: number) => number)): void;\n };\n\nexport type ForCommitStrategy =\n | 'APPEND'\n | 'TRUNCATE'\n | 'NO_REORDER'\n | 'SWAP'\n | 'FULL_KEYED';\n\nexport interface ForState<T> {\n kind: 'for';\n currentItems: T[];\n eachSource: ForEachSource<T>;\n fallback: VNode | null;\n fallbackScope: ChildScope | null;\n items: Map<string | number, ForItemInstance<T>>;\n orderedKeys: Array<string | number>;\n orderedItems: ForItemInstance<T>[];\n orderedVNodes: VNode[];\n byFn: NonNullable<ForProps<T>['by']> | ((item: T, index: number) => number);\n renderFn: (item: T, index: () => number) => VNode;\n parentInstance: ComponentInstance | null;\n lastCommitStrategy: ForCommitStrategy;\n lastRemovedNodes: Node[];\n pendingDirtyIndices: number[] | null;\n pendingSwapIndices: [number, number] | null;\n pendingMoveOnly: boolean;\n _hasResolvedItemDom: boolean;\n _needsSourceReconcile: boolean;\n _sourceEffect: FineGrainedEffectHandle<T[]> | null;\n _suspendSourceCommit: boolean;\n _enqueueBoundaryCommit?: (() => void) | null;\n _hasPendingBoundaryCommit?: boolean;\n devKeyKinds?: Map<string, 'number' | 'string'>;\n}\n\nconst forStates = new WeakMap<\n ComponentInstance,\n Map<number, ForState<unknown>>\n>();\n\nfunction getForStore(\n instance: ComponentInstance\n): Map<number, ForState<unknown>> {\n let store = forStates.get(instance);\n if (!store) {\n store = new Map();\n forStates.set(instance, store);\n }\n return store;\n}\n\nexport function createForState<T>(\n eachSource: ForEachSource<T>,\n byFn: ForState<T>['byFn'],\n renderFn: (item: T, index: () => number) => VNode,\n fallback: VNode | null\n): ForState<T> {\n const parentInstance = getCurrentInstance();\n\n return {\n kind: 'for',\n currentItems: [],\n eachSource,\n fallback,\n fallbackScope: null,\n items: new Map(),\n orderedKeys: [],\n orderedItems: [],\n orderedVNodes: [],\n byFn,\n renderFn,\n parentInstance,\n lastCommitStrategy: 'NO_REORDER',\n lastRemovedNodes: [],\n pendingDirtyIndices: null,\n pendingSwapIndices: null,\n pendingMoveOnly: false,\n _hasResolvedItemDom: false,\n _needsSourceReconcile: false,\n _sourceEffect: null,\n _suspendSourceCommit: false,\n _enqueueBoundaryCommit: null,\n _hasPendingBoundaryCommit: false,\n };\n}\n\nexport function useForState<T>(\n eachSource: ForEachSource<T>,\n byFn: ForState<T>['byFn'],\n renderFn: (item: T, index: () => number) => VNode,\n fallback: VNode | null\n): ForState<T> {\n const instance = getCurrentInstance();\n if (!instance) {\n throw new Error(\n 'For can only be created during component render execution.'\n );\n }\n\n const hookIndex = claimHookIndex(instance, 'For');\n const store = getForStore(instance);\n const existing = store.get(hookIndex) as ForState<T> | undefined;\n\n if (existing) {\n existing.eachSource = eachSource;\n existing.byFn = byFn;\n existing.renderFn = renderFn;\n existing.fallback = fallback;\n return existing;\n }\n\n const created = createForState(eachSource, byFn, renderFn, fallback);\n store.set(hookIndex, created as ForState<unknown>);\n\n (instance.cleanupFns ??= []).push(() => {\n created._sourceEffect?.cleanup();\n created._sourceEffect = null;\n store.delete(hookIndex);\n });\n\n return created;\n}\n\nfunction createForIndexSignal(initialIndex: number): ForIndexSignal {\n let indexValue = initialIndex;\n const readers = new Map<ComponentInstance, number>();\n\n const indexSignal = (() => {\n indexSignal._hasBeenRead = true;\n recordReadableRead(indexSignal);\n return indexValue;\n }) as ForIndexSignal;\n indexSignal._readers = readers;\n indexSignal.peek = () => indexValue;\n indexSignal.set = (newValue: number | ((prev: number) => number)) => {\n const nextValue =\n typeof newValue === 'function' ? newValue(indexValue) : newValue;\n if (nextValue !== indexValue) {\n indexValue = nextValue;\n markReadableDerivedSubscribersDirty(indexSignal);\n markReactivePropsDirtySource(indexSignal);\n notifyReadableReaders(indexSignal);\n }\n };\n indexSignal._hasBeenRead = false;\n\n return indexSignal;\n}\n\nfunction createForItemSignal<T>(initialItem: T): ForItemSignal<T> {\n let itemValue = initialItem;\n const readers = new Map<ComponentInstance, number>();\n\n const itemSignal = (() => {\n itemSignal._hasBeenRead = true;\n recordReadableRead(itemSignal);\n return itemValue;\n }) as ForItemSignal<T>;\n\n itemSignal._readers = readers;\n itemSignal.peek = () => itemValue;\n itemSignal.set = (newValue: T, notifyReaders = true) => {\n if (Object.is(itemValue, newValue)) {\n return;\n }\n\n itemValue = newValue;\n if (notifyReaders) {\n markReadableDerivedSubscribersDirty(itemSignal);\n markReactivePropsDirtySource(itemSignal);\n notifyReadableReaders(itemSignal);\n }\n };\n itemSignal._hasBeenRead = false;\n\n return itemSignal;\n}\n\nfunction createForItemPropertySignal(\n initialValue: unknown\n): ForItemPropertySignal {\n let propertyValue = initialValue;\n const readers = new Map<ComponentInstance, number>();\n\n const propertySignal = (() => {\n propertySignal._hasBeenRead = true;\n recordReadableRead(propertySignal);\n return propertyValue;\n }) as ForItemPropertySignal;\n\n propertySignal._readers = readers;\n propertySignal.peek = () => propertyValue;\n propertySignal.set = (newValue: unknown, notifyReaders = true) => {\n if (Object.is(propertyValue, newValue)) {\n return;\n }\n\n propertyValue = newValue;\n if (notifyReaders) {\n markReadableDerivedSubscribersDirty(propertySignal);\n markReactivePropsDirtySource(propertySignal);\n notifyReadableReaders(propertySignal);\n }\n };\n propertySignal._hasBeenRead = false;\n\n return propertySignal;\n}\n\nfunction readForItemProperty(item: unknown, prop: PropertyKey): unknown {\n return Reflect.get(Object(item), prop);\n}\n\nfunction haveSameOwnKeys(previousItem: unknown, nextItem: unknown): boolean {\n const previousKeys = Reflect.ownKeys(Object(previousItem));\n const nextKeys = Reflect.ownKeys(Object(nextItem));\n\n if (previousKeys.length !== nextKeys.length) {\n return false;\n }\n\n for (let i = 0; i < previousKeys.length; i += 1) {\n if (previousKeys[i] !== nextKeys[i]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction scopeReadsSource(\n scope: ChildScope,\n source: ReadableSource<unknown>\n): boolean {\n return source._readers?.has(scope.componentInstance) ?? false;\n}\n\nfunction getOrCreateForItemPropertySignal<T>(\n item: T,\n propertySignals: Map<PropertyKey, ForItemPropertySignal>,\n prop: PropertyKey\n): ForItemPropertySignal {\n const existingSignal = propertySignals.get(prop);\n if (existingSignal) {\n return existingSignal;\n }\n\n const propertySignal = createForItemPropertySignal(\n readForItemProperty(item, prop)\n );\n propertySignals.set(prop, propertySignal);\n return propertySignal;\n}\n\nfunction canProxyForItem(item: unknown): item is object {\n return (\n (typeof item === 'object' && item !== null) || typeof item === 'function'\n );\n}\n\nfunction createReactiveForItem<T>(\n itemSignal: ForItemSignal<T>,\n propertySignals: Map<PropertyKey, ForItemPropertySignal>\n): T {\n const target = Object.create(null) as Record<string | symbol, unknown>;\n\n return new Proxy(target, {\n get(target, prop, receiver) {\n const ownDescriptor = Reflect.getOwnPropertyDescriptor(target, prop);\n if (ownDescriptor) {\n return Reflect.get(target, prop, receiver);\n }\n\n const currentItem = itemSignal.peek();\n\n if (typeof prop !== 'symbol') {\n return getOrCreateForItemPropertySignal(\n currentItem,\n propertySignals,\n prop\n )();\n }\n\n recordReadableRead(itemSignal);\n return Reflect.get(Object(currentItem), prop, receiver);\n },\n has(target, prop) {\n recordReadableRead(itemSignal);\n return prop in target || prop in Object(itemSignal.peek());\n },\n ownKeys(target) {\n recordReadableRead(itemSignal);\n const keys = new Set<string | symbol>(Reflect.ownKeys(target));\n for (const key of Reflect.ownKeys(Object(itemSignal.peek()))) {\n keys.add(key);\n }\n\n return Array.from(keys);\n },\n getOwnPropertyDescriptor(target, prop) {\n recordReadableRead(itemSignal);\n const ownDescriptor = Reflect.getOwnPropertyDescriptor(target, prop);\n if (ownDescriptor) {\n return ownDescriptor;\n }\n\n return Object.getOwnPropertyDescriptor(Object(itemSignal.peek()), prop);\n },\n getPrototypeOf() {\n recordReadableRead(itemSignal);\n return Object.getPrototypeOf(Object(itemSignal.peek()));\n },\n }) as T;\n}\n\nfunction materializeItemVnode(\n key: string | number,\n vnode: VNode | undefined\n): void {\n if (vnode && typeof vnode === 'object' && 'type' in vnode) {\n const vn = vnode as DOMElement;\n vn.key = key;\n\n if (typeof vn.type === 'string') {\n if (!vn.props) vn.props = {};\n if (vn.props['data-key'] === undefined) {\n vn.props['data-key'] = String(key);\n }\n }\n }\n}\n\nfunction renderItemScope<T>(\n forState: ForState<T>,\n scope: ChildScope,\n item: T,\n indexSignal: ForIndexSignal,\n key: string | number\n): VNode {\n recordBenchEvent('rowFactory');\n const vnode = scope.render(() => forState.renderFn(item, indexSignal));\n materializeItemVnode(key, vnode);\n return vnode;\n}\n\nfunction failForValidation(message: string): never {\n throw new Error(message);\n}\n\nfunction validateForKeys<T>(forState: ForState<T>, newArray: T[]): void {\n if (!isDevelopmentEnvironment()) {\n return;\n }\n\n const seen = new Set<string | number>();\n const keyKinds = new Map<string, 'number' | 'string'>();\n for (let i = 0; i < newArray.length; i++) {\n const key = forState.byFn(newArray[i], i);\n\n if (key === null || key === undefined) {\n failForValidation(\n '[askr] Invalid For key detected. Keys should be stable, non-null, and unique within a For list.'\n );\n }\n\n if (seen.has(key)) {\n failForValidation(\n `[askr] Duplicate For key detected: ${String(key)}. Keys should be stable, non-null, and unique within a For list.`\n );\n }\n\n seen.add(key);\n\n const keyString = String(key);\n const keyKind = typeof key;\n const previousKeyKind = forState.devKeyKinds?.get(keyString);\n if (previousKeyKind && previousKeyKind !== keyKind) {\n failForValidation(\n `[askr] For key type changed for ${keyString}. Keys must remain consistently typed across renders.`\n );\n }\n keyKinds.set(keyString, keyKind as 'number' | 'string');\n }\n\n forState.devKeyKinds = keyKinds;\n}\n\ntype RemovedDomCleanupMode = 'none' | 'teardown' | 'full-clear';\n\nfunction disposeItemInstance<T>(\n forState: ForState<T>,\n itemInstance: ForItemInstance<T>,\n domCleanup: RemovedDomCleanupMode\n): void {\n recordBenchEvent('itemRemoved');\n const removedDom = itemInstance.scope.dom;\n\n try {\n disposeChildScope(itemInstance.scope);\n } catch (err) {\n if (isDevelopmentEnvironment()) {\n console.error('[For] Cleanup error:', err);\n }\n }\n\n if (!removedDom) {\n return;\n }\n\n if (removedDom instanceof Element) {\n if (domCleanup === 'teardown') {\n teardownNodeSubtree(removedDom);\n }\n }\n\n forState.lastRemovedNodes.push(removedDom);\n}\n\nexport function createItemInstance<T>(\n key: string | number,\n item: T,\n index: number,\n forState: ForState<T>\n): ForItemInstance<T> {\n recordBenchEvent('itemCreated');\n\n // Create index signal manually without going through state() hook\n // to avoid hook order violations (each For item creates its signal dynamically)\n const indexSignal = createForIndexSignal(index);\n const itemSignal = canProxyForItem(item) ? createForItemSignal(item) : null;\n const itemPropertySignals = itemSignal\n ? new Map<PropertyKey, ForItemPropertySignal>()\n : null;\n const reactiveItem =\n itemSignal && itemPropertySignals\n ? createReactiveForItem(itemSignal, itemPropertySignals)\n : item;\n let itemInstance: ForItemInstance<T> | null = null;\n const scope = createChildScope(forState.parentInstance, key, () => {\n if (forState._enqueueBoundaryCommit) {\n forState._enqueueBoundaryCommit();\n return;\n }\n\n const parent = forState.parentInstance;\n if (parent) {\n parent._enqueueRun?.();\n }\n });\n\n renderItemScope(forState, scope, reactiveItem, indexSignal, key);\n\n itemInstance = {\n key,\n item,\n reactiveItem,\n itemSignal,\n itemPropertySignals,\n indexSignal,\n scope,\n };\n\n return itemInstance;\n}\n\nfunction rerenderItemInstance<T>(\n forState: ForState<T>,\n itemInstance: ForItemInstance<T>,\n item: T\n): void {\n renderItemScope(\n forState,\n itemInstance.scope,\n item,\n itemInstance.indexSignal,\n itemInstance.key\n );\n}\n\nfunction updateItemInstance<T>(\n forState: ForState<T>,\n itemInstance: ForItemInstance<T>,\n item: T\n): boolean {\n if (itemInstance.item === item) {\n return false;\n }\n\n const previousItem = itemInstance.item;\n itemInstance.item = item;\n\n const scope = itemInstance.scope;\n let scopeReadsChangedSignal = false;\n const itemSignal = itemInstance.itemSignal;\n if (!itemSignal) {\n rerenderItemInstance(forState, itemInstance, item);\n return true;\n }\n\n const propertySignals = itemInstance.itemPropertySignals;\n const changedPropertySignals: Array<[ForItemPropertySignal, unknown]> = [];\n if (propertySignals && propertySignals.size > 0) {\n for (const [prop, propertySignal] of propertySignals) {\n const previousValue = readForItemProperty(previousItem, prop);\n const nextValue = readForItemProperty(item, prop);\n if (Object.is(previousValue, nextValue)) {\n continue;\n }\n\n if (scopeReadsSource(scope, propertySignal)) {\n scopeReadsChangedSignal = true;\n }\n\n changedPropertySignals.push([propertySignal, nextValue]);\n }\n }\n\n if (scopeReadsSource(scope, itemSignal)) {\n scopeReadsChangedSignal = true;\n }\n\n const itemShapeChanged =\n changedPropertySignals.length === 0 && !haveSameOwnKeys(previousItem, item);\n const notifyReaders =\n !scopeReadsChangedSignal &&\n (changedPropertySignals.length > 0 || itemShapeChanged);\n const visibleChange =\n scopeReadsChangedSignal ||\n changedPropertySignals.length > 0 ||\n itemShapeChanged;\n for (const [propertySignal, nextValue] of changedPropertySignals) {\n propertySignal.set(nextValue, notifyReaders);\n }\n itemSignal.set(item, notifyReaders);\n\n if (scopeReadsChangedSignal) {\n rerenderItemInstance(forState, itemInstance, itemInstance.reactiveItem);\n }\n\n return visibleChange;\n}\n\nconst FOR_FALLBACK_SCOPE_KEY = '__for-fallback__';\n\nfunction disposeFallbackScope<T>(\n forState: ForState<T>,\n domCleanup: RemovedDomCleanupMode\n): void {\n const fallbackScope = forState.fallbackScope;\n if (!fallbackScope) {\n return;\n }\n\n const removedDom = fallbackScope.dom;\n disposeChildScope(fallbackScope);\n forState.fallbackScope = null;\n\n if (!removedDom) {\n return;\n }\n\n if (removedDom instanceof Element) {\n if (domCleanup === 'teardown') {\n teardownNodeSubtree(removedDom);\n }\n }\n\n forState.lastRemovedNodes.push(removedDom);\n}\n\nfunction renderFallbackScope<T>(forState: ForState<T>): VNode[] {\n if (forState.fallback == null || forState.fallback === false) {\n if (forState.fallbackScope) {\n disposeFallbackScope(forState, 'none');\n }\n forState.orderedVNodes = [];\n forState.orderedItems = [];\n return [];\n }\n\n const fallbackScope =\n forState.fallbackScope ??\n createChildScope(forState.parentInstance, FOR_FALLBACK_SCOPE_KEY, () => {\n if (forState._enqueueBoundaryCommit) {\n forState._enqueueBoundaryCommit();\n return;\n }\n\n forState.parentInstance?._enqueueRun?.();\n });\n forState.fallbackScope = fallbackScope;\n\n const vnode = fallbackScope.render(() => forState.fallback as VNode);\n forState.orderedVNodes = vnode == null || vnode === false ? [] : [vnode];\n forState.orderedItems = [];\n return forState.orderedVNodes;\n}\n\nfunction disposeAllItems<T>(\n forState: ForState<T>,\n domCleanup: RemovedDomCleanupMode\n): void {\n const { items, orderedKeys } = forState;\n for (let index = 0; index < orderedKeys.length; index += 1) {\n const key = orderedKeys[index];\n const itemInstance = items.get(key);\n if (!itemInstance) {\n continue;\n }\n disposeItemInstance(forState, itemInstance, domCleanup);\n items.delete(key);\n }\n orderedKeys.length = 0;\n forState.orderedKeys = orderedKeys;\n}\n\nexport function reconcileForItems<T>(\n forState: ForState<T>,\n newArray: T[]\n): VNode[] {\n forState.currentItems = newArray;\n validateForKeys(forState, newArray);\n\n if (BENCH_BUILD_ENABLED) {\n resetBenchMetrics();\n }\n\n const reconcileStartMs = BENCH_BUILD_ENABLED ? performance.now() : 0;\n\n const { items, orderedKeys, byFn } = forState;\n const oldLen = orderedKeys.length;\n const newLen = newArray.length;\n forState.lastRemovedNodes = [];\n\n if (newLen === 0) {\n if (oldLen > 0) {\n disposeAllItems(forState, forState.fallback ? 'teardown' : 'none');\n }\n recordBenchFastLane('TRUNCATE');\n forState.lastCommitStrategy = 'TRUNCATE';\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n return renderFallbackScope(forState);\n }\n\n if (forState.fallbackScope) {\n disposeFallbackScope(forState, 'none');\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // FAST PATH A: APPEND\n // Guard: oldLen <= newLen && all old keys match new keys at same indices\n // ─────────────────────────────────────────────────────────────────────────\n if (oldLen < newLen) {\n let canUseAppendPath = true;\n for (let i = 0; i < oldLen; i++) {\n const key = byFn(newArray[i], i);\n if (key !== orderedKeys[i]) {\n canUseAppendPath = false;\n break;\n }\n }\n\n if (canUseAppendPath) {\n recordBenchFastLane('APPEND');\n forState.lastCommitStrategy = 'APPEND';\n const resultVNodes = forState.orderedVNodes;\n const resultItems = forState.orderedItems;\n resultVNodes.length = newLen;\n resultItems.length = newLen;\n\n // Update existing rows in-place\n for (let i = 0; i < oldLen; i++) {\n const item = newArray[i];\n const key = orderedKeys[i];\n const existing = resultItems[i] ?? items.get(key)!;\n\n updateItemInstance(forState, existing, item);\n\n resultItems[i] = existing;\n resultVNodes[i] = existing.scope.vnode as VNode;\n }\n\n recordBenchEvent('itemReused', oldLen);\n\n // Create and append new rows\n for (let i = oldLen; i < newLen; i++) {\n const item = newArray[i];\n const key = byFn(item, i);\n const itemInstance = createItemInstance(key, item, i, forState);\n items.set(key, itemInstance);\n resultItems[i] = itemInstance;\n resultVNodes[i] = itemInstance.scope.vnode as VNode;\n orderedKeys[i] = key;\n }\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n forState.orderedVNodes = resultVNodes;\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n\n return resultVNodes;\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // FAST PATH B: TRUNCATE\n // Guard: newLen <= oldLen && all new keys match old keys at same indices\n // ─────────────────────────────────────────────────────────────────────────\n if (newLen < oldLen) {\n if (oldLen === newLen + 1) {\n let removedIndex = -1;\n\n for (let i = 0; i < newLen; i++) {\n const nextKey = byFn(newArray[i], i);\n if (nextKey !== orderedKeys[i]) {\n removedIndex = i;\n break;\n }\n }\n\n if (removedIndex !== -1) {\n let canUseRemoveOnePath = true;\n for (let i = removedIndex; i < newLen; i++) {\n const nextKey = byFn(newArray[i], i);\n if (nextKey !== orderedKeys[i + 1]) {\n canUseRemoveOnePath = false;\n break;\n }\n }\n\n if (canUseRemoveOnePath) {\n recordBenchFastLane('REMOVE_ONE');\n forState.lastCommitStrategy = 'NO_REORDER';\n\n const previousOrderedItems = forState.orderedItems.slice();\n const resultVNodes = forState.orderedVNodes;\n const resultItems = forState.orderedItems;\n resultVNodes.length = newLen;\n resultItems.length = newLen;\n const dirtyIndices: number[] = [];\n\n for (let i = 0; i < newLen; i++) {\n const item = newArray[i];\n const key = i < removedIndex ? orderedKeys[i] : orderedKeys[i + 1];\n const existing = items.get(key)!;\n const scopeNeedsDomUpdate = existing.scope.needsDomUpdate;\n\n const itemChanged = existing.item !== item;\n const indexSignal = existing.indexSignal;\n const indexChanged =\n indexSignal._hasBeenRead && indexSignal.peek() !== i;\n\n if (itemChanged) {\n updateItemInstance(forState, existing, item);\n }\n\n if (indexChanged) {\n indexSignal.set(i);\n }\n\n if (itemChanged || indexChanged || scopeNeedsDomUpdate) {\n dirtyIndices.push(i);\n }\n\n resultItems[i] = existing;\n resultVNodes[i] = existing.scope.vnode as VNode;\n }\n\n recordBenchEvent('itemReused', newLen);\n\n const removedKey = orderedKeys[removedIndex];\n const removedItem = items.get(removedKey);\n if (removedItem) {\n disposeItemInstance(forState, removedItem, 'teardown');\n items.delete(removedKey);\n }\n\n const nextOrderedKeys = orderedKeys.slice(0, newLen);\n const nextOrderedItems = previousOrderedItems.slice(0, newLen);\n for (let i = removedIndex; i < newLen; i++) {\n nextOrderedKeys[i] = orderedKeys[i + 1];\n nextOrderedItems[i] = previousOrderedItems[i + 1];\n }\n forState.orderedKeys = nextOrderedKeys;\n forState.orderedItems = nextOrderedItems;\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming(\n 'reconcile',\n performance.now() - reconcileStartMs\n );\n flushBenchMetrics();\n }\n\n forState.pendingDirtyIndices = dirtyIndices;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n\n return resultVNodes;\n }\n }\n }\n\n let canUseTruncatePath = true;\n for (let i = 0; i < newLen; i++) {\n const key = byFn(newArray[i], i);\n if (key !== orderedKeys[i]) {\n canUseTruncatePath = false;\n break;\n }\n }\n\n if (canUseTruncatePath) {\n recordBenchFastLane('TRUNCATE');\n forState.lastCommitStrategy = 'TRUNCATE';\n const resultVNodes = forState.orderedVNodes;\n const resultItems = forState.orderedItems;\n resultVNodes.length = newLen;\n resultItems.length = newLen;\n const isFullClear = newLen === 0;\n\n // Update existing rows in-place\n for (let i = 0; i < newLen; i++) {\n const item = newArray[i];\n const key = orderedKeys[i];\n const existing = items.get(key)!;\n\n updateItemInstance(forState, existing, item);\n\n resultItems[i] = existing;\n resultVNodes[i] = existing.scope.vnode as VNode;\n }\n\n recordBenchEvent('itemReused', newLen);\n\n // Remove tail rows\n for (let i = newLen; i < oldLen; i++) {\n const key = orderedKeys[i];\n const itemInstance = items.get(key);\n if (itemInstance) {\n disposeItemInstance(\n forState,\n itemInstance,\n isFullClear ? 'full-clear' : 'teardown'\n );\n items.delete(key);\n }\n }\n\n orderedKeys.length = newLen;\n forState.orderedKeys = orderedKeys;\n forState.orderedItems.length = newLen;\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n forState.orderedVNodes = resultVNodes;\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n\n return resultVNodes;\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // FAST PATH C: NO-REORDER (in-place update only)\n // Guard: oldLen === newLen && keys match at all indices\n // ─────────────────────────────────────────────────────────────────────────\n if (oldLen === newLen) {\n let canUseNoReorderPath = true;\n for (let i = 0; i < oldLen; i++) {\n const key = byFn(newArray[i], i);\n if (key !== orderedKeys[i]) {\n canUseNoReorderPath = false;\n break;\n }\n }\n\n if (canUseNoReorderPath) {\n recordBenchFastLane('NO_REORDER');\n forState.lastCommitStrategy = 'NO_REORDER';\n const resultVNodes = forState.orderedVNodes;\n const resultItems = forState.orderedItems;\n resultVNodes.length = oldLen;\n resultItems.length = oldLen;\n const dirtyIndices: number[] = [];\n // Update in-place only, no DOM moves needed\n for (let i = 0; i < oldLen; i++) {\n const item = newArray[i];\n const key = orderedKeys[i];\n const existing = items.get(key)!;\n const itemChanged = existing.item !== item;\n\n if (itemChanged) {\n updateItemInstance(forState, existing, item);\n }\n\n if (!itemChanged && existing.scope.needsDomUpdate) {\n dirtyIndices.push(i);\n }\n\n resultItems[i] = existing;\n resultVNodes[i] = existing.scope.vnode as VNode;\n }\n\n recordBenchEvent('itemReused', oldLen);\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n forState.pendingDirtyIndices = dirtyIndices;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n\n return resultVNodes;\n }\n\n let firstMismatch = -1;\n let secondMismatch = -1;\n let firstMismatchKey: string | number | null = null;\n let secondMismatchKey: string | number | null = null;\n let mismatchCount = 0;\n let canUseSwapPath = true;\n\n for (let i = 0; i < oldLen; i++) {\n const item = newArray[i];\n const key = byFn(newArray[i], i);\n if (key === orderedKeys[i]) {\n const existing = items.get(key);\n if (existing && existing.item !== item) {\n canUseSwapPath = false;\n break;\n }\n continue;\n }\n\n mismatchCount++;\n if (firstMismatch === -1) {\n firstMismatch = i;\n firstMismatchKey = key;\n continue;\n }\n\n if (secondMismatch === -1) {\n secondMismatch = i;\n secondMismatchKey = key;\n continue;\n }\n\n mismatchCount = 3;\n break;\n }\n\n if (\n canUseSwapPath &&\n mismatchCount === 2 &&\n firstMismatch !== -1 &&\n secondMismatch !== -1 &&\n firstMismatchKey === orderedKeys[secondMismatch] &&\n secondMismatchKey === orderedKeys[firstMismatch]\n ) {\n recordBenchFastLane('SWAP');\n recordBenchEvent('itemMoved');\n recordBenchEvent('itemMoved');\n\n forState.lastCommitStrategy = 'SWAP';\n\n const nextOrderedKeys = orderedKeys.slice();\n nextOrderedKeys[firstMismatch] = firstMismatchKey;\n nextOrderedKeys[secondMismatch] = secondMismatchKey;\n\n const resultVNodes = forState.orderedVNodes;\n const firstExisting = items.get(firstMismatchKey)!;\n const secondExisting = items.get(secondMismatchKey)!;\n const firstItem = newArray[firstMismatch];\n const secondItem = newArray[secondMismatch];\n const nextOrderedItems = forState.orderedItems.slice();\n nextOrderedItems[firstMismatch] = secondExisting;\n nextOrderedItems[secondMismatch] = firstExisting;\n\n recordBenchEvent('itemReused');\n recordBenchEvent('itemReused');\n\n if (firstExisting.item !== firstItem) {\n updateItemInstance(forState, firstExisting, firstItem);\n }\n\n if (secondExisting.item !== secondItem) {\n updateItemInstance(forState, secondExisting, secondItem);\n }\n\n if (\n firstExisting.indexSignal._hasBeenRead &&\n firstExisting.indexSignal.peek() !== firstMismatch\n ) {\n firstExisting.indexSignal.set(firstMismatch);\n }\n\n if (\n secondExisting.indexSignal._hasBeenRead &&\n secondExisting.indexSignal.peek() !== secondMismatch\n ) {\n secondExisting.indexSignal.set(secondMismatch);\n }\n\n resultVNodes[firstMismatch] = firstExisting.scope.vnode as VNode;\n resultVNodes[secondMismatch] = secondExisting.scope.vnode as VNode;\n\n forState.orderedKeys = nextOrderedKeys;\n forState.orderedItems = nextOrderedItems;\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = [firstMismatch, secondMismatch];\n forState.pendingMoveOnly = true;\n\n return resultVNodes;\n }\n\n let canUseMoveOnlyPath = true;\n const moveOnlyKeys: Array<string | number> = [];\n const moveOnlyItems: ForItemInstance<T>[] = [];\n const moveOnlyVNodes: VNode[] = [];\n\n for (let i = 0; i < oldLen; i++) {\n const item = newArray[i];\n const key = byFn(item, i);\n const existing = items.get(key);\n\n if (\n !existing ||\n existing.item !== item ||\n (existing.indexSignal._hasBeenRead && existing.indexSignal.peek() !== i)\n ) {\n canUseMoveOnlyPath = false;\n break;\n }\n\n moveOnlyKeys[i] = key;\n moveOnlyItems[i] = existing;\n moveOnlyVNodes[i] = existing.scope.vnode as VNode;\n recordBenchEvent('itemReused');\n }\n\n if (canUseMoveOnlyPath) {\n recordBenchFastLane('FULL_KEYED');\n forState.lastCommitStrategy = 'FULL_KEYED';\n forState.orderedKeys = moveOnlyKeys;\n forState.orderedItems = moveOnlyItems;\n forState.orderedVNodes = moveOnlyVNodes;\n\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = true;\n\n return moveOnlyVNodes;\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────────\n // FULL KEYED RECONCILIATION (slow path for complex reorders)\n // Avoid allocating newKeyMap: iterate directly and track removals\n // ─────────────────────────────────────────────────────────────────────────\n recordBenchFastLane('FULL_KEYED');\n forState.lastCommitStrategy = 'FULL_KEYED';\n\n const toRemove = new Set(orderedKeys);\n const newOrderedKeys: Array<string | number> = [];\n const newOrderedItems: ForItemInstance<T>[] = [];\n const resultVNodes: VNode[] = [];\n let moveOnly = toRemove.size === newArray.length;\n\n // Single pass: iterate new array directly, no intermediate map\n for (let i = 0; i < newArray.length; i++) {\n const item = newArray[i];\n const key = byFn(item, i);\n recordBenchEvent('keyLookup');\n\n toRemove.delete(key);\n newOrderedKeys.push(key);\n\n const existing = items.get(key);\n recordBenchEvent(existing ? 'keyHit' : 'keyMiss');\n\n if (!existing) {\n // Added: create new item instance\n const itemInstance = createItemInstance(key, item, i, forState);\n items.set(key, itemInstance);\n newOrderedItems.push(itemInstance);\n resultVNodes.push(itemInstance.scope.vnode as VNode);\n } else {\n // Exists: check if item changed (by identity)\n recordBenchEvent('itemReused');\n const itemChanged = existing.item !== item;\n const indexChanged =\n existing.indexSignal._hasBeenRead && existing.indexSignal.peek() !== i;\n\n if (itemChanged) {\n moveOnly = false;\n updateItemInstance(forState, existing, item);\n }\n\n if (indexChanged) {\n // Index changed: update index signal (triggers re-render if index is used)\n existing.indexSignal.set(i);\n }\n\n newOrderedItems.push(existing);\n resultVNodes.push(existing.scope.vnode as VNode);\n }\n }\n\n // Remove deleted items\n for (const key of toRemove) {\n moveOnly = false;\n const itemInstance = items.get(key);\n if (itemInstance) {\n disposeItemInstance(forState, itemInstance, 'none');\n items.delete(key);\n }\n }\n\n forState.orderedKeys = newOrderedKeys;\n forState.orderedItems = newOrderedItems;\n\n // Record reconcile timing\n if (BENCH_BUILD_ENABLED) {\n recordBenchTiming('reconcile', performance.now() - reconcileStartMs);\n flushBenchMetrics();\n }\n\n forState.orderedVNodes = resultVNodes;\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = moveOnly;\n\n return resultVNodes;\n}\n\nexport function evaluateForState<T>(forState: ForState<T>): VNode[] {\n if (!Array.isArray(forState.currentItems)) {\n throw new Error('For source must evaluate to an array');\n }\n\n forState._needsSourceReconcile = false;\n return reconcileForItems(forState, forState.currentItems);\n}\n\nexport function clearForDomUpdateState<T>(forState: ForState<T>): void {\n const dirtyIndices = forState.pendingDirtyIndices;\n if (dirtyIndices && dirtyIndices.length > 0) {\n for (let i = 0; i < dirtyIndices.length; i++) {\n const itemInstance = forState.orderedItems[dirtyIndices[i]];\n if (itemInstance) {\n itemInstance.scope.needsDomUpdate = false;\n }\n }\n } else {\n for (let i = 0; i < forState.orderedKeys.length; i++) {\n const key = forState.orderedKeys[i];\n const itemInstance = forState.items.get(key);\n if (itemInstance) {\n itemInstance.scope.needsDomUpdate = false;\n }\n }\n }\n\n if (forState.fallbackScope) {\n forState.fallbackScope.needsDomUpdate = false;\n }\n forState.lastRemovedNodes = [];\n forState.pendingDirtyIndices = null;\n forState.pendingSwapIndices = null;\n forState.pendingMoveOnly = false;\n forState._needsSourceReconcile = false;\n forState._hasResolvedItemDom = forState.orderedKeys.length > 0;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"operations.d.ts","names":[],"sources":["../../src/runtime/operations.ts"],"mappings":";UAYiB,cAAA;EACf,KAAA,EAAO,CAAA;EACP,OAAA;EACA,KAAA,EAAO,KAAA;EACP,OAAA;AAAA;;;;;;;;;AAaF;;iBAAgB,QAAA,GAAA,CACd,EAAA,GAAK,IAAA;EAAQ,MAAA,EAAQ,WAAA;AAAA,MAAkB,OAAA,CAAQ,CAAA,IAAK,CAAA,EACpD,IAAA,eACC,cAAA,CAAe,CAAA;AAAA,iBAsNF,EAAA,CACd,MAAA,EAAQ,WAAA,EACR,KAAA,UACA,OAAA,EAAS,aAAA;AAAA,iBAiBK,KAAA,CAAM,UAAA,UAAoB,EAAA;AAAA,iBAgB1B,MAAA,GAAA,CACd,OAAA,WACA,QAAA,GAAW,MAAA;EACR,KAAA,EAAO,CAAA;EAAU,OAAA;EAAkB,KAAA,EAAO,KAAA;AAAA;AAAA,iBAK/B,IAAA,CACd,EAAA,8BAAgC,OAAA;;;;;;;;;;;iBAwBlB,OAAA,GAAA,CAAW,EAAA,QAAU,CAAA,SAAU,CAAA"}
1
+ {"version":3,"file":"operations.d.ts","names":[],"sources":["../../src/runtime/operations.ts"],"mappings":";UAaiB,cAAA;EACf,KAAA,EAAO,CAAA;EACP,OAAA;EACA,KAAA,EAAO,KAAA;EACP,OAAA;AAAA;;;;;;;;;AAaF;;iBAAgB,QAAA,GAAA,CACd,EAAA,GAAK,IAAA;EAAQ,MAAA,EAAQ,WAAA;AAAA,MAAkB,OAAA,CAAQ,CAAA,IAAK,CAAA,EACpD,IAAA,eACC,cAAA,CAAe,CAAA;AAAA,iBAsNF,EAAA,CACd,MAAA,EAAQ,WAAA,EACR,KAAA,UACA,OAAA,EAAS,aAAA;AAAA,iBAiBK,KAAA,CAAM,UAAA,UAAoB,EAAA;AAAA,iBAgB1B,MAAA,GAAA,CACd,OAAA,WACA,QAAA,GAAW,MAAA;EACR,KAAA,EAAO,CAAA;EAAU,OAAA;EAAkB,KAAA,EAAO,KAAA;AAAA;AAAA,iBAK/B,IAAA,CACd,EAAA,8BAAgC,OAAA;;;;;;;;;;;iBAwBlB,OAAA,GAAA,CAAW,EAAA,QAAU,CAAA,SAAU,CAAA"}