@llui/dom 0.0.33 → 0.0.35
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.
- package/dist/hmr.js +5 -0
- package/dist/hmr.js.map +1 -1
- package/dist/mount.d.ts.map +1 -1
- package/dist/mount.js +5 -0
- package/dist/mount.js.map +1 -1
- package/dist/primitives/branch.d.ts.map +1 -1
- package/dist/primitives/branch.js +18 -3
- package/dist/primitives/branch.js.map +1 -1
- package/dist/primitives/child.d.ts.map +1 -1
- package/dist/primitives/child.js +15 -3
- package/dist/primitives/child.js.map +1 -1
- package/dist/primitives/each.d.ts.map +1 -1
- package/dist/primitives/each.js +36 -14
- package/dist/primitives/each.js.map +1 -1
- package/dist/primitives/foreign.d.ts.map +1 -1
- package/dist/primitives/foreign.js +15 -3
- package/dist/primitives/foreign.js.map +1 -1
- package/dist/primitives/sample.d.ts +32 -1
- package/dist/primitives/sample.d.ts.map +1 -1
- package/dist/primitives/sample.js +52 -2
- package/dist/primitives/sample.js.map +1 -1
- package/dist/primitives/show.d.ts.map +1 -1
- package/dist/primitives/show.js +13 -1
- package/dist/primitives/show.js.map +1 -1
- package/dist/primitives/virtual-each.d.ts.map +1 -1
- package/dist/primitives/virtual-each.js +25 -5
- package/dist/primitives/virtual-each.js.map +1 -1
- package/dist/render-context.d.ts +3 -0
- package/dist/render-context.d.ts.map +1 -1
- package/dist/render-context.js +27 -1
- package/dist/render-context.js.map +1 -1
- package/dist/types.d.ts +23 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/update-loop.d.ts +6 -1
- package/dist/update-loop.d.ts.map +1 -1
- package/dist/update-loop.js +214 -59
- package/dist/update-loop.js.map +1 -1
- package/package.json +1 -1
package/dist/primitives/each.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getRenderContext, setRenderContext, clearRenderContext, } from '../render-context.js';
|
|
1
|
+
import { getRenderContext, setRenderContext, clearRenderContext, enterAccessor, exitAccessor, } from '../render-context.js';
|
|
2
2
|
import { createLifetime, disposeLifetime, disposeLifetimesBulk, addDisposer, removeOrphanedChildren, } from '../lifetime.js';
|
|
3
3
|
import { getFlatBindings, setFlatBindings } from '../binding.js';
|
|
4
4
|
import { FULL_MASK } from '../update-loop.js';
|
|
@@ -17,6 +17,27 @@ export function registerOnRemove(cb) {
|
|
|
17
17
|
if (activeRemoveCallbacks)
|
|
18
18
|
activeRemoveCallbacks.push(cb);
|
|
19
19
|
}
|
|
20
|
+
// Wrap accessor invocations so `sample()` calls inside them throw a targeted
|
|
21
|
+
// error. The wrappers also localise the contract: every items/key call goes
|
|
22
|
+
// through these, so a future change (e.g. instrumentation) has one site.
|
|
23
|
+
function callItems(opts, state) {
|
|
24
|
+
enterAccessor('each().items');
|
|
25
|
+
try {
|
|
26
|
+
return opts.items(state);
|
|
27
|
+
}
|
|
28
|
+
finally {
|
|
29
|
+
exitAccessor();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function callKey(opts, item) {
|
|
33
|
+
enterAccessor('each().key');
|
|
34
|
+
try {
|
|
35
|
+
return opts.key(item);
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
exitAccessor();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
20
41
|
// Reusable render context for buildEntry — avoids object allocation per entry.
|
|
21
42
|
// All fields except `rootLifetime`, `state`, `allBindings`, `structuralBlocks`, `dom`
|
|
22
43
|
// are copied from the surrounding render context per reconcile call, so the
|
|
@@ -49,7 +70,7 @@ export function each(opts) {
|
|
|
49
70
|
// Entries whose leave animation is still in progress. Their DOM nodes
|
|
50
71
|
// remain in the parent until the leave Promise resolves.
|
|
51
72
|
const leaving = [];
|
|
52
|
-
const initialItems = opts
|
|
73
|
+
const initialItems = callItems(opts, ctx.state);
|
|
53
74
|
let lastItemsRef = initialItems;
|
|
54
75
|
// Dev-only diff tracking: if the owning component has an _eachDiffLog
|
|
55
76
|
// (installed by devtools), we capture key sets before/after each
|
|
@@ -109,7 +130,7 @@ export function each(opts) {
|
|
|
109
130
|
const parent = anchor.parentNode;
|
|
110
131
|
if (!parent)
|
|
111
132
|
return;
|
|
112
|
-
const newItems = opts
|
|
133
|
+
const newItems = callItems(opts, state);
|
|
113
134
|
// Fast path: same array reference → skip entirely.
|
|
114
135
|
if (newItems === lastItemsRef)
|
|
115
136
|
return;
|
|
@@ -125,7 +146,7 @@ export function each(opts) {
|
|
|
125
146
|
/** Same keys, only item data changed — skip mismatch/swap detection.
|
|
126
147
|
* Compiler calls this when it knows the array structure is unchanged. */
|
|
127
148
|
reconcileItems(state) {
|
|
128
|
-
const newItems = opts
|
|
149
|
+
const newItems = callItems(opts, state);
|
|
129
150
|
lastItemsRef = newItems;
|
|
130
151
|
const len = Math.min(entries.length, newItems.length);
|
|
131
152
|
for (let i = 0; i < len; i++) {
|
|
@@ -173,7 +194,7 @@ export function each(opts) {
|
|
|
173
194
|
* patterns where items are removed but order is preserved. Walks old
|
|
174
195
|
* and new arrays in parallel — O(n) with no Map/Set allocation. */
|
|
175
196
|
reconcileRemove(state) {
|
|
176
|
-
const newItems = opts
|
|
197
|
+
const newItems = callItems(opts, state);
|
|
177
198
|
lastItemsRef = newItems;
|
|
178
199
|
const parent = anchor.parentNode;
|
|
179
200
|
if (!parent)
|
|
@@ -192,7 +213,7 @@ export function each(opts) {
|
|
|
192
213
|
let didRemove = false;
|
|
193
214
|
for (let oi = 0; oi < oldLen; oi++) {
|
|
194
215
|
const entry = entries[oi];
|
|
195
|
-
if (ni < newLen && entry.key === opts
|
|
216
|
+
if (ni < newLen && entry.key === callKey(opts, newItems[ni])) {
|
|
196
217
|
// Entry survives — update if item ref changed
|
|
197
218
|
if (entry.item !== newItems[ni]) {
|
|
198
219
|
updateEntry(entry, newItems[ni], ni);
|
|
@@ -230,7 +251,7 @@ export function each(opts) {
|
|
|
230
251
|
/** Update only entries at stride intervals — O(k) where k = n/stride.
|
|
231
252
|
* The compiler passes the stride from the detected for-loop pattern. */
|
|
232
253
|
reconcileChanged(state, stride) {
|
|
233
|
-
const newItems = opts
|
|
254
|
+
const newItems = callItems(opts, state);
|
|
234
255
|
lastItemsRef = newItems;
|
|
235
256
|
for (let i = 0; i < entries.length && i < newItems.length; i += stride) {
|
|
236
257
|
const entry = entries[i];
|
|
@@ -338,7 +359,7 @@ function fireEnter(entry, opts) {
|
|
|
338
359
|
}
|
|
339
360
|
}
|
|
340
361
|
function buildEntry(item, index, opts, parentLifetime, ctx, state) {
|
|
341
|
-
const key = opts
|
|
362
|
+
const key = callKey(opts, item);
|
|
342
363
|
// Use a lightweight scope — just needs itemUpdaters for per-item bindings.
|
|
343
364
|
// Full scope features (disposers, bindings, children) are only needed when
|
|
344
365
|
// the render callback uses structural primitives or selector.bind().
|
|
@@ -513,7 +534,7 @@ function reconcileEntries(entries, newItems, opts, parentLifetime, parent, ancho
|
|
|
513
534
|
const newItem = newItems[i];
|
|
514
535
|
if (entry.item === newItem)
|
|
515
536
|
continue;
|
|
516
|
-
const newKey = opts
|
|
537
|
+
const newKey = callKey(opts, newItem);
|
|
517
538
|
if (entry.key === newKey) {
|
|
518
539
|
updateEntry(entry, newItem, i);
|
|
519
540
|
continue;
|
|
@@ -534,7 +555,8 @@ function reconcileEntries(entries, newItems, opts, parentLifetime, parent, ancho
|
|
|
534
555
|
if (mismatchCount === 2) {
|
|
535
556
|
const e1 = entries[mismatch1];
|
|
536
557
|
const e2 = entries[mismatch2];
|
|
537
|
-
if (e1.key === opts
|
|
558
|
+
if (e1.key === callKey(opts, newItems[mismatch2]) &&
|
|
559
|
+
e2.key === callKey(opts, newItems[mismatch1])) {
|
|
538
560
|
// DOM swap
|
|
539
561
|
const refI = e1.nodes[0];
|
|
540
562
|
const refAfterJ = e2.nodes[e2.nodes.length - 1].nextSibling;
|
|
@@ -553,13 +575,13 @@ function reconcileEntries(entries, newItems, opts, parentLifetime, parent, ancho
|
|
|
553
575
|
}
|
|
554
576
|
// Fast path 5: full replace — no shared keys between old and new.
|
|
555
577
|
// Skipped when opts.leave is set so departing items can animate individually.
|
|
556
|
-
if (!hasLeave && oldLen > 0 && opts
|
|
578
|
+
if (!hasLeave && oldLen > 0 && callKey(opts, newItems[0]) !== entries[0].key) {
|
|
557
579
|
const oldKeys = new Set();
|
|
558
580
|
for (const entry of entries)
|
|
559
581
|
oldKeys.add(entry.key);
|
|
560
582
|
let anyShared = false;
|
|
561
583
|
for (let i = 0; i < newLen; i++) {
|
|
562
|
-
if (oldKeys.has(opts
|
|
584
|
+
if (oldKeys.has(callKey(opts, newItems[i]))) {
|
|
563
585
|
anyShared = true;
|
|
564
586
|
break;
|
|
565
587
|
}
|
|
@@ -615,7 +637,7 @@ function reconcileEntries(entries, newItems, opts, parentLifetime, parent, ancho
|
|
|
615
637
|
const newlyAdded = [];
|
|
616
638
|
for (let i = 0; i < newLen; i++) {
|
|
617
639
|
const item = newItems[i];
|
|
618
|
-
const key = opts
|
|
640
|
+
const key = callKey(opts, item);
|
|
619
641
|
usedKeys.add(key);
|
|
620
642
|
const existing = oldByKey.get(key);
|
|
621
643
|
if (existing) {
|
|
@@ -724,7 +746,7 @@ function updateEntry(entry, item, index) {
|
|
|
724
746
|
}
|
|
725
747
|
function isAppendOnly(entries, newItems, opts) {
|
|
726
748
|
for (let i = 0; i < entries.length; i++) {
|
|
727
|
-
if (entries[i].key !== opts
|
|
749
|
+
if (entries[i].key !== callKey(opts, newItems[i]))
|
|
728
750
|
return false;
|
|
729
751
|
}
|
|
730
752
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"each.js","sourceRoot":"","sources":["../../src/primitives/each.ts"],"names":[],"mappings":"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","sourcesContent":["import type { EachOptions, ItemAccessor, Lifetime } from '../types.js'\nimport {\n getRenderContext,\n setRenderContext,\n clearRenderContext,\n type RenderContext,\n} from '../render-context.js'\nimport {\n createLifetime,\n disposeLifetime,\n disposeLifetimesBulk,\n addDisposer,\n removeOrphanedChildren,\n} from '../lifetime.js'\nimport { getFlatBindings, setFlatBindings } from '../binding.js'\nimport { FULL_MASK } from '../update-loop.js'\nimport type { StructuralBlock } from '../structural.js'\nimport { createView } from '../view-helpers.js'\n\n// Clear callbacks — registered by selector.bind() during render, called by reconcileClear().\n// Eliminates per-row disposers (1000 Set.delete calls → 1 registry.clear() call).\nlet activeClearCallbacks: Array<() => void> | null = null\nlet activeRemoveCallbacks: Array<(key: string | number) => void> | null = null\n\n/** Register a callback to run when the current each() block clears. */\nexport function registerOnClear(cb: () => void): void {\n if (activeClearCallbacks) activeClearCallbacks.push(cb)\n}\n\n/** Register a callback to run when a single row is removed by key. */\nexport function registerOnRemove(cb: (key: string | number) => void): void {\n if (activeRemoveCallbacks) activeRemoveCallbacks.push(cb)\n}\n\n// Reusable render context for buildEntry — avoids object allocation per entry.\n// All fields except `rootLifetime`, `state`, `allBindings`, `structuralBlocks`, `dom`\n// are copied from the surrounding render context per reconcile call, so the\n// initial shape's null/empty values are never observed in practice.\nconst buildCtx: RenderContext = {\n rootLifetime: null as unknown as Lifetime,\n state: null,\n allBindings: [],\n structuralBlocks: [],\n dom: null as unknown as import('../dom-env.js').DomEnv,\n}\n\n// Reusable render bag — mutated per entry instead of allocating new objects\nconst buildBag: Record<string, unknown> = {\n send: null,\n get item() {\n return (buildBag._getItemProxy as () => unknown)()\n },\n acc: null,\n index: null,\n _getItemProxy: null,\n}\n\ninterface Entry<T> {\n key: string | number\n item: T\n current: T\n index: number\n scope: Lifetime\n nodes: Node[]\n /** Per-item updaters — stored on entry directly to avoid scope overhead for leaf rows */\n updaters: Array<() => void>\n}\n\nexport function each<S, T, M = unknown>(opts: EachOptions<S, T, M>): Node[] {\n const ctx = getRenderContext('each')\n const parentLifetime = ctx.rootLifetime\n const blocks = ctx.structuralBlocks\n\n const anchor = ctx.dom.createComment('each')\n const entries: Entry<T>[] = []\n const clearCallbacks: Array<() => void> = []\n const removeCallbacks: Array<(key: string | number) => void> = []\n // Entries whose leave animation is still in progress. Their DOM nodes\n // remain in the parent until the leave Promise resolves.\n const leaving: Entry<T>[] = []\n\n const initialItems = opts.items(ctx.state as S)\n let lastItemsRef = initialItems\n\n // Dev-only diff tracking: if the owning component has an _eachDiffLog\n // (installed by devtools), we capture key sets before/after each\n // key-mutating reconcile call and emit an EachDiff entry. The siteId\n // is derived from this each() block's position in the flat block\n // array at registration time — stable for the lifetime of the block.\n const inst = ctx.instance\n const eachSiteId = inst?._eachDiffLog !== undefined ? `each#${blocks.length}` : ''\n const snapshotKeys = (): string[] | null => {\n if (inst?._eachDiffLog === undefined) return null\n const keys: string[] = []\n for (let i = 0; i < entries.length; i++) keys.push(String(entries[i]!.key))\n return keys\n }\n const emitDiff = (oldKeys: string[] | null): void => {\n if (oldKeys === null || inst?._eachDiffLog === undefined) return\n const newKeys: string[] = []\n for (let i = 0; i < entries.length; i++) newKeys.push(String(entries[i]!.key))\n const oldKeySet = new Set(oldKeys)\n const newKeySet = new Set(newKeys)\n const added: string[] = []\n const removed: string[] = []\n const moved: Array<{ key: string; from: number; to: number }> = []\n const reused: string[] = []\n for (const k of newKeys) if (!oldKeySet.has(k)) added.push(k)\n for (const k of oldKeys) if (!newKeySet.has(k)) removed.push(k)\n for (let i = 0; i < newKeys.length; i++) {\n const k = newKeys[i]!\n if (!oldKeySet.has(k)) continue\n const from = oldKeys.indexOf(k)\n if (from !== i) moved.push({ key: k, from, to: i })\n else reused.push(k)\n }\n inst._eachDiffLog.push({\n updateIndex: inst._updateCounter ?? 0,\n eachSiteId,\n added,\n removed,\n moved,\n reused,\n })\n }\n\n const block: StructuralBlock = {\n mask: (opts as { __mask?: number }).__mask ?? FULL_MASK,\n reconcile(state: unknown) {\n const parent = anchor.parentNode\n if (!parent) return\n\n const newItems = opts.items(state as S)\n\n // Fast path: same array reference → skip entirely.\n if (newItems === lastItemsRef) return\n lastItemsRef = newItems\n\n const oldKeys = snapshotKeys()\n const report = opts.onTransition ? { entering: [] as Node[], leaving: [] as Node[] } : null\n reconcileEntries(\n entries,\n newItems,\n opts,\n parentLifetime,\n parent,\n anchor,\n ctx,\n state,\n leaving,\n report,\n )\n if (opts.onTransition && report) {\n opts.onTransition({ entering: report.entering, leaving: report.leaving, parent })\n }\n emitDiff(oldKeys)\n },\n\n /** Same keys, only item data changed — skip mismatch/swap detection.\n * Compiler calls this when it knows the array structure is unchanged. */\n reconcileItems(state: unknown) {\n const newItems = opts.items(state as S)\n lastItemsRef = newItems\n const len = Math.min(entries.length, newItems.length)\n for (let i = 0; i < len; i++) {\n const entry = entries[i]!\n const newItem = newItems[i]!\n if (entry.item !== newItem) {\n updateEntry(entry, newItem, i)\n }\n }\n },\n\n /** Remove all items — skip items accessor, go straight to clear path. */\n reconcileClear() {\n lastItemsRef = [] as unknown as T[]\n const parent = anchor.parentNode\n if (!parent) return\n if (entries.length === 0) return\n\n const oldKeys = snapshotKeys()\n\n // Call registered clear callbacks (e.g., selector registry.clear())\n // BEFORE scope disposal — avoids 1000 individual Set.delete calls\n for (let i = 0; i < clearCallbacks.length; i++) clearCallbacks[i]!()\n\n // Bulk DOM removal\n const range = ctx.dom.createRange()\n range.setStartAfter(anchor)\n const lastEntry = entries[entries.length - 1]!\n const lastNode = lastEntry.nodes[lastEntry.nodes.length - 1]!\n range.setEndAfter(lastNode)\n range.deleteContents()\n\n // Bulk scope disposal — disposers that were replaced by clearCallbacks\n // are now no-ops, making this much faster\n const scopes: Lifetime[] = []\n for (let i = 0; i < entries.length; i++) {\n const s = entries[i]!.scope\n s.disposalCause = 'each-remove'\n scopes.push(s)\n }\n disposeLifetimesBulk(scopes)\n removeOrphanedChildren(parentLifetime)\n entries.length = 0\n\n emitDiff(oldKeys)\n },\n\n /** Remove entries not present in the new items. Optimized for filter()\n * patterns where items are removed but order is preserved. Walks old\n * and new arrays in parallel — O(n) with no Map/Set allocation. */\n reconcileRemove(state: unknown) {\n const newItems = opts.items(state as S)\n lastItemsRef = newItems\n const parent = anchor.parentNode\n if (!parent) return\n\n const oldKeys = snapshotKeys()\n const oldLen = entries.length\n const newLen = newItems.length\n if (newLen >= oldLen) {\n // Not a removal — fallback (shouldn't happen if compiler detected correctly)\n reconcileEntries(\n entries,\n newItems,\n opts,\n parentLifetime,\n parent,\n anchor,\n ctx,\n state,\n leaving,\n null,\n )\n emitDiff(oldKeys)\n return\n }\n\n // Parallel walk: new items are a subsequence of old items (same order, some removed)\n let ni = 0\n let didRemove = false\n for (let oi = 0; oi < oldLen; oi++) {\n const entry = entries[oi]!\n if (ni < newLen && entry.key === opts.key(newItems[ni]!)) {\n // Entry survives — update if item ref changed\n if (entry.item !== newItems[ni]) {\n updateEntry(entry, newItems[ni]!, ni)\n }\n ni++\n } else {\n // Entry removed — notify selectors before scope disposal\n for (let ci = 0; ci < removeCallbacks.length; ci++) removeCallbacks[ci]!(entry.key)\n for (const node of entry.nodes) parent.removeChild(node)\n entry.scope.disposalCause = 'each-remove'\n disposeLifetime(entry.scope, true)\n entries[oi] = null!\n didRemove = true\n }\n }\n\n // Compact entries array\n if (didRemove) {\n let w = 0\n for (let r = 0; r < oldLen; r++) {\n if (entries[r]) entries[w++] = entries[r]!\n }\n entries.length = w\n removeOrphanedChildren(parentLifetime)\n }\n\n // Update indices for remaining entries\n for (let i = 0; i < entries.length; i++) {\n entries[i]!.index = i\n }\n\n emitDiff(oldKeys)\n },\n\n /** Update only entries at stride intervals — O(k) where k = n/stride.\n * The compiler passes the stride from the detected for-loop pattern. */\n reconcileChanged(state: unknown, stride: number) {\n const newItems = opts.items(state as S)\n lastItemsRef = newItems\n for (let i = 0; i < entries.length && i < newItems.length; i += stride) {\n const entry = entries[i]!\n const newItem = newItems[i]!\n if (entry.item !== newItem) {\n updateEntry(entry, newItem, i)\n }\n }\n },\n }\n\n // Register the block BEFORE building initial row entries so that this\n // each() block precedes any nested structural blocks its rows register.\n // Parents must come first in the flat blocks array — see branch.ts for\n // the full rationale (Phase 1 iteration safety when disposing nested).\n blocks.push(block)\n\n activeClearCallbacks = clearCallbacks\n activeRemoveCallbacks = removeCallbacks\n for (let i = 0; i < initialItems.length; i++) {\n const item = initialItems[i]!\n const entry = buildEntry(item, i, opts, parentLifetime, ctx)\n entries.push(entry)\n }\n activeClearCallbacks = null\n activeRemoveCallbacks = null\n\n // Fire initial enter for mount-time items\n if (opts.enter) {\n for (const entry of entries) {\n if (entry.nodes.length > 0) opts.enter(entry.nodes)\n }\n }\n\n addDisposer(parentLifetime, () => {\n const idx = blocks.indexOf(block)\n if (idx !== -1) blocks.splice(idx, 1)\n // parentLifetime is being disposed — its children array is about to be\n // cleared by the recursive dispose pass, so skip per-entry parent\n // removal (avoids O(N²) indexOf+splice).\n //\n // Rows created AFTER the parent's initial render (each reconciled\n // with a new item list) are siblings of the anchor inside the\n // parent's DOM container, but aren't tracked by the parent's\n // snapshot (e.g. an outer branch's currentNodes). Walking entries\n // here and removing their DOM — guarded by parentNode — closes\n // the leak: cascade-removed subtrees no-op, live-parent cases get\n // the orphans cleaned up.\n for (const entry of entries) {\n for (const node of entry.nodes) {\n if (node.parentNode) node.parentNode.removeChild(node)\n }\n disposeLifetime(entry.scope, true)\n }\n entries.length = 0\n if (anchor.parentNode) anchor.parentNode.removeChild(anchor)\n // Force-remove any mid-leave entries immediately\n for (const entry of leaving) {\n for (const node of entry.nodes) {\n if (node.parentNode) node.parentNode.removeChild(node)\n }\n disposeLifetime(entry.scope, true)\n }\n leaving.length = 0\n })\n\n const result: Node[] = [anchor]\n for (const entry of entries) {\n const nodes = entry.nodes\n for (let i = 0; i < nodes.length; i++) result.push(nodes[i]!)\n }\n return result\n}\n\n/**\n * Remove an entry's DOM + dispose its scope, running opts.leave first if\n * provided. When leave returns a Promise, the DOM removal is deferred until\n * resolution (entry is tracked in `leaving`).\n */\nfunction removeEntry<T>(\n entry: Entry<T>,\n opts: { leave?: (nodes: Node[]) => void | Promise<void> },\n leaving: Entry<T>[],\n): void {\n const removeNow = (): void => {\n for (const node of entry.nodes) {\n if (node.parentNode) node.parentNode.removeChild(node)\n }\n entry.scope.disposalCause = 'each-remove'\n disposeLifetime(entry.scope)\n const idx = leaving.indexOf(entry)\n if (idx !== -1) leaving.splice(idx, 1)\n }\n if (opts.leave && entry.nodes.length > 0) {\n const result = opts.leave(entry.nodes)\n if (result && typeof (result as Promise<void>).then === 'function') {\n leaving.push(entry)\n ;(result as Promise<void>).then(removeNow)\n return\n }\n }\n removeNow()\n}\n\nfunction fireEnter<T>(\n entry: Entry<T>,\n opts: { enter?: (nodes: Node[]) => void | Promise<void> },\n): void {\n if (opts.enter && entry.nodes.length > 0) {\n void opts.enter(entry.nodes)\n }\n}\n\nfunction buildEntry<S, T, M>(\n item: T,\n index: number,\n opts: EachOptions<S, T, M>,\n parentLifetime: Lifetime,\n ctx: ReturnType<typeof getRenderContext>,\n state?: unknown,\n): Entry<T> {\n const key = opts.key(item)\n // Use a lightweight scope — just needs itemUpdaters for per-item bindings.\n // Full scope features (disposers, bindings, children) are only needed when\n // the render callback uses structural primitives or selector.bind().\n const scope = createLifetime(parentLifetime)\n scope._kind = 'each'\n const currentState = (state ?? ctx.state) as S\n const send = ctx.send as (msg: M) => void\n\n // Create entry before render so itemAccessor closures can capture it\n const entry: Entry<T> = { key, item, current: item, index, scope, nodes: null!, updaters: [] }\n\n // Base callable: item(selector) for computed expressions\n const itemFn = <R>(selector: (t: T) => R): (() => R) => {\n const accessor = () => selector(entry.current)\n accessor.__perItem = true as const\n return accessor\n }\n\n // Proxy for item.field shorthand: LAZILY created. Compiled code uses\n // `acc(fn)` instead (the compiler rewrites item.x → acc(r => r.x)),\n // so the Proxy is never constructed in the common case. This saves\n // ~300ns × N Proxy allocations per create cycle.\n let itemProxy: ItemAccessor<T> | null = null\n const getItemProxy = (): ItemAccessor<T> => {\n if (itemProxy) return itemProxy\n let fieldCache: Map<string, () => unknown> | null = null\n itemProxy = new Proxy(itemFn as object, {\n get(target, prop) {\n if (typeof prop === 'symbol' || prop === 'then' || prop === 'prototype') {\n return Reflect.get(target, prop)\n }\n const key = prop as string\n if (fieldCache) {\n const cached = fieldCache.get(key)\n if (cached) return cached\n } else {\n fieldCache = new Map()\n }\n // `current` returns the whole item — essential for primitive T\n // (where the field map is useless) and for whole-record sampling.\n // Caller must call it like a method: `item.current()`.\n const accessor =\n key === 'current'\n ? () => entry.current\n : () => (entry.current as Record<string, unknown>)[key]\n ;(accessor as unknown as { __perItem: true }).__perItem = true\n fieldCache.set(key, accessor)\n return accessor\n },\n }) as ItemAccessor<T>\n return itemProxy\n }\n\n const indexAccessor = (): number => entry.index\n\n // Reuse a single context object to avoid allocation per entry\n buildCtx.rootLifetime = scope\n buildCtx.state = currentState\n buildCtx.allBindings = ctx.allBindings\n buildCtx.structuralBlocks = ctx.structuralBlocks\n buildCtx.dom = ctx.dom\n buildCtx.instance = ctx.instance\n const prevFlatBindings = getFlatBindings()\n setFlatBindings(ctx.allBindings)\n setRenderContext(buildCtx)\n\n // Reuse a single render bag object across entries — mutate `acc` and\n // `index` per entry to avoid per-entry object allocation.\n buildBag.send = send\n buildBag.acc = itemFn\n buildBag.index = indexAccessor\n buildBag._getItemProxy = getItemProxy\n buildBag.entry = entry\n // The View bag — lets each.render use `h.text`, `h.scope`, `h.sample`,\n // etc. without reaching for the top-level imports. Each entry gets a\n // fresh View so its `send` is bound to this row's dispatch path.\n buildBag.h = createView<S, M>(send)\n // Row factory: pass compiler-injected template + update function through to render\n const rfOpts = opts as unknown as Record<string, unknown>\n if (rfOpts.__tpl) buildBag.__tpl = rfOpts.__tpl\n if (rfOpts.__rowUpd) buildBag.__rowUpd = rfOpts.__rowUpd\n entry.nodes = opts.render(buildBag as Parameters<typeof opts.render>[0])\n\n // Move itemUpdaters from scope to entry for direct access during updateEntry.\n // This avoids scope.itemUpdaters lookup overhead on every item update.\n if (scope.itemUpdaters.length > 0) {\n entry.updaters = scope.itemUpdaters\n scope.itemUpdaters = []\n }\n\n clearRenderContext()\n setFlatBindings(prevFlatBindings)\n setRenderContext(ctx)\n\n return entry\n}\n\ninterface TransitionReport {\n entering: Node[]\n leaving: Node[]\n}\n\nfunction collectNodes(target: Node[], nodes: Node[]): void {\n for (const n of nodes) target.push(n)\n}\n\nfunction reconcileEntries<S, T>(\n entries: Entry<T>[],\n newItems: T[],\n opts: EachOptions<S, T>,\n parentLifetime: Lifetime,\n parent: Node,\n anchor: Node,\n ctx: ReturnType<typeof getRenderContext>,\n state: unknown,\n leaving: Entry<T>[],\n report: TransitionReport | null,\n): void {\n const oldLen = entries.length\n const newLen = newItems.length\n const hasLeave = !!opts.leave\n\n // Fast path 1: clear all — bulk DOM removal.\n // When opts.leave is set, each item needs its own leave animation, so\n // fall through to per-item removal instead of Range.deleteContents().\n if (newLen === 0) {\n if (report) {\n for (const entry of entries) collectNodes(report.leaving, entry.nodes)\n }\n if (hasLeave) {\n const toRemove = entries.slice()\n entries.length = 0\n for (const entry of toRemove) removeEntry(entry, opts, leaving)\n return\n }\n // Remove all DOM nodes in one operation using Range\n if (entries.length > 0) {\n const range = ctx.dom.createRange()\n range.setStartAfter(anchor)\n const lastEntry = entries[entries.length - 1]!\n const lastNode = lastEntry.nodes[lastEntry.nodes.length - 1]!\n range.setEndAfter(lastNode)\n range.deleteContents()\n }\n // Bulk dispose all entry scopes — avoids per-scope function call overhead\n const scopes: Lifetime[] = []\n for (let i = 0; i < entries.length; i++) {\n const s = entries[i]!.scope\n s.disposalCause = 'each-remove'\n scopes.push(s)\n }\n disposeLifetimesBulk(scopes)\n removeOrphanedChildren(parentLifetime)\n entries.length = 0\n return\n }\n\n // Fast path 2: append-only — old keys are a prefix of new keys\n if (newLen > oldLen && isAppendOnly(entries, newItems, opts)) {\n for (let i = 0; i < oldLen; i++) {\n updateEntry(entries[i]!, newItems[i]!, i)\n }\n // Find insertion point: after last existing entry's last node, or after anchor\n const lastEntry = oldLen > 0 ? entries[oldLen - 1]! : null\n const ref = lastEntry\n ? lastEntry.nodes[lastEntry.nodes.length - 1]!.nextSibling\n : anchor.nextSibling\n const frag = ctx.dom.createDocumentFragment()\n const newlyAdded: Entry<T>[] = []\n for (let i = oldLen; i < newLen; i++) {\n const entry = buildEntry(newItems[i]!, i, opts, parentLifetime, ctx, state)\n entries.push(entry)\n newlyAdded.push(entry)\n for (const node of entry.nodes) frag.appendChild(node)\n }\n parent.insertBefore(frag, ref)\n if (report) {\n for (const entry of newlyAdded) collectNodes(report.entering, entry.nodes)\n }\n for (const entry of newlyAdded) fireEnter(entry, opts)\n return\n }\n\n // Fast path 3: same length — single pass handles both same-keys update\n // and two-element swap detection. Avoids a second O(n) pass.\n if (newLen === oldLen) {\n let mismatch1 = -1\n let mismatch2 = -1\n let mismatchCount = 0\n\n for (let i = 0; i < newLen; i++) {\n const entry = entries[i]!\n const newItem = newItems[i]!\n if (entry.item === newItem) continue\n const newKey = opts.key(newItem)\n if (entry.key === newKey) {\n updateEntry(entry, newItem, i)\n continue\n }\n // Key mismatch — track for swap detection\n mismatchCount++\n if (mismatchCount === 1) mismatch1 = i\n else if (mismatchCount === 2) mismatch2 = i\n else break // 3+ mismatches → fall through to general path\n }\n\n // All keys matched (with possible item updates) → done\n if (mismatchCount === 0) return\n\n // Exactly 2 key mismatches — check if it's a swap\n if (mismatchCount === 2) {\n const e1 = entries[mismatch1]!\n const e2 = entries[mismatch2]!\n if (e1.key === opts.key(newItems[mismatch2]!) && e2.key === opts.key(newItems[mismatch1]!)) {\n // DOM swap\n const refI = e1.nodes[0]!\n const refAfterJ = e2.nodes[e2.nodes.length - 1]!.nextSibling\n for (const node of e2.nodes) parent.insertBefore(node, refI)\n for (const node of e1.nodes) parent.insertBefore(node, refAfterJ)\n entries[mismatch1] = e2\n entries[mismatch2] = e1\n updateEntry(e2, newItems[mismatch1]!, mismatch1)\n updateEntry(e1, newItems[mismatch2]!, mismatch2)\n return\n }\n }\n // Fall through to general path for 3+ mismatches or non-swap\n }\n\n // Fast path 5: full replace — no shared keys between old and new.\n // Skipped when opts.leave is set so departing items can animate individually.\n if (!hasLeave && oldLen > 0 && opts.key(newItems[0]!) !== entries[0]!.key) {\n const oldKeys = new Set<string | number>()\n for (const entry of entries) oldKeys.add(entry.key)\n let anyShared = false\n for (let i = 0; i < newLen; i++) {\n if (oldKeys.has(opts.key(newItems[i]!))) {\n anyShared = true\n break\n }\n }\n if (!anyShared) {\n if (report) {\n for (const entry of entries) collectNodes(report.leaving, entry.nodes)\n }\n // Bulk DOM removal using Range\n const range = ctx.dom.createRange()\n range.setStartAfter(anchor)\n const lastEntry = entries[entries.length - 1]!\n range.setEndAfter(lastEntry.nodes[lastEntry.nodes.length - 1]!)\n range.deleteContents()\n // Bulk dispose all old scopes\n const oldLifetimes: Lifetime[] = []\n for (let i = 0; i < entries.length; i++) {\n const s = entries[i]!.scope\n s.disposalCause = 'each-remove'\n oldLifetimes.push(s)\n }\n disposeLifetimesBulk(oldLifetimes)\n removeOrphanedChildren(parentLifetime)\n entries.length = 0\n // Build all new entries into a fragment\n const frag = ctx.dom.createDocumentFragment()\n const newlyAdded: Entry<T>[] = []\n for (let i = 0; i < newLen; i++) {\n const entry = buildEntry(newItems[i]!, i, opts, parentLifetime, ctx, state)\n entries.push(entry)\n newlyAdded.push(entry)\n for (const node of entry.nodes) frag.appendChild(node)\n }\n parent.insertBefore(frag, anchor.nextSibling)\n if (report) {\n for (const entry of newlyAdded) collectNodes(report.entering, entry.nodes)\n }\n for (const entry of newlyAdded) fireEnter(entry, opts)\n return\n }\n }\n\n // General path: keyed reconciliation\n const oldByKey = new Map<string | number, Entry<T>>()\n for (const entry of entries) {\n oldByKey.set(entry.key, entry)\n }\n\n const newEntries: Entry<T>[] = []\n const usedKeys = new Set<string | number>()\n const newlyAdded: Entry<T>[] = []\n\n for (let i = 0; i < newLen; i++) {\n const item = newItems[i]!\n const key = opts.key(item)\n usedKeys.add(key)\n\n const existing = oldByKey.get(key)\n if (existing) {\n updateEntry(existing, item, i)\n newEntries.push(existing)\n } else {\n const entry = buildEntry(item, i, opts, parentLifetime, ctx, state)\n newEntries.push(entry)\n newlyAdded.push(entry)\n }\n }\n\n // Remove entries not in the new list. Use bulk-detach pattern so\n // disposing K removals costs O(K+P) rather than O(K*P) where P is\n // parentLifetime.children.length (avoids K * indexOf+splice).\n let didBulkDetach = false\n for (const entry of entries) {\n if (!usedKeys.has(entry.key)) {\n if (report) collectNodes(report.leaving, entry.nodes)\n if (hasLeave) {\n removeEntry(entry, opts, leaving)\n } else {\n for (const node of entry.nodes) parent.removeChild(node)\n entry.scope.disposalCause = 'each-remove'\n disposeLifetime(entry.scope, true)\n didBulkDetach = true\n }\n }\n }\n if (didBulkDetach) removeOrphanedChildren(parentLifetime)\n\n // Reorder DOM\n const hasSurvivors = newEntries.some((e) => oldByKey.has(e.key))\n\n if (!hasSurvivors || !survivorsInOrder(entries, newEntries, usedKeys)) {\n // Full fragment rebuild — one reflow\n const frag = ctx.dom.createDocumentFragment()\n for (const entry of newEntries) {\n for (const node of entry.nodes) frag.appendChild(node)\n }\n parent.insertBefore(frag, anchor.nextSibling)\n } else {\n // Survivors in order — batch-insert new entries between survivors\n let frag: DocumentFragment | null = null\n let insertRef: ChildNode | null = anchor.nextSibling\n for (const entry of newEntries) {\n if (oldByKey.has(entry.key)) {\n // Flush any pending fragment before this survivor\n if (frag) {\n parent.insertBefore(frag, insertRef)\n frag = null\n }\n // Skip past survivor's nodes\n const lastNode = entry.nodes[entry.nodes.length - 1]\n insertRef = lastNode ? lastNode.nextSibling : insertRef\n } else {\n // Batch new entries into a fragment\n if (!frag) frag = ctx.dom.createDocumentFragment()\n for (const node of entry.nodes) frag.appendChild(node)\n }\n }\n if (frag) parent.insertBefore(frag, insertRef)\n }\n\n entries.length = newEntries.length\n for (let i = 0; i < newEntries.length; i++) entries[i] = newEntries[i]!\n\n if (report) {\n for (const entry of newlyAdded) collectNodes(report.entering, entry.nodes)\n }\n\n // Fire enter for newly-added entries (after DOM insertion)\n if (opts.enter) {\n for (const entry of newlyAdded) fireEnter(entry, opts)\n }\n}\n\nfunction updateEntry<T>(entry: Entry<T>, item: T, index: number): void {\n const changed = !Object.is(entry.item, item)\n entry.item = item\n entry.current = item\n entry.index = index\n // eachItemStable removed — unused\n // Directly run per-item updaters when item changed — bypasses Phase 2\n if (changed) {\n // Row factory fast path: shared update function, zero closures\n const rowUpd = (entry as unknown as Record<string, unknown>).__rowUpdate as\n | ((e: Entry<T>) => void)\n | undefined\n if (rowUpd) {\n rowUpd(entry)\n } else {\n // Closure-based fallback\n const updaters = entry.updaters.length > 0 ? entry.updaters : entry.scope.itemUpdaters\n for (let i = 0; i < updaters.length; i++) {\n updaters[i]!()\n }\n }\n }\n}\n\nfunction isAppendOnly<S, T>(entries: Entry<T>[], newItems: T[], opts: EachOptions<S, T>): boolean {\n for (let i = 0; i < entries.length; i++) {\n if (entries[i]!.key !== opts.key(newItems[i]!)) return false\n }\n return true\n}\n\nfunction survivorsInOrder<T>(\n oldEntries: Entry<T>[],\n newEntries: Entry<T>[],\n usedKeys: Set<string | number>,\n): boolean {\n // Build old-index map for survivors\n const oldIndexMap = new Map<string | number, number>()\n for (let i = 0; i < oldEntries.length; i++) {\n if (usedKeys.has(oldEntries[i]!.key)) {\n oldIndexMap.set(oldEntries[i]!.key, i)\n }\n }\n // Check that survivors appear in increasing old-index order in newEntries\n let maxOldIndex = -1\n for (const entry of newEntries) {\n const oldIdx = oldIndexMap.get(entry.key)\n if (oldIdx === undefined) continue // new entry, skip\n if (oldIdx < maxOldIndex) return false\n maxOldIndex = oldIdx\n }\n return true\n}\n"]}
|
|
1
|
+
{"version":3,"file":"each.js","sourceRoot":"","sources":["../../src/primitives/each.ts"],"names":[],"mappings":"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","sourcesContent":["import type { EachOptions, ItemAccessor, Lifetime } from '../types.js'\nimport {\n getRenderContext,\n setRenderContext,\n clearRenderContext,\n enterAccessor,\n exitAccessor,\n type RenderContext,\n} from '../render-context.js'\nimport {\n createLifetime,\n disposeLifetime,\n disposeLifetimesBulk,\n addDisposer,\n removeOrphanedChildren,\n} from '../lifetime.js'\nimport { getFlatBindings, setFlatBindings } from '../binding.js'\nimport { FULL_MASK } from '../update-loop.js'\nimport type { StructuralBlock } from '../structural.js'\nimport { createView } from '../view-helpers.js'\n\n// Clear callbacks — registered by selector.bind() during render, called by reconcileClear().\n// Eliminates per-row disposers (1000 Set.delete calls → 1 registry.clear() call).\nlet activeClearCallbacks: Array<() => void> | null = null\nlet activeRemoveCallbacks: Array<(key: string | number) => void> | null = null\n\n/** Register a callback to run when the current each() block clears. */\nexport function registerOnClear(cb: () => void): void {\n if (activeClearCallbacks) activeClearCallbacks.push(cb)\n}\n\n/** Register a callback to run when a single row is removed by key. */\nexport function registerOnRemove(cb: (key: string | number) => void): void {\n if (activeRemoveCallbacks) activeRemoveCallbacks.push(cb)\n}\n\n// Wrap accessor invocations so `sample()` calls inside them throw a targeted\n// error. The wrappers also localise the contract: every items/key call goes\n// through these, so a future change (e.g. instrumentation) has one site.\nfunction callItems<S, T>(opts: { items: (s: S) => T[] }, state: S): T[] {\n enterAccessor('each().items')\n try {\n return opts.items(state)\n } finally {\n exitAccessor()\n }\n}\nfunction callKey<T>(opts: { key: (t: T) => string | number }, item: T): string | number {\n enterAccessor('each().key')\n try {\n return opts.key(item)\n } finally {\n exitAccessor()\n }\n}\n\n// Reusable render context for buildEntry — avoids object allocation per entry.\n// All fields except `rootLifetime`, `state`, `allBindings`, `structuralBlocks`, `dom`\n// are copied from the surrounding render context per reconcile call, so the\n// initial shape's null/empty values are never observed in practice.\nconst buildCtx: RenderContext = {\n rootLifetime: null as unknown as Lifetime,\n state: null,\n allBindings: [],\n structuralBlocks: [],\n dom: null as unknown as import('../dom-env.js').DomEnv,\n}\n\n// Reusable render bag — mutated per entry instead of allocating new objects\nconst buildBag: Record<string, unknown> = {\n send: null,\n get item() {\n return (buildBag._getItemProxy as () => unknown)()\n },\n acc: null,\n index: null,\n _getItemProxy: null,\n}\n\ninterface Entry<T> {\n key: string | number\n item: T\n current: T\n index: number\n scope: Lifetime\n nodes: Node[]\n /** Per-item updaters — stored on entry directly to avoid scope overhead for leaf rows */\n updaters: Array<() => void>\n}\n\nexport function each<S, T, M = unknown>(opts: EachOptions<S, T, M>): Node[] {\n const ctx = getRenderContext('each')\n const parentLifetime = ctx.rootLifetime\n const blocks = ctx.structuralBlocks\n\n const anchor = ctx.dom.createComment('each')\n const entries: Entry<T>[] = []\n const clearCallbacks: Array<() => void> = []\n const removeCallbacks: Array<(key: string | number) => void> = []\n // Entries whose leave animation is still in progress. Their DOM nodes\n // remain in the parent until the leave Promise resolves.\n const leaving: Entry<T>[] = []\n\n const initialItems = callItems(opts, ctx.state as S)\n let lastItemsRef = initialItems\n\n // Dev-only diff tracking: if the owning component has an _eachDiffLog\n // (installed by devtools), we capture key sets before/after each\n // key-mutating reconcile call and emit an EachDiff entry. The siteId\n // is derived from this each() block's position in the flat block\n // array at registration time — stable for the lifetime of the block.\n const inst = ctx.instance\n const eachSiteId = inst?._eachDiffLog !== undefined ? `each#${blocks.length}` : ''\n const snapshotKeys = (): string[] | null => {\n if (inst?._eachDiffLog === undefined) return null\n const keys: string[] = []\n for (let i = 0; i < entries.length; i++) keys.push(String(entries[i]!.key))\n return keys\n }\n const emitDiff = (oldKeys: string[] | null): void => {\n if (oldKeys === null || inst?._eachDiffLog === undefined) return\n const newKeys: string[] = []\n for (let i = 0; i < entries.length; i++) newKeys.push(String(entries[i]!.key))\n const oldKeySet = new Set(oldKeys)\n const newKeySet = new Set(newKeys)\n const added: string[] = []\n const removed: string[] = []\n const moved: Array<{ key: string; from: number; to: number }> = []\n const reused: string[] = []\n for (const k of newKeys) if (!oldKeySet.has(k)) added.push(k)\n for (const k of oldKeys) if (!newKeySet.has(k)) removed.push(k)\n for (let i = 0; i < newKeys.length; i++) {\n const k = newKeys[i]!\n if (!oldKeySet.has(k)) continue\n const from = oldKeys.indexOf(k)\n if (from !== i) moved.push({ key: k, from, to: i })\n else reused.push(k)\n }\n inst._eachDiffLog.push({\n updateIndex: inst._updateCounter ?? 0,\n eachSiteId,\n added,\n removed,\n moved,\n reused,\n })\n }\n\n const block: StructuralBlock = {\n mask: (opts as { __mask?: number }).__mask ?? FULL_MASK,\n reconcile(state: unknown) {\n const parent = anchor.parentNode\n if (!parent) return\n\n const newItems = callItems(opts, state as S)\n\n // Fast path: same array reference → skip entirely.\n if (newItems === lastItemsRef) return\n lastItemsRef = newItems\n\n const oldKeys = snapshotKeys()\n const report = opts.onTransition ? { entering: [] as Node[], leaving: [] as Node[] } : null\n reconcileEntries(\n entries,\n newItems,\n opts,\n parentLifetime,\n parent,\n anchor,\n ctx,\n state,\n leaving,\n report,\n )\n if (opts.onTransition && report) {\n opts.onTransition({ entering: report.entering, leaving: report.leaving, parent })\n }\n emitDiff(oldKeys)\n },\n\n /** Same keys, only item data changed — skip mismatch/swap detection.\n * Compiler calls this when it knows the array structure is unchanged. */\n reconcileItems(state: unknown) {\n const newItems = callItems(opts, state as S)\n lastItemsRef = newItems\n const len = Math.min(entries.length, newItems.length)\n for (let i = 0; i < len; i++) {\n const entry = entries[i]!\n const newItem = newItems[i]!\n if (entry.item !== newItem) {\n updateEntry(entry, newItem, i)\n }\n }\n },\n\n /** Remove all items — skip items accessor, go straight to clear path. */\n reconcileClear() {\n lastItemsRef = [] as unknown as T[]\n const parent = anchor.parentNode\n if (!parent) return\n if (entries.length === 0) return\n\n const oldKeys = snapshotKeys()\n\n // Call registered clear callbacks (e.g., selector registry.clear())\n // BEFORE scope disposal — avoids 1000 individual Set.delete calls\n for (let i = 0; i < clearCallbacks.length; i++) clearCallbacks[i]!()\n\n // Bulk DOM removal\n const range = ctx.dom.createRange()\n range.setStartAfter(anchor)\n const lastEntry = entries[entries.length - 1]!\n const lastNode = lastEntry.nodes[lastEntry.nodes.length - 1]!\n range.setEndAfter(lastNode)\n range.deleteContents()\n\n // Bulk scope disposal — disposers that were replaced by clearCallbacks\n // are now no-ops, making this much faster\n const scopes: Lifetime[] = []\n for (let i = 0; i < entries.length; i++) {\n const s = entries[i]!.scope\n s.disposalCause = 'each-remove'\n scopes.push(s)\n }\n disposeLifetimesBulk(scopes)\n removeOrphanedChildren(parentLifetime)\n entries.length = 0\n\n emitDiff(oldKeys)\n },\n\n /** Remove entries not present in the new items. Optimized for filter()\n * patterns where items are removed but order is preserved. Walks old\n * and new arrays in parallel — O(n) with no Map/Set allocation. */\n reconcileRemove(state: unknown) {\n const newItems = callItems(opts, state as S)\n lastItemsRef = newItems\n const parent = anchor.parentNode\n if (!parent) return\n\n const oldKeys = snapshotKeys()\n const oldLen = entries.length\n const newLen = newItems.length\n if (newLen >= oldLen) {\n // Not a removal — fallback (shouldn't happen if compiler detected correctly)\n reconcileEntries(\n entries,\n newItems,\n opts,\n parentLifetime,\n parent,\n anchor,\n ctx,\n state,\n leaving,\n null,\n )\n emitDiff(oldKeys)\n return\n }\n\n // Parallel walk: new items are a subsequence of old items (same order, some removed)\n let ni = 0\n let didRemove = false\n for (let oi = 0; oi < oldLen; oi++) {\n const entry = entries[oi]!\n if (ni < newLen && entry.key === callKey(opts, newItems[ni]!)) {\n // Entry survives — update if item ref changed\n if (entry.item !== newItems[ni]) {\n updateEntry(entry, newItems[ni]!, ni)\n }\n ni++\n } else {\n // Entry removed — notify selectors before scope disposal\n for (let ci = 0; ci < removeCallbacks.length; ci++) removeCallbacks[ci]!(entry.key)\n for (const node of entry.nodes) parent.removeChild(node)\n entry.scope.disposalCause = 'each-remove'\n disposeLifetime(entry.scope, true)\n entries[oi] = null!\n didRemove = true\n }\n }\n\n // Compact entries array\n if (didRemove) {\n let w = 0\n for (let r = 0; r < oldLen; r++) {\n if (entries[r]) entries[w++] = entries[r]!\n }\n entries.length = w\n removeOrphanedChildren(parentLifetime)\n }\n\n // Update indices for remaining entries\n for (let i = 0; i < entries.length; i++) {\n entries[i]!.index = i\n }\n\n emitDiff(oldKeys)\n },\n\n /** Update only entries at stride intervals — O(k) where k = n/stride.\n * The compiler passes the stride from the detected for-loop pattern. */\n reconcileChanged(state: unknown, stride: number) {\n const newItems = callItems(opts, state as S)\n lastItemsRef = newItems\n for (let i = 0; i < entries.length && i < newItems.length; i += stride) {\n const entry = entries[i]!\n const newItem = newItems[i]!\n if (entry.item !== newItem) {\n updateEntry(entry, newItem, i)\n }\n }\n },\n }\n\n // Register the block BEFORE building initial row entries so that this\n // each() block precedes any nested structural blocks its rows register.\n // Parents must come first in the flat blocks array — see branch.ts for\n // the full rationale (Phase 1 iteration safety when disposing nested).\n blocks.push(block)\n\n activeClearCallbacks = clearCallbacks\n activeRemoveCallbacks = removeCallbacks\n for (let i = 0; i < initialItems.length; i++) {\n const item = initialItems[i]!\n const entry = buildEntry(item, i, opts, parentLifetime, ctx)\n entries.push(entry)\n }\n activeClearCallbacks = null\n activeRemoveCallbacks = null\n\n // Fire initial enter for mount-time items\n if (opts.enter) {\n for (const entry of entries) {\n if (entry.nodes.length > 0) opts.enter(entry.nodes)\n }\n }\n\n addDisposer(parentLifetime, () => {\n const idx = blocks.indexOf(block)\n if (idx !== -1) blocks.splice(idx, 1)\n // parentLifetime is being disposed — its children array is about to be\n // cleared by the recursive dispose pass, so skip per-entry parent\n // removal (avoids O(N²) indexOf+splice).\n //\n // Rows created AFTER the parent's initial render (each reconciled\n // with a new item list) are siblings of the anchor inside the\n // parent's DOM container, but aren't tracked by the parent's\n // snapshot (e.g. an outer branch's currentNodes). Walking entries\n // here and removing their DOM — guarded by parentNode — closes\n // the leak: cascade-removed subtrees no-op, live-parent cases get\n // the orphans cleaned up.\n for (const entry of entries) {\n for (const node of entry.nodes) {\n if (node.parentNode) node.parentNode.removeChild(node)\n }\n disposeLifetime(entry.scope, true)\n }\n entries.length = 0\n if (anchor.parentNode) anchor.parentNode.removeChild(anchor)\n // Force-remove any mid-leave entries immediately\n for (const entry of leaving) {\n for (const node of entry.nodes) {\n if (node.parentNode) node.parentNode.removeChild(node)\n }\n disposeLifetime(entry.scope, true)\n }\n leaving.length = 0\n })\n\n const result: Node[] = [anchor]\n for (const entry of entries) {\n const nodes = entry.nodes\n for (let i = 0; i < nodes.length; i++) result.push(nodes[i]!)\n }\n return result\n}\n\n/**\n * Remove an entry's DOM + dispose its scope, running opts.leave first if\n * provided. When leave returns a Promise, the DOM removal is deferred until\n * resolution (entry is tracked in `leaving`).\n */\nfunction removeEntry<T>(\n entry: Entry<T>,\n opts: { leave?: (nodes: Node[]) => void | Promise<void> },\n leaving: Entry<T>[],\n): void {\n const removeNow = (): void => {\n for (const node of entry.nodes) {\n if (node.parentNode) node.parentNode.removeChild(node)\n }\n entry.scope.disposalCause = 'each-remove'\n disposeLifetime(entry.scope)\n const idx = leaving.indexOf(entry)\n if (idx !== -1) leaving.splice(idx, 1)\n }\n if (opts.leave && entry.nodes.length > 0) {\n const result = opts.leave(entry.nodes)\n if (result && typeof (result as Promise<void>).then === 'function') {\n leaving.push(entry)\n ;(result as Promise<void>).then(removeNow)\n return\n }\n }\n removeNow()\n}\n\nfunction fireEnter<T>(\n entry: Entry<T>,\n opts: { enter?: (nodes: Node[]) => void | Promise<void> },\n): void {\n if (opts.enter && entry.nodes.length > 0) {\n void opts.enter(entry.nodes)\n }\n}\n\nfunction buildEntry<S, T, M>(\n item: T,\n index: number,\n opts: EachOptions<S, T, M>,\n parentLifetime: Lifetime,\n ctx: ReturnType<typeof getRenderContext>,\n state?: unknown,\n): Entry<T> {\n const key = callKey(opts, item)\n // Use a lightweight scope — just needs itemUpdaters for per-item bindings.\n // Full scope features (disposers, bindings, children) are only needed when\n // the render callback uses structural primitives or selector.bind().\n const scope = createLifetime(parentLifetime)\n scope._kind = 'each'\n const currentState = (state ?? ctx.state) as S\n const send = ctx.send as (msg: M) => void\n\n // Create entry before render so itemAccessor closures can capture it\n const entry: Entry<T> = { key, item, current: item, index, scope, nodes: null!, updaters: [] }\n\n // Base callable: item(selector) for computed expressions\n const itemFn = <R>(selector: (t: T) => R): (() => R) => {\n const accessor = () => selector(entry.current)\n accessor.__perItem = true as const\n return accessor\n }\n\n // Proxy for item.field shorthand: LAZILY created. Compiled code uses\n // `acc(fn)` instead (the compiler rewrites item.x → acc(r => r.x)),\n // so the Proxy is never constructed in the common case. This saves\n // ~300ns × N Proxy allocations per create cycle.\n let itemProxy: ItemAccessor<T> | null = null\n const getItemProxy = (): ItemAccessor<T> => {\n if (itemProxy) return itemProxy\n let fieldCache: Map<string, () => unknown> | null = null\n itemProxy = new Proxy(itemFn as object, {\n get(target, prop) {\n if (typeof prop === 'symbol' || prop === 'then' || prop === 'prototype') {\n return Reflect.get(target, prop)\n }\n const key = prop as string\n if (fieldCache) {\n const cached = fieldCache.get(key)\n if (cached) return cached\n } else {\n fieldCache = new Map()\n }\n // `current` returns the whole item — essential for primitive T\n // (where the field map is useless) and for whole-record sampling.\n // Caller must call it like a method: `item.current()`.\n const accessor =\n key === 'current'\n ? () => entry.current\n : () => (entry.current as Record<string, unknown>)[key]\n ;(accessor as unknown as { __perItem: true }).__perItem = true\n fieldCache.set(key, accessor)\n return accessor\n },\n }) as ItemAccessor<T>\n return itemProxy\n }\n\n const indexAccessor = (): number => entry.index\n\n // Reuse a single context object to avoid allocation per entry\n buildCtx.rootLifetime = scope\n buildCtx.state = currentState\n buildCtx.allBindings = ctx.allBindings\n buildCtx.structuralBlocks = ctx.structuralBlocks\n buildCtx.dom = ctx.dom\n buildCtx.instance = ctx.instance\n const prevFlatBindings = getFlatBindings()\n setFlatBindings(ctx.allBindings)\n setRenderContext(buildCtx)\n\n // Reuse a single render bag object across entries — mutate `acc` and\n // `index` per entry to avoid per-entry object allocation.\n buildBag.send = send\n buildBag.acc = itemFn\n buildBag.index = indexAccessor\n buildBag._getItemProxy = getItemProxy\n buildBag.entry = entry\n // The View bag — lets each.render use `h.text`, `h.scope`, `h.sample`,\n // etc. without reaching for the top-level imports. Each entry gets a\n // fresh View so its `send` is bound to this row's dispatch path.\n buildBag.h = createView<S, M>(send)\n // Row factory: pass compiler-injected template + update function through to render\n const rfOpts = opts as unknown as Record<string, unknown>\n if (rfOpts.__tpl) buildBag.__tpl = rfOpts.__tpl\n if (rfOpts.__rowUpd) buildBag.__rowUpd = rfOpts.__rowUpd\n entry.nodes = opts.render(buildBag as Parameters<typeof opts.render>[0])\n\n // Move itemUpdaters from scope to entry for direct access during updateEntry.\n // This avoids scope.itemUpdaters lookup overhead on every item update.\n if (scope.itemUpdaters.length > 0) {\n entry.updaters = scope.itemUpdaters\n scope.itemUpdaters = []\n }\n\n clearRenderContext()\n setFlatBindings(prevFlatBindings)\n setRenderContext(ctx)\n\n return entry\n}\n\ninterface TransitionReport {\n entering: Node[]\n leaving: Node[]\n}\n\nfunction collectNodes(target: Node[], nodes: Node[]): void {\n for (const n of nodes) target.push(n)\n}\n\nfunction reconcileEntries<S, T>(\n entries: Entry<T>[],\n newItems: T[],\n opts: EachOptions<S, T>,\n parentLifetime: Lifetime,\n parent: Node,\n anchor: Node,\n ctx: ReturnType<typeof getRenderContext>,\n state: unknown,\n leaving: Entry<T>[],\n report: TransitionReport | null,\n): void {\n const oldLen = entries.length\n const newLen = newItems.length\n const hasLeave = !!opts.leave\n\n // Fast path 1: clear all — bulk DOM removal.\n // When opts.leave is set, each item needs its own leave animation, so\n // fall through to per-item removal instead of Range.deleteContents().\n if (newLen === 0) {\n if (report) {\n for (const entry of entries) collectNodes(report.leaving, entry.nodes)\n }\n if (hasLeave) {\n const toRemove = entries.slice()\n entries.length = 0\n for (const entry of toRemove) removeEntry(entry, opts, leaving)\n return\n }\n // Remove all DOM nodes in one operation using Range\n if (entries.length > 0) {\n const range = ctx.dom.createRange()\n range.setStartAfter(anchor)\n const lastEntry = entries[entries.length - 1]!\n const lastNode = lastEntry.nodes[lastEntry.nodes.length - 1]!\n range.setEndAfter(lastNode)\n range.deleteContents()\n }\n // Bulk dispose all entry scopes — avoids per-scope function call overhead\n const scopes: Lifetime[] = []\n for (let i = 0; i < entries.length; i++) {\n const s = entries[i]!.scope\n s.disposalCause = 'each-remove'\n scopes.push(s)\n }\n disposeLifetimesBulk(scopes)\n removeOrphanedChildren(parentLifetime)\n entries.length = 0\n return\n }\n\n // Fast path 2: append-only — old keys are a prefix of new keys\n if (newLen > oldLen && isAppendOnly(entries, newItems, opts)) {\n for (let i = 0; i < oldLen; i++) {\n updateEntry(entries[i]!, newItems[i]!, i)\n }\n // Find insertion point: after last existing entry's last node, or after anchor\n const lastEntry = oldLen > 0 ? entries[oldLen - 1]! : null\n const ref = lastEntry\n ? lastEntry.nodes[lastEntry.nodes.length - 1]!.nextSibling\n : anchor.nextSibling\n const frag = ctx.dom.createDocumentFragment()\n const newlyAdded: Entry<T>[] = []\n for (let i = oldLen; i < newLen; i++) {\n const entry = buildEntry(newItems[i]!, i, opts, parentLifetime, ctx, state)\n entries.push(entry)\n newlyAdded.push(entry)\n for (const node of entry.nodes) frag.appendChild(node)\n }\n parent.insertBefore(frag, ref)\n if (report) {\n for (const entry of newlyAdded) collectNodes(report.entering, entry.nodes)\n }\n for (const entry of newlyAdded) fireEnter(entry, opts)\n return\n }\n\n // Fast path 3: same length — single pass handles both same-keys update\n // and two-element swap detection. Avoids a second O(n) pass.\n if (newLen === oldLen) {\n let mismatch1 = -1\n let mismatch2 = -1\n let mismatchCount = 0\n\n for (let i = 0; i < newLen; i++) {\n const entry = entries[i]!\n const newItem = newItems[i]!\n if (entry.item === newItem) continue\n const newKey = callKey(opts, newItem)\n if (entry.key === newKey) {\n updateEntry(entry, newItem, i)\n continue\n }\n // Key mismatch — track for swap detection\n mismatchCount++\n if (mismatchCount === 1) mismatch1 = i\n else if (mismatchCount === 2) mismatch2 = i\n else break // 3+ mismatches → fall through to general path\n }\n\n // All keys matched (with possible item updates) → done\n if (mismatchCount === 0) return\n\n // Exactly 2 key mismatches — check if it's a swap\n if (mismatchCount === 2) {\n const e1 = entries[mismatch1]!\n const e2 = entries[mismatch2]!\n if (\n e1.key === callKey(opts, newItems[mismatch2]!) &&\n e2.key === callKey(opts, newItems[mismatch1]!)\n ) {\n // DOM swap\n const refI = e1.nodes[0]!\n const refAfterJ = e2.nodes[e2.nodes.length - 1]!.nextSibling\n for (const node of e2.nodes) parent.insertBefore(node, refI)\n for (const node of e1.nodes) parent.insertBefore(node, refAfterJ)\n entries[mismatch1] = e2\n entries[mismatch2] = e1\n updateEntry(e2, newItems[mismatch1]!, mismatch1)\n updateEntry(e1, newItems[mismatch2]!, mismatch2)\n return\n }\n }\n // Fall through to general path for 3+ mismatches or non-swap\n }\n\n // Fast path 5: full replace — no shared keys between old and new.\n // Skipped when opts.leave is set so departing items can animate individually.\n if (!hasLeave && oldLen > 0 && callKey(opts, newItems[0]!) !== entries[0]!.key) {\n const oldKeys = new Set<string | number>()\n for (const entry of entries) oldKeys.add(entry.key)\n let anyShared = false\n for (let i = 0; i < newLen; i++) {\n if (oldKeys.has(callKey(opts, newItems[i]!))) {\n anyShared = true\n break\n }\n }\n if (!anyShared) {\n if (report) {\n for (const entry of entries) collectNodes(report.leaving, entry.nodes)\n }\n // Bulk DOM removal using Range\n const range = ctx.dom.createRange()\n range.setStartAfter(anchor)\n const lastEntry = entries[entries.length - 1]!\n range.setEndAfter(lastEntry.nodes[lastEntry.nodes.length - 1]!)\n range.deleteContents()\n // Bulk dispose all old scopes\n const oldLifetimes: Lifetime[] = []\n for (let i = 0; i < entries.length; i++) {\n const s = entries[i]!.scope\n s.disposalCause = 'each-remove'\n oldLifetimes.push(s)\n }\n disposeLifetimesBulk(oldLifetimes)\n removeOrphanedChildren(parentLifetime)\n entries.length = 0\n // Build all new entries into a fragment\n const frag = ctx.dom.createDocumentFragment()\n const newlyAdded: Entry<T>[] = []\n for (let i = 0; i < newLen; i++) {\n const entry = buildEntry(newItems[i]!, i, opts, parentLifetime, ctx, state)\n entries.push(entry)\n newlyAdded.push(entry)\n for (const node of entry.nodes) frag.appendChild(node)\n }\n parent.insertBefore(frag, anchor.nextSibling)\n if (report) {\n for (const entry of newlyAdded) collectNodes(report.entering, entry.nodes)\n }\n for (const entry of newlyAdded) fireEnter(entry, opts)\n return\n }\n }\n\n // General path: keyed reconciliation\n const oldByKey = new Map<string | number, Entry<T>>()\n for (const entry of entries) {\n oldByKey.set(entry.key, entry)\n }\n\n const newEntries: Entry<T>[] = []\n const usedKeys = new Set<string | number>()\n const newlyAdded: Entry<T>[] = []\n\n for (let i = 0; i < newLen; i++) {\n const item = newItems[i]!\n const key = callKey(opts, item)\n usedKeys.add(key)\n\n const existing = oldByKey.get(key)\n if (existing) {\n updateEntry(existing, item, i)\n newEntries.push(existing)\n } else {\n const entry = buildEntry(item, i, opts, parentLifetime, ctx, state)\n newEntries.push(entry)\n newlyAdded.push(entry)\n }\n }\n\n // Remove entries not in the new list. Use bulk-detach pattern so\n // disposing K removals costs O(K+P) rather than O(K*P) where P is\n // parentLifetime.children.length (avoids K * indexOf+splice).\n let didBulkDetach = false\n for (const entry of entries) {\n if (!usedKeys.has(entry.key)) {\n if (report) collectNodes(report.leaving, entry.nodes)\n if (hasLeave) {\n removeEntry(entry, opts, leaving)\n } else {\n for (const node of entry.nodes) parent.removeChild(node)\n entry.scope.disposalCause = 'each-remove'\n disposeLifetime(entry.scope, true)\n didBulkDetach = true\n }\n }\n }\n if (didBulkDetach) removeOrphanedChildren(parentLifetime)\n\n // Reorder DOM\n const hasSurvivors = newEntries.some((e) => oldByKey.has(e.key))\n\n if (!hasSurvivors || !survivorsInOrder(entries, newEntries, usedKeys)) {\n // Full fragment rebuild — one reflow\n const frag = ctx.dom.createDocumentFragment()\n for (const entry of newEntries) {\n for (const node of entry.nodes) frag.appendChild(node)\n }\n parent.insertBefore(frag, anchor.nextSibling)\n } else {\n // Survivors in order — batch-insert new entries between survivors\n let frag: DocumentFragment | null = null\n let insertRef: ChildNode | null = anchor.nextSibling\n for (const entry of newEntries) {\n if (oldByKey.has(entry.key)) {\n // Flush any pending fragment before this survivor\n if (frag) {\n parent.insertBefore(frag, insertRef)\n frag = null\n }\n // Skip past survivor's nodes\n const lastNode = entry.nodes[entry.nodes.length - 1]\n insertRef = lastNode ? lastNode.nextSibling : insertRef\n } else {\n // Batch new entries into a fragment\n if (!frag) frag = ctx.dom.createDocumentFragment()\n for (const node of entry.nodes) frag.appendChild(node)\n }\n }\n if (frag) parent.insertBefore(frag, insertRef)\n }\n\n entries.length = newEntries.length\n for (let i = 0; i < newEntries.length; i++) entries[i] = newEntries[i]!\n\n if (report) {\n for (const entry of newlyAdded) collectNodes(report.entering, entry.nodes)\n }\n\n // Fire enter for newly-added entries (after DOM insertion)\n if (opts.enter) {\n for (const entry of newlyAdded) fireEnter(entry, opts)\n }\n}\n\nfunction updateEntry<T>(entry: Entry<T>, item: T, index: number): void {\n const changed = !Object.is(entry.item, item)\n entry.item = item\n entry.current = item\n entry.index = index\n // eachItemStable removed — unused\n // Directly run per-item updaters when item changed — bypasses Phase 2\n if (changed) {\n // Row factory fast path: shared update function, zero closures\n const rowUpd = (entry as unknown as Record<string, unknown>).__rowUpdate as\n | ((e: Entry<T>) => void)\n | undefined\n if (rowUpd) {\n rowUpd(entry)\n } else {\n // Closure-based fallback\n const updaters = entry.updaters.length > 0 ? entry.updaters : entry.scope.itemUpdaters\n for (let i = 0; i < updaters.length; i++) {\n updaters[i]!()\n }\n }\n }\n}\n\nfunction isAppendOnly<S, T>(entries: Entry<T>[], newItems: T[], opts: EachOptions<S, T>): boolean {\n for (let i = 0; i < entries.length; i++) {\n if (entries[i]!.key !== callKey(opts, newItems[i]!)) return false\n }\n return true\n}\n\nfunction survivorsInOrder<T>(\n oldEntries: Entry<T>[],\n newEntries: Entry<T>[],\n usedKeys: Set<string | number>,\n): boolean {\n // Build old-index map for survivors\n const oldIndexMap = new Map<string | number, number>()\n for (let i = 0; i < oldEntries.length; i++) {\n if (usedKeys.has(oldEntries[i]!.key)) {\n oldIndexMap.set(oldEntries[i]!.key, i)\n }\n }\n // Check that survivors appear in increasing old-index order in newEntries\n let maxOldIndex = -1\n for (const entry of newEntries) {\n const oldIdx = oldIndexMap.get(entry.key)\n if (oldIdx === undefined) continue // new entry, skip\n if (oldIdx < maxOldIndex) return false\n maxOldIndex = oldIdx\n }\n return true\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"foreign.d.ts","sourceRoot":"","sources":["../../src/primitives/foreign.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAQ,MAAM,aAAa,CAAA;AAOvD,wBAAgB,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EACvE,IAAI,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,GACtC,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"foreign.d.ts","sourceRoot":"","sources":["../../src/primitives/foreign.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAQ,MAAM,aAAa,CAAA;AAOvD,wBAAgB,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EACvE,IAAI,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,GACtC,IAAI,EAAE,CA8HR"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getRenderContext } from '../render-context.js';
|
|
1
|
+
import { getRenderContext, enterAccessor, exitAccessor } from '../render-context.js';
|
|
2
2
|
import { createBinding } from '../binding.js';
|
|
3
3
|
import { createLifetime, addDisposer } from '../lifetime.js';
|
|
4
4
|
const FULL_MASK = 0xffffffff;
|
|
@@ -25,7 +25,19 @@ export function foreign(opts) {
|
|
|
25
25
|
const mountResult = opts.mount({ container, send: ctx.send });
|
|
26
26
|
let instance = undefined;
|
|
27
27
|
let disposed = false;
|
|
28
|
-
|
|
28
|
+
// `props` accessor wrapped so sample()/h.sample() inside throws a targeted
|
|
29
|
+
// error. Initial read and the per-update binding accessor both route
|
|
30
|
+
// through callProps.
|
|
31
|
+
const callProps = (state) => {
|
|
32
|
+
enterAccessor('foreign().props');
|
|
33
|
+
try {
|
|
34
|
+
return opts.props(state);
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
exitAccessor();
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
let latestProps = callProps(ctx.state);
|
|
29
41
|
let syncedProps = undefined;
|
|
30
42
|
const callSync = (props, prev) => {
|
|
31
43
|
if (typeof opts.sync === 'function') {
|
|
@@ -74,7 +86,7 @@ export function foreign(opts) {
|
|
|
74
86
|
createBinding(foreignScope, {
|
|
75
87
|
mask: FULL_MASK,
|
|
76
88
|
accessor: ((state) => {
|
|
77
|
-
const newProps =
|
|
89
|
+
const newProps = callProps(state);
|
|
78
90
|
// Shallow-diff against whichever we have: syncedProps is the
|
|
79
91
|
// truth once the instance is live; while still pending, latestProps
|
|
80
92
|
// is the most recent thing we've observed.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"foreign.js","sourceRoot":"","sources":["../../src/primitives/foreign.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"foreign.js","sourceRoot":"","sources":["../../src/primitives/foreign.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ForeignOptions, Send } from '../types.js'\nimport { getRenderContext, enterAccessor, exitAccessor } from '../render-context.js'\nimport { createBinding } from '../binding.js'\nimport { createLifetime, addDisposer } from '../lifetime.js'\n\nconst FULL_MASK = 0xffffffff\n\nexport function foreign<S, M, T extends Record<string, unknown>, Instance>(\n opts: ForeignOptions<S, M, T, Instance>,\n): Node[] {\n const ctx = getRenderContext('foreign')\n const parentLifetime = ctx.rootLifetime\n const foreignScope = createLifetime(parentLifetime)\n foreignScope._kind = 'foreign'\n\n // Create container element — cast to HTMLElement since foreign() is\n // HTML-only (no SVG/MathML foreign containers) and HTMLElement is the\n // contract callers see on the `mount({ container })` argument.\n const tag = opts.container?.tag ?? 'div'\n const container = ctx.dom.createElement(tag) as HTMLElement\n if (opts.container?.attrs) {\n for (const [key, value] of Object.entries(opts.container.attrs)) {\n container.setAttribute(key, value)\n }\n }\n\n // Instance may resolve synchronously or asynchronously. `instance ===\n // undefined` means \"not ready yet\" — `sync` is suppressed and the\n // binding below only tracks `latestProps`. When the instance arrives,\n // an initial `sync` runs with `latestProps` (may differ from the props\n // at mount time if state changed while awaiting).\n const mountResult = opts.mount({ container, send: ctx.send as Send<M> })\n let instance: Instance | undefined = undefined\n let disposed = false\n // `props` accessor wrapped so sample()/h.sample() inside throws a targeted\n // error. Initial read and the per-update binding accessor both route\n // through callProps.\n const callProps = (state: S): T => {\n enterAccessor('foreign().props')\n try {\n return opts.props(state)\n } finally {\n exitAccessor()\n }\n }\n let latestProps: T = callProps(ctx.state as S)\n let syncedProps: T | undefined = undefined\n\n const callSync = (props: T, prev: T | undefined) => {\n if (typeof opts.sync === 'function') {\n opts.sync({ instance: instance as Instance, props, prev })\n } else {\n for (const key of Object.keys(props) as Array<keyof T>) {\n if (!prev || !Object.is(props[key], prev[key])) {\n const handler = opts.sync[key]\n if (handler) {\n handler({ instance: instance as Instance, value: props[key], prev: prev?.[key] })\n }\n }\n }\n }\n syncedProps = props\n }\n\n const isPromise = (v: unknown): v is Promise<Instance> =>\n typeof v === 'object' && v !== null && typeof (v as { then?: unknown }).then === 'function'\n\n if (isPromise(mountResult)) {\n mountResult.then(\n (resolved) => {\n // Dispose-before-resolve: still destroy so the library cleans up\n // whatever it allocated. Bail before calling sync.\n if (disposed) {\n opts.destroy(resolved)\n return\n }\n instance = resolved\n // Initial sync runs with the latest props the binding observed\n // while we were awaiting. `prev: undefined` matches the sync-\n // path semantics for the first sync call.\n callSync(latestProps, undefined)\n },\n (err) => {\n // Async mount failures shouldn't crash the app. Log once and\n // leave the container empty — caller can inspect the DOM to\n // detect the mount failed. `errorBoundary` catches sync mount\n // throws but can't reach async rejections through the microtask\n // queue, which is why we log here instead of re-throwing.\n console.error('[LLui] foreign({ mount }) promise rejected:', err)\n },\n )\n } else {\n instance = mountResult\n callSync(latestProps, undefined)\n }\n\n // Register a binding for the props accessor — fires when state changes\n createBinding(foreignScope, {\n mask: FULL_MASK,\n accessor: ((state: S) => {\n const newProps = callProps(state)\n // Shallow-diff against whichever we have: syncedProps is the\n // truth once the instance is live; while still pending, latestProps\n // is the most recent thing we've observed.\n const compareTo = syncedProps ?? latestProps\n const changed = !shallowEqual(newProps, compareTo)\n\n if (changed) {\n latestProps = newProps\n // Only sync if the instance is ready. If not, `latestProps`\n // is updated and resolve will flush it.\n if (instance !== undefined) {\n callSync(newProps, syncedProps)\n }\n }\n\n return newProps\n }) as (state: never) => unknown,\n kind: 'text', // kind doesn't matter — applyBinding won't be called\n node: container,\n perItem: false,\n })\n\n // Destroy on scope disposal. If the mount promise is still pending,\n // flip the disposed flag so the resolve handler takes the\n // dispose-before-resolve path.\n addDisposer(foreignScope, () => {\n disposed = true\n if (instance !== undefined) {\n opts.destroy(instance)\n }\n // If instance is still undefined, the promise will destroy on resolve.\n })\n\n return [container]\n}\n\nfunction shallowEqual<T extends Record<string, unknown>>(a: T, b: T): boolean {\n for (const key of Object.keys(a) as Array<keyof T>) {\n if (!Object.is(a[key], b[key])) return false\n }\n for (const key of Object.keys(b) as Array<keyof T>) {\n if (!(key in a)) return false\n }\n return true\n}\n"]}
|
|
@@ -12,6 +12,36 @@
|
|
|
12
12
|
* Use `each` + `ItemAccessor` instead — see the "List of editable
|
|
13
13
|
* rows" recipe in the cookbook.
|
|
14
14
|
*
|
|
15
|
+
* **Don't use inside an accessor** (`each().key`, `each().items`,
|
|
16
|
+
* `branch().on`, `show().when`, `scope().on`, `child().props`,
|
|
17
|
+
* `foreign().props`, or a binding accessor like `text(s => …)`).
|
|
18
|
+
* Accessors must be pure functions of their parameter — the compiler's
|
|
19
|
+
* mask analysis only sees reads of the parameter, so a `sample()` read
|
|
20
|
+
* is invisible. The result is a hidden dependency that breaks
|
|
21
|
+
* reconciliation: structural blocks gate out updates that should fire,
|
|
22
|
+
* binding accessors miss state changes, and `key` callbacks create
|
|
23
|
+
* keys that don't track outer state correctly.
|
|
24
|
+
*
|
|
25
|
+
* To depend on outer state inside an accessor, **lift it into the
|
|
26
|
+
* accessor's parameter**. For `each().key` reading a sibling field
|
|
27
|
+
* `rev`:
|
|
28
|
+
*
|
|
29
|
+
* ```ts
|
|
30
|
+
* // ❌ wrong — sample() in key is invisible to mask gating
|
|
31
|
+
* each({
|
|
32
|
+
* items: (s) => s.items,
|
|
33
|
+
* key: (it) => `${it.id}|${sample(s => s.rev)}`,
|
|
34
|
+
* render: …,
|
|
35
|
+
* })
|
|
36
|
+
*
|
|
37
|
+
* // ✅ right — bake outer state into items, key is pure of T
|
|
38
|
+
* each({
|
|
39
|
+
* items: (s) => s.items.map((it) => ({ it, rev: s.rev })),
|
|
40
|
+
* key: (r) => `${r.it.id}|${r.rev}`,
|
|
41
|
+
* render: …,
|
|
42
|
+
* })
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
15
45
|
* **Use for** passing a state snapshot to an imperative renderer
|
|
16
46
|
* (foreign libraries, third-party canvas/svg builders), reading a
|
|
17
47
|
* value to compute a static piece of structure that doesn't need to
|
|
@@ -24,7 +54,8 @@
|
|
|
24
54
|
* context is live — including `each.render`, whose bag intentionally
|
|
25
55
|
* does not carry View methods.
|
|
26
56
|
*
|
|
27
|
-
* Throws if called outside a render context
|
|
57
|
+
* Throws if called outside a render context, or from inside an
|
|
58
|
+
* accessor.
|
|
28
59
|
*/
|
|
29
60
|
export declare function sample<S, R>(selector: (s: S) => R): R;
|
|
30
61
|
//# sourceMappingURL=sample.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sample.d.ts","sourceRoot":"","sources":["../../src/primitives/sample.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"sample.d.ts","sourceRoot":"","sources":["../../src/primitives/sample.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAwBrD"}
|