@llui/dom 0.0.23 → 0.0.24

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 (97) hide show
  1. package/README.md +26 -21
  2. package/dist/dom-env.d.ts +67 -0
  3. package/dist/dom-env.d.ts.map +1 -0
  4. package/dist/dom-env.js +61 -0
  5. package/dist/dom-env.js.map +1 -0
  6. package/dist/el-split.d.ts.map +1 -1
  7. package/dist/el-split.js +4 -4
  8. package/dist/el-split.js.map +1 -1
  9. package/dist/el-template.d.ts +14 -1
  10. package/dist/el-template.d.ts.map +1 -1
  11. package/dist/el-template.js +41 -7
  12. package/dist/el-template.js.map +1 -1
  13. package/dist/elements.js +2 -2
  14. package/dist/elements.js.map +1 -1
  15. package/dist/hmr.d.ts.map +1 -1
  16. package/dist/hmr.js +1 -0
  17. package/dist/hmr.js.map +1 -1
  18. package/dist/index.d.ts +3 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +3 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/mathml-elements.js +2 -2
  23. package/dist/mathml-elements.js.map +1 -1
  24. package/dist/mount.d.ts +8 -0
  25. package/dist/mount.d.ts.map +1 -1
  26. package/dist/mount.js +14 -9
  27. package/dist/mount.js.map +1 -1
  28. package/dist/primitives/branch.js +1 -1
  29. package/dist/primitives/branch.js.map +1 -1
  30. package/dist/primitives/child.d.ts.map +1 -1
  31. package/dist/primitives/child.js +5 -2
  32. package/dist/primitives/child.js.map +1 -1
  33. package/dist/primitives/client-only.d.ts +108 -0
  34. package/dist/primitives/client-only.d.ts.map +1 -0
  35. package/dist/primitives/client-only.js +110 -0
  36. package/dist/primitives/client-only.js.map +1 -0
  37. package/dist/primitives/each.d.ts.map +1 -1
  38. package/dist/primitives/each.js +14 -9
  39. package/dist/primitives/each.js.map +1 -1
  40. package/dist/primitives/foreign.d.ts.map +1 -1
  41. package/dist/primitives/foreign.js +83 -44
  42. package/dist/primitives/foreign.js.map +1 -1
  43. package/dist/primitives/lazy.js +2 -2
  44. package/dist/primitives/lazy.js.map +1 -1
  45. package/dist/primitives/selector.js +1 -1
  46. package/dist/primitives/selector.js.map +1 -1
  47. package/dist/primitives/slice.d.ts.map +1 -1
  48. package/dist/primitives/slice.js +5 -0
  49. package/dist/primitives/slice.js.map +1 -1
  50. package/dist/primitives/text.js +3 -3
  51. package/dist/primitives/text.js.map +1 -1
  52. package/dist/primitives/unsafe-html.js +11 -13
  53. package/dist/primitives/unsafe-html.js.map +1 -1
  54. package/dist/primitives/virtual-each.d.ts.map +1 -1
  55. package/dist/primitives/virtual-each.js +5 -3
  56. package/dist/primitives/virtual-each.js.map +1 -1
  57. package/dist/render-context.d.ts +9 -0
  58. package/dist/render-context.d.ts.map +1 -1
  59. package/dist/render-context.js.map +1 -1
  60. package/dist/ssr/jsdom.d.ts +18 -0
  61. package/dist/ssr/jsdom.d.ts.map +1 -0
  62. package/dist/ssr/jsdom.js +38 -0
  63. package/dist/ssr/jsdom.js.map +1 -0
  64. package/dist/ssr/legacy.d.ts +25 -0
  65. package/dist/ssr/legacy.d.ts.map +1 -0
  66. package/dist/ssr/legacy.js +61 -0
  67. package/dist/ssr/legacy.js.map +1 -0
  68. package/dist/ssr/linkedom.d.ts +17 -0
  69. package/dist/ssr/linkedom.d.ts.map +1 -0
  70. package/dist/ssr/linkedom.js +36 -0
  71. package/dist/ssr/linkedom.js.map +1 -0
  72. package/dist/ssr-dom.d.ts +11 -7
  73. package/dist/ssr-dom.d.ts.map +1 -1
  74. package/dist/ssr-dom.js +10 -31
  75. package/dist/ssr-dom.js.map +1 -1
  76. package/dist/ssr.d.ts +10 -5
  77. package/dist/ssr.d.ts.map +1 -1
  78. package/dist/ssr.js +11 -7
  79. package/dist/ssr.js.map +1 -1
  80. package/dist/svg-elements.js +2 -2
  81. package/dist/svg-elements.js.map +1 -1
  82. package/dist/types.d.ts +15 -1
  83. package/dist/types.d.ts.map +1 -1
  84. package/dist/types.js.map +1 -1
  85. package/dist/update-loop.d.ts +3 -1
  86. package/dist/update-loop.d.ts.map +1 -1
  87. package/dist/update-loop.js +15 -1
  88. package/dist/update-loop.js.map +1 -1
  89. package/dist/view-helpers.d.ts +7 -0
  90. package/dist/view-helpers.d.ts.map +1 -1
  91. package/dist/view-helpers.js +2 -0
  92. package/dist/view-helpers.js.map +1 -1
  93. package/package.json +25 -1
  94. package/dist/scope.d.ts +0 -39
  95. package/dist/scope.d.ts.map +0 -1
  96. package/dist/scope.js +0 -250
  97. package/dist/scope.js.map +0 -1
@@ -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\nconst buildCtx: RenderContext = {\n rootLifetime: null as unknown as Lifetime,\n state: null,\n allBindings: [],\n structuralBlocks: [],\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 = document.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 = document.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 for (const entry of entries) {\n disposeLifetime(entry.scope, true)\n }\n entries.length = 0\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.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 = document.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 = document.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 = document.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 = document.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 = document.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 = document.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 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 for (const entry of entries) {\n disposeLifetime(entry.scope, true)\n }\n entries.length = 0\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 +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,CAiFR"}
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,CAmHR"}
@@ -7,64 +7,86 @@ export function foreign(opts) {
7
7
  const parentLifetime = ctx.rootLifetime;
8
8
  const foreignScope = createLifetime(parentLifetime);
9
9
  foreignScope._kind = 'foreign';
10
- // Create container element
10
+ // Create container element — cast to HTMLElement since foreign() is
11
+ // HTML-only (no SVG/MathML foreign containers) and HTMLElement is the
12
+ // contract callers see on the `mount({ container })` argument.
11
13
  const tag = opts.container?.tag ?? 'div';
12
- const container = document.createElement(tag);
14
+ const container = ctx.dom.createElement(tag);
13
15
  if (opts.container?.attrs) {
14
16
  for (const [key, value] of Object.entries(opts.container.attrs)) {
15
17
  container.setAttribute(key, value);
16
18
  }
17
19
  }
18
- // Mount the foreign instance
19
- const instance = opts.mount({ container, send: ctx.send });
20
- // Evaluate initial props and call sync
21
- let prevProps = undefined;
22
- const initialProps = opts.props(ctx.state);
23
- if (typeof opts.sync === 'function') {
24
- opts.sync({ instance, props: initialProps, prev: undefined });
25
- }
26
- else {
27
- for (const key of Object.keys(initialProps)) {
28
- const handler = opts.sync[key];
29
- if (handler) {
30
- handler({ instance, value: initialProps[key], prev: undefined });
20
+ // Instance may resolve synchronously or asynchronously. `instance ===
21
+ // undefined` means "not ready yet" `sync` is suppressed and the
22
+ // binding below only tracks `latestProps`. When the instance arrives,
23
+ // an initial `sync` runs with `latestProps` (may differ from the props
24
+ // at mount time if state changed while awaiting).
25
+ const mountResult = opts.mount({ container, send: ctx.send });
26
+ let instance = undefined;
27
+ let disposed = false;
28
+ let latestProps = opts.props(ctx.state);
29
+ let syncedProps = undefined;
30
+ const callSync = (props, prev) => {
31
+ if (typeof opts.sync === 'function') {
32
+ opts.sync({ instance: instance, props, prev });
33
+ }
34
+ else {
35
+ for (const key of Object.keys(props)) {
36
+ if (!prev || !Object.is(props[key], prev[key])) {
37
+ const handler = opts.sync[key];
38
+ if (handler) {
39
+ handler({ instance: instance, value: props[key], prev: prev?.[key] });
40
+ }
41
+ }
31
42
  }
32
43
  }
44
+ syncedProps = props;
45
+ };
46
+ const isPromise = (v) => typeof v === 'object' && v !== null && typeof v.then === 'function';
47
+ if (isPromise(mountResult)) {
48
+ mountResult.then((resolved) => {
49
+ // Dispose-before-resolve: still destroy so the library cleans up
50
+ // whatever it allocated. Bail before calling sync.
51
+ if (disposed) {
52
+ opts.destroy(resolved);
53
+ return;
54
+ }
55
+ instance = resolved;
56
+ // Initial sync runs with the latest props the binding observed
57
+ // while we were awaiting. `prev: undefined` matches the sync-
58
+ // path semantics for the first sync call.
59
+ callSync(latestProps, undefined);
60
+ }, (err) => {
61
+ // Async mount failures shouldn't crash the app. Log once and
62
+ // leave the container empty — caller can inspect the DOM to
63
+ // detect the mount failed. `errorBoundary` catches sync mount
64
+ // throws but can't reach async rejections through the microtask
65
+ // queue, which is why we log here instead of re-throwing.
66
+ console.error('[LLui] foreign({ mount }) promise rejected:', err);
67
+ });
68
+ }
69
+ else {
70
+ instance = mountResult;
71
+ callSync(latestProps, undefined);
33
72
  }
34
- prevProps = initialProps;
35
73
  // Register a binding for the props accessor — fires when state changes
36
74
  createBinding(foreignScope, {
37
75
  mask: FULL_MASK,
38
76
  accessor: ((state) => {
39
77
  const newProps = opts.props(state);
40
- // Shallow-diff props
41
- let changed = false;
42
- if (!prevProps) {
43
- changed = true;
44
- }
45
- else {
46
- for (const key of Object.keys(newProps)) {
47
- if (!Object.is(newProps[key], prevProps[key])) {
48
- changed = true;
49
- break;
50
- }
51
- }
52
- }
78
+ // Shallow-diff against whichever we have: syncedProps is the
79
+ // truth once the instance is live; while still pending, latestProps
80
+ // is the most recent thing we've observed.
81
+ const compareTo = syncedProps ?? latestProps;
82
+ const changed = !shallowEqual(newProps, compareTo);
53
83
  if (changed) {
54
- if (typeof opts.sync === 'function') {
55
- opts.sync({ instance, props: newProps, prev: prevProps });
56
- }
57
- else {
58
- for (const key of Object.keys(newProps)) {
59
- if (!prevProps || !Object.is(newProps[key], prevProps[key])) {
60
- const handler = opts.sync[key];
61
- if (handler) {
62
- handler({ instance, value: newProps[key], prev: prevProps?.[key] });
63
- }
64
- }
65
- }
84
+ latestProps = newProps;
85
+ // Only sync if the instance is ready. If not, `latestProps`
86
+ // is updated and resolve will flush it.
87
+ if (instance !== undefined) {
88
+ callSync(newProps, syncedProps);
66
89
  }
67
- prevProps = newProps;
68
90
  }
69
91
  return newProps;
70
92
  }),
@@ -72,10 +94,27 @@ export function foreign(opts) {
72
94
  node: container,
73
95
  perItem: false,
74
96
  });
75
- // Destroy on scope disposal
97
+ // Destroy on scope disposal. If the mount promise is still pending,
98
+ // flip the disposed flag so the resolve handler takes the
99
+ // dispose-before-resolve path.
76
100
  addDisposer(foreignScope, () => {
77
- opts.destroy(instance);
101
+ disposed = true;
102
+ if (instance !== undefined) {
103
+ opts.destroy(instance);
104
+ }
105
+ // If instance is still undefined, the promise will destroy on resolve.
78
106
  });
79
107
  return [container];
80
108
  }
109
+ function shallowEqual(a, b) {
110
+ for (const key of Object.keys(a)) {
111
+ if (!Object.is(a[key], b[key]))
112
+ return false;
113
+ }
114
+ for (const key of Object.keys(b)) {
115
+ if (!(key in a))
116
+ return false;
117
+ }
118
+ return true;
119
+ }
81
120
  //# sourceMappingURL=foreign.js.map
@@ -1 +1 @@
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 } 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\n const tag = opts.container?.tag ?? 'div'\n const container = document.createElement(tag)\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 // Mount the foreign instance\n const instance = opts.mount({ container, send: ctx.send as Send<M> })\n\n // Evaluate initial props and call sync\n let prevProps: T | undefined = undefined\n const initialProps = opts.props(ctx.state as S)\n\n if (typeof opts.sync === 'function') {\n opts.sync({ instance, props: initialProps, prev: undefined })\n } else {\n for (const key of Object.keys(initialProps) as Array<keyof T>) {\n const handler = opts.sync[key]\n if (handler) {\n handler({ instance, value: initialProps[key], prev: undefined })\n }\n }\n }\n prevProps = initialProps\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 = opts.props(state)\n // Shallow-diff props\n let changed = false\n if (!prevProps) {\n changed = true\n } else {\n for (const key of Object.keys(newProps) as Array<keyof T>) {\n if (!Object.is(newProps[key], prevProps[key])) {\n changed = true\n break\n }\n }\n }\n\n if (changed) {\n if (typeof opts.sync === 'function') {\n opts.sync({ instance, props: newProps, prev: prevProps })\n } else {\n for (const key of Object.keys(newProps) as Array<keyof T>) {\n if (!prevProps || !Object.is(newProps[key], prevProps[key])) {\n const handler = opts.sync[key]\n if (handler) {\n handler({ instance, value: newProps[key], prev: prevProps?.[key] })\n }\n }\n }\n }\n prevProps = newProps\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\n addDisposer(foreignScope, () => {\n opts.destroy(instance)\n })\n\n return [container]\n}\n"]}
1
+ {"version":3,"file":"foreign.js","sourceRoot":"","sources":["../../src/primitives/foreign.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5D,MAAM,SAAS,GAAG,UAAU,CAAA;AAE5B,MAAM,UAAU,OAAO,CACrB,IAAuC;IAEvC,MAAM,GAAG,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAA;IACvC,MAAM,cAAc,GAAG,GAAG,CAAC,YAAY,CAAA;IACvC,MAAM,YAAY,GAAG,cAAc,CAAC,cAAc,CAAC,CAAA;IACnD,YAAY,CAAC,KAAK,GAAG,SAAS,CAAA;IAE9B,oEAAoE;IACpE,sEAAsE;IACtE,+DAA+D;IAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,KAAK,CAAA;IACxC,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAgB,CAAA;IAC3D,IAAI,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;QAC1B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAChE,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACpC,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,kEAAkE;IAClE,sEAAsE;IACtE,uEAAuE;IACvE,kDAAkD;IAClD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,IAAe,EAAE,CAAC,CAAA;IACxE,IAAI,QAAQ,GAAyB,SAAS,CAAA;IAC9C,IAAI,QAAQ,GAAG,KAAK,CAAA;IACpB,IAAI,WAAW,GAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAU,CAAC,CAAA;IAC/C,IAAI,WAAW,GAAkB,SAAS,CAAA;IAE1C,MAAM,QAAQ,GAAG,CAAC,KAAQ,EAAE,IAAmB,EAAE,EAAE;QACjD,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAoB,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QAC5D,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAmB,EAAE,CAAC;gBACvD,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;oBAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;oBAC9B,IAAI,OAAO,EAAE,CAAC;wBACZ,OAAO,CAAC,EAAE,QAAQ,EAAE,QAAoB,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;oBACnF,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,WAAW,GAAG,KAAK,CAAA;IACrB,CAAC,CAAA;IAED,MAAM,SAAS,GAAG,CAAC,CAAU,EAA0B,EAAE,CACvD,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,OAAQ,CAAwB,CAAC,IAAI,KAAK,UAAU,CAAA;IAE7F,IAAI,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC;QAC3B,WAAW,CAAC,IAAI,CACd,CAAC,QAAQ,EAAE,EAAE;YACX,iEAAiE;YACjE,mDAAmD;YACnD,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;gBACtB,OAAM;YACR,CAAC;YACD,QAAQ,GAAG,QAAQ,CAAA;YACnB,+DAA+D;YAC/D,8DAA8D;YAC9D,0CAA0C;YAC1C,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;QAClC,CAAC,EACD,CAAC,GAAG,EAAE,EAAE;YACN,6DAA6D;YAC7D,4DAA4D;YAC5D,8DAA8D;YAC9D,gEAAgE;YAChE,0DAA0D;YAC1D,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,GAAG,CAAC,CAAA;QACnE,CAAC,CACF,CAAA;IACH,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,WAAW,CAAA;QACtB,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;IAClC,CAAC;IAED,uEAAuE;IACvE,aAAa,CAAC,YAAY,EAAE;QAC1B,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,CAAC,CAAC,KAAQ,EAAE,EAAE;YACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YAClC,6DAA6D;YAC7D,oEAAoE;YACpE,2CAA2C;YAC3C,MAAM,SAAS,GAAG,WAAW,IAAI,WAAW,CAAA;YAC5C,MAAM,OAAO,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;YAElD,IAAI,OAAO,EAAE,CAAC;gBACZ,WAAW,GAAG,QAAQ,CAAA;gBACtB,4DAA4D;gBAC5D,wCAAwC;gBACxC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;oBAC3B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;gBACjC,CAAC;YACH,CAAC;YAED,OAAO,QAAQ,CAAA;QACjB,CAAC,CAA8B;QAC/B,IAAI,EAAE,MAAM,EAAE,qDAAqD;QACnE,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,KAAK;KACf,CAAC,CAAA;IAEF,oEAAoE;IACpE,0DAA0D;IAC1D,+BAA+B;IAC/B,WAAW,CAAC,YAAY,EAAE,GAAG,EAAE;QAC7B,QAAQ,GAAG,IAAI,CAAA;QACf,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QACxB,CAAC;QACD,uEAAuE;IACzE,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,SAAS,CAAC,CAAA;AACpB,CAAC;AAED,SAAS,YAAY,CAAoC,CAAI,EAAE,CAAI;IACjE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAmB,EAAE,CAAC;QACnD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;YAAE,OAAO,KAAK,CAAA;IAC9C,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAmB,EAAE,CAAC;QACnD,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAAE,OAAO,KAAK,CAAA;IAC/B,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC","sourcesContent":["import type { ForeignOptions, Send } from '../types.js'\nimport { getRenderContext } 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 let latestProps: T = opts.props(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 = opts.props(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"]}
@@ -31,8 +31,8 @@ export function lazy(opts) {
31
31
  const parentLifetime = ctx.rootLifetime;
32
32
  const send = ctx.send;
33
33
  // Anchor marks the insertion point; fallback nodes live between anchor and endAnchor
34
- const startAnchor = document.createComment('lazy');
35
- const endAnchor = document.createComment('/lazy');
34
+ const startAnchor = ctx.dom.createComment('lazy');
35
+ const endAnchor = ctx.dom.createComment('/lazy');
36
36
  // Build fallback inside its own sub-scope (disposed when we swap in loaded component)
37
37
  let currentLifetime = createLifetime(parentLifetime);
38
38
  setRenderContext({ ...ctx, rootLifetime: currentLifetime });
@@ -1 +1 @@
1
- {"version":3,"file":"lazy.js","sourceRoot":"","sources":["../../src/primitives/lazy.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ComponentDef, LazyDef } from '../types.js'\nimport { getRenderContext, setRenderContext, clearRenderContext } from '../render-context.js'\nimport { createLifetime, disposeLifetime, addDisposer } from '../lifetime.js'\nimport { createComponentInstance, type ComponentInstance } from '../update-loop.js'\nimport { setFlatBindings } from '../binding.js'\nimport { createView, type View } from '../view-helpers.js'\n\nexport interface LazyOptions<S, M, D> {\n /** Async loader — typically `() => import('./MyComponent').then(m => m.default)`. */\n loader: () => Promise<LazyDef<D>>\n /** Nodes to render while loading. */\n fallback: (h: View<S, M>) => Node[]\n /** Nodes to render if the loader rejects. */\n error?: (err: Error, h: View<S, M>) => Node[]\n /** Props passed as init data to the loaded component. Evaluated once at resolution. */\n data?: (s: S) => D\n}\n\n/**\n * Load a component asynchronously. Renders `fallback` immediately, then swaps\n * in the loaded component when the loader's Promise resolves. If the loader\n * rejects, renders `error` (or nothing if no error handler is provided).\n *\n * ```ts\n * view: ({ text }) => [\n * ...lazy({\n * loader: () => import('./Chart').then(m => m.default),\n * fallback: ({ text }) => [div([text('Loading chart...')])],\n * error: (err, { text }) => [div([text(`Failed: ${err.message}`)])],\n * }),\n * ]\n * ```\n *\n * The loaded component's S, M, E types are internal — `lazy()` only needs\n * the `D` (init data) type to match. `LazyDef<D>` is a type-erased shape\n * that any `ComponentDef<S, M, E, D>` satisfies structurally, avoiding the\n * `View<S, M>` invariance trap that would otherwise require user-side casts.\n *\n * If the parent scope is disposed before the loader resolves, the load is\n * cancelled — the loaded component is never mounted.\n */\nexport function lazy<S, M, D = undefined>(opts: LazyOptions<S, M, D>): Node[] {\n const ctx = getRenderContext('lazy')\n const parentLifetime = ctx.rootLifetime\n const send = ctx.send as (msg: M) => void\n\n // Anchor marks the insertion point; fallback nodes live between anchor and endAnchor\n const startAnchor = document.createComment('lazy')\n const endAnchor = document.createComment('/lazy')\n\n // Build fallback inside its own sub-scope (disposed when we swap in loaded component)\n let currentLifetime = createLifetime(parentLifetime)\n setRenderContext({ ...ctx, rootLifetime: currentLifetime })\n let currentNodes = opts.fallback(createView<S, M>(send))\n clearRenderContext()\n setRenderContext(ctx)\n\n let cancelled = false\n addDisposer(parentLifetime, () => {\n cancelled = true\n })\n\n const swap = (buildNew: () => Node[]): void => {\n if (cancelled) return\n const parent = startAnchor.parentNode\n if (!parent) return\n\n // Dispose old sub-scope (removes fallback bindings/listeners)\n if (currentLifetime) disposeLifetime(currentLifetime)\n for (const node of currentNodes) {\n if (node.parentNode === parent) parent.removeChild(node)\n }\n\n // Build new nodes in a fresh sub-scope\n currentLifetime = createLifetime(parentLifetime)\n setRenderContext({ ...ctx, rootLifetime: currentLifetime })\n currentNodes = buildNew()\n clearRenderContext()\n setRenderContext(ctx)\n\n // Insert after startAnchor (before endAnchor)\n for (const node of currentNodes) {\n parent.insertBefore(node, endAnchor)\n }\n }\n\n // Kick off the loader\n opts\n .loader()\n .then((def) => {\n if (cancelled) return\n swap(() => {\n // Mount loaded component as a nested instance (similar to child()).\n // Cast LazyDef back to ComponentDef — safe because the loader\n // returned a real ComponentDef; LazyDef only erased the types.\n const initialProps = opts.data ? opts.data(ctx.state as S) : undefined\n const childInst = createComponentInstance(\n def as unknown as ComponentDef<unknown, unknown, unknown, unknown>,\n initialProps,\n )\n\n // Render the loaded component's view inside its own render context\n setFlatBindings(childInst.allBindings)\n setRenderContext({\n ...childInst,\n send: childInst.send as (msg: unknown) => void,\n instance: childInst as ComponentInstance,\n })\n const nodes = (def as { view: (h: unknown) => Node[] }).view(createView(childInst.send))\n clearRenderContext()\n setFlatBindings(ctx.allBindings)\n setRenderContext(ctx)\n\n // Dispose the loaded instance when our current sub-scope disposes\n addDisposer(currentLifetime, () => {\n disposeLifetime(childInst.rootLifetime)\n })\n\n return nodes\n })\n })\n .catch((err: unknown) => {\n if (cancelled) return\n if (!opts.error) return\n const e = err instanceof Error ? err : new Error(String(err))\n swap(() => opts.error!(e, createView<S, M>(send)))\n })\n\n return [startAnchor, ...currentNodes, endAnchor]\n}\n"]}
1
+ {"version":3,"file":"lazy.js","sourceRoot":"","sources":["../../src/primitives/lazy.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ComponentDef, LazyDef } from '../types.js'\nimport { getRenderContext, setRenderContext, clearRenderContext } from '../render-context.js'\nimport { createLifetime, disposeLifetime, addDisposer } from '../lifetime.js'\nimport { createComponentInstance, type ComponentInstance } from '../update-loop.js'\nimport { setFlatBindings } from '../binding.js'\nimport { createView, type View } from '../view-helpers.js'\n\nexport interface LazyOptions<S, M, D> {\n /** Async loader — typically `() => import('./MyComponent').then(m => m.default)`. */\n loader: () => Promise<LazyDef<D>>\n /** Nodes to render while loading. */\n fallback: (h: View<S, M>) => Node[]\n /** Nodes to render if the loader rejects. */\n error?: (err: Error, h: View<S, M>) => Node[]\n /** Props passed as init data to the loaded component. Evaluated once at resolution. */\n data?: (s: S) => D\n}\n\n/**\n * Load a component asynchronously. Renders `fallback` immediately, then swaps\n * in the loaded component when the loader's Promise resolves. If the loader\n * rejects, renders `error` (or nothing if no error handler is provided).\n *\n * ```ts\n * view: ({ text }) => [\n * ...lazy({\n * loader: () => import('./Chart').then(m => m.default),\n * fallback: ({ text }) => [div([text('Loading chart...')])],\n * error: (err, { text }) => [div([text(`Failed: ${err.message}`)])],\n * }),\n * ]\n * ```\n *\n * The loaded component's S, M, E types are internal — `lazy()` only needs\n * the `D` (init data) type to match. `LazyDef<D>` is a type-erased shape\n * that any `ComponentDef<S, M, E, D>` satisfies structurally, avoiding the\n * `View<S, M>` invariance trap that would otherwise require user-side casts.\n *\n * If the parent scope is disposed before the loader resolves, the load is\n * cancelled — the loaded component is never mounted.\n */\nexport function lazy<S, M, D = undefined>(opts: LazyOptions<S, M, D>): Node[] {\n const ctx = getRenderContext('lazy')\n const parentLifetime = ctx.rootLifetime\n const send = ctx.send as (msg: M) => void\n\n // Anchor marks the insertion point; fallback nodes live between anchor and endAnchor\n const startAnchor = ctx.dom.createComment('lazy')\n const endAnchor = ctx.dom.createComment('/lazy')\n\n // Build fallback inside its own sub-scope (disposed when we swap in loaded component)\n let currentLifetime = createLifetime(parentLifetime)\n setRenderContext({ ...ctx, rootLifetime: currentLifetime })\n let currentNodes = opts.fallback(createView<S, M>(send))\n clearRenderContext()\n setRenderContext(ctx)\n\n let cancelled = false\n addDisposer(parentLifetime, () => {\n cancelled = true\n })\n\n const swap = (buildNew: () => Node[]): void => {\n if (cancelled) return\n const parent = startAnchor.parentNode\n if (!parent) return\n\n // Dispose old sub-scope (removes fallback bindings/listeners)\n if (currentLifetime) disposeLifetime(currentLifetime)\n for (const node of currentNodes) {\n if (node.parentNode === parent) parent.removeChild(node)\n }\n\n // Build new nodes in a fresh sub-scope\n currentLifetime = createLifetime(parentLifetime)\n setRenderContext({ ...ctx, rootLifetime: currentLifetime })\n currentNodes = buildNew()\n clearRenderContext()\n setRenderContext(ctx)\n\n // Insert after startAnchor (before endAnchor)\n for (const node of currentNodes) {\n parent.insertBefore(node, endAnchor)\n }\n }\n\n // Kick off the loader\n opts\n .loader()\n .then((def) => {\n if (cancelled) return\n swap(() => {\n // Mount loaded component as a nested instance (similar to child()).\n // Cast LazyDef back to ComponentDef — safe because the loader\n // returned a real ComponentDef; LazyDef only erased the types.\n const initialProps = opts.data ? opts.data(ctx.state as S) : undefined\n const childInst = createComponentInstance(\n def as unknown as ComponentDef<unknown, unknown, unknown, unknown>,\n initialProps,\n )\n\n // Render the loaded component's view inside its own render context\n setFlatBindings(childInst.allBindings)\n setRenderContext({\n ...childInst,\n send: childInst.send as (msg: unknown) => void,\n instance: childInst as ComponentInstance,\n })\n const nodes = (def as { view: (h: unknown) => Node[] }).view(createView(childInst.send))\n clearRenderContext()\n setFlatBindings(ctx.allBindings)\n setRenderContext(ctx)\n\n // Dispose the loaded instance when our current sub-scope disposes\n addDisposer(currentLifetime, () => {\n disposeLifetime(childInst.rootLifetime)\n })\n\n return nodes\n })\n })\n .catch((err: unknown) => {\n if (cancelled) return\n if (!opts.error) return\n const e = err instanceof Error ? err : new Error(String(err))\n swap(() => opts.error!(e, createView<S, M>(send)))\n })\n\n return [startAnchor, ...currentNodes, endAnchor]\n}\n"]}
@@ -63,7 +63,7 @@ export function selector(field) {
63
63
  mask: FULL_MASK,
64
64
  accessor: ((state) => updateSelector(state)),
65
65
  kind: 'text',
66
- node: document.createComment('selector'),
66
+ node: ctx.dom.createComment('selector'),
67
67
  perItem: false,
68
68
  });
69
69
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"selector.js","sourceRoot":"","sources":["../../src/primitives/selector.ts"],"names":[],"mappings":"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","sourcesContent":["import { getRenderContext } from '../render-context.js'\nimport { createBinding, applyBinding } from '../binding.js'\nimport { addDisposer } from '../lifetime.js'\nimport { FULL_MASK } from '../update-loop.js'\nimport { registerOnClear } from './each.js'\nimport type { BindingKind } from '../types.js'\n\ninterface SelectorEntry {\n node: Node\n kind: BindingKind\n key: string | undefined\n lastValue: unknown\n transform: (match: boolean) => unknown\n gen: number\n}\n\n/**\n * Optimized \"one-of-N\" reactive binding — O(1) updates instead of O(n).\n *\n * Uses a generation counter instead of per-row disposers:\n * - bind() tags entries with the current generation\n * - Individual row removal bumps the generation for that entry (set gen = -1)\n * - Bulk clear bumps the generation and clears the registry via registerOnClear\n * - updateSelector() skips stale entries (gen !== current) and compacts lazily\n *\n * Zero per-row closure allocations. Zero Set.delete calls on disposal.\n */\nexport function selector<S, V>(field: (s: S) => V): SelectorInstance<V> {\n const ctx = getRenderContext('selector')\n const scope = ctx.rootLifetime\n\n const registry = new Map<V, SelectorEntry[]>()\n let lastValue: V = field(ctx.state as S)\n let generation = 0\n let registeredOnClear = false\n\n function updateBucket(bucket: SelectorEntry[], match: boolean, gen: number): void {\n let hasStale = false\n for (let i = 0; i < bucket.length; i++) {\n const entry = bucket[i]!\n if (entry.gen !== gen) {\n hasStale = true\n continue\n }\n const v = entry.transform(match)\n if (!Object.is(v, entry.lastValue)) {\n entry.lastValue = v\n applyBinding({ kind: entry.kind, node: entry.node, key: entry.key }, v)\n }\n }\n // Lazy compaction — remove stale entries when encountered\n if (hasStale) {\n let w = 0\n for (let r = 0; r < bucket.length; r++) {\n if (bucket[r]!.gen === gen) bucket[w++] = bucket[r]!\n }\n bucket.length = w\n }\n }\n\n function updateSelector(state: S): V {\n const newValue = field(state)\n if (Object.is(newValue, lastValue)) return lastValue\n const gen = generation\n\n const oldBucket = registry.get(lastValue)\n if (oldBucket) updateBucket(oldBucket, false, gen)\n\n const newBucket = registry.get(newValue)\n if (newBucket) updateBucket(newBucket, true, gen)\n\n lastValue = newValue\n return newValue\n }\n\n createBinding(scope, {\n mask: FULL_MASK,\n accessor: ((state: S) => updateSelector(state)) as (state: never) => unknown,\n kind: 'text',\n node: document.createComment('selector'),\n perItem: false,\n })\n\n return {\n bind(\n node: Node,\n key: V | (() => V),\n kind: BindingKind,\n propKey: string | undefined,\n transform: (match: boolean) => unknown,\n ): void {\n const currentKey = typeof key === 'function' ? (key as () => V)() : key\n const initialMatch = Object.is(lastValue, currentKey)\n const initialValue = transform(initialMatch)\n\n applyBinding({ kind, node, key: propKey }, initialValue)\n\n const entry: SelectorEntry = {\n node,\n kind,\n key: propKey,\n lastValue: initialValue,\n transform,\n gen: generation,\n }\n\n let bucket = registry.get(currentKey)\n if (!bucket) {\n bucket = []\n registry.set(currentKey, bucket)\n }\n bucket.push(entry)\n\n // Register bulk clear callback (once per selector per each() block)\n if (!registeredOnClear) {\n registerOnClear(() => {\n generation++\n registry.clear()\n })\n registeredOnClear = true\n }\n\n // Per-row disposer for generic reconcile paths (scope disposal).\n // Uses generation check to skip work if already bulk-cleared.\n const gen = generation\n const itemLifetime = getRenderContext('selector').rootLifetime\n addDisposer(itemLifetime, () => {\n if (gen !== generation) return // already bulk-cleared, no-op\n const idx = bucket!.indexOf(entry)\n if (idx !== -1) bucket!.splice(idx, 1)\n if (bucket!.length === 0) registry.delete(currentKey)\n })\n },\n\n __directUpdate(state: unknown): void {\n updateSelector(state as S)\n },\n }\n}\n\nexport interface SelectorInstance<V> {\n bind(\n node: Node,\n key: V | (() => V),\n kind: BindingKind,\n propKey: string | undefined,\n transform: (match: boolean) => unknown,\n ): void\n __directUpdate(state: unknown): void\n}\n"]}
1
+ {"version":3,"file":"selector.js","sourceRoot":"","sources":["../../src/primitives/selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAY3C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,QAAQ,CAAO,KAAkB;IAC/C,MAAM,GAAG,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAA;IACxC,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAA;IAE9B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAsB,CAAA;IAC9C,IAAI,SAAS,GAAM,KAAK,CAAC,GAAG,CAAC,KAAU,CAAC,CAAA;IACxC,IAAI,UAAU,GAAG,CAAC,CAAA;IAClB,IAAI,iBAAiB,GAAG,KAAK,CAAA;IAE7B,SAAS,YAAY,CAAC,MAAuB,EAAE,KAAc,EAAE,GAAW;QACxE,IAAI,QAAQ,GAAG,KAAK,CAAA;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAE,CAAA;YACxB,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;gBACtB,QAAQ,GAAG,IAAI,CAAA;gBACf,SAAQ;YACV,CAAC;YACD,MAAM,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;YAChC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;gBACnC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAA;gBACnB,YAAY,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAA;YACzE,CAAC;QACH,CAAC;QACD,0DAA0D;QAC1D,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,CAAA;YACT,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACvC,IAAI,MAAM,CAAC,CAAC,CAAE,CAAC,GAAG,KAAK,GAAG;oBAAE,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE,CAAA;YACtD,CAAC;YACD,MAAM,CAAC,MAAM,GAAG,CAAC,CAAA;QACnB,CAAC;IACH,CAAC;IAED,SAAS,cAAc,CAAC,KAAQ;QAC9B,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAA;QAC7B,IAAI,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC;YAAE,OAAO,SAAS,CAAA;QACpD,MAAM,GAAG,GAAG,UAAU,CAAA;QAEtB,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACzC,IAAI,SAAS;YAAE,YAAY,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;QAElD,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACxC,IAAI,SAAS;YAAE,YAAY,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;QAEjD,SAAS,GAAG,QAAQ,CAAA;QACpB,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,aAAa,CAAC,KAAK,EAAE;QACnB,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,CAAC,CAAC,KAAQ,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAA8B;QAC5E,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC;QACvC,OAAO,EAAE,KAAK;KACf,CAAC,CAAA;IAEF,OAAO;QACL,IAAI,CACF,IAAU,EACV,GAAkB,EAClB,IAAiB,EACjB,OAA2B,EAC3B,SAAsC;YAEtC,MAAM,UAAU,GAAG,OAAO,GAAG,KAAK,UAAU,CAAC,CAAC,CAAE,GAAe,EAAE,CAAC,CAAC,CAAC,GAAG,CAAA;YACvE,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;YACrD,MAAM,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC,CAAA;YAE5C,YAAY,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,YAAY,CAAC,CAAA;YAExD,MAAM,KAAK,GAAkB;gBAC3B,IAAI;gBACJ,IAAI;gBACJ,GAAG,EAAE,OAAO;gBACZ,SAAS,EAAE,YAAY;gBACvB,SAAS;gBACT,GAAG,EAAE,UAAU;aAChB,CAAA;YAED,IAAI,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;YACrC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,GAAG,EAAE,CAAA;gBACX,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;YAClC,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAElB,oEAAoE;YACpE,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,eAAe,CAAC,GAAG,EAAE;oBACnB,UAAU,EAAE,CAAA;oBACZ,QAAQ,CAAC,KAAK,EAAE,CAAA;gBAClB,CAAC,CAAC,CAAA;gBACF,iBAAiB,GAAG,IAAI,CAAA;YAC1B,CAAC;YAED,iEAAiE;YACjE,8DAA8D;YAC9D,MAAM,GAAG,GAAG,UAAU,CAAA;YACtB,MAAM,YAAY,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC,YAAY,CAAA;YAC9D,WAAW,CAAC,YAAY,EAAE,GAAG,EAAE;gBAC7B,IAAI,GAAG,KAAK,UAAU;oBAAE,OAAM,CAAC,8BAA8B;gBAC7D,MAAM,GAAG,GAAG,MAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;gBAClC,IAAI,GAAG,KAAK,CAAC,CAAC;oBAAE,MAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;gBACtC,IAAI,MAAO,CAAC,MAAM,KAAK,CAAC;oBAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;YACvD,CAAC,CAAC,CAAA;QACJ,CAAC;QAED,cAAc,CAAC,KAAc;YAC3B,cAAc,CAAC,KAAU,CAAC,CAAA;QAC5B,CAAC;KACF,CAAA;AACH,CAAC","sourcesContent":["import { getRenderContext } from '../render-context.js'\nimport { createBinding, applyBinding } from '../binding.js'\nimport { addDisposer } from '../lifetime.js'\nimport { FULL_MASK } from '../update-loop.js'\nimport { registerOnClear } from './each.js'\nimport type { BindingKind } from '../types.js'\n\ninterface SelectorEntry {\n node: Node\n kind: BindingKind\n key: string | undefined\n lastValue: unknown\n transform: (match: boolean) => unknown\n gen: number\n}\n\n/**\n * Optimized \"one-of-N\" reactive binding — O(1) updates instead of O(n).\n *\n * Uses a generation counter instead of per-row disposers:\n * - bind() tags entries with the current generation\n * - Individual row removal bumps the generation for that entry (set gen = -1)\n * - Bulk clear bumps the generation and clears the registry via registerOnClear\n * - updateSelector() skips stale entries (gen !== current) and compacts lazily\n *\n * Zero per-row closure allocations. Zero Set.delete calls on disposal.\n */\nexport function selector<S, V>(field: (s: S) => V): SelectorInstance<V> {\n const ctx = getRenderContext('selector')\n const scope = ctx.rootLifetime\n\n const registry = new Map<V, SelectorEntry[]>()\n let lastValue: V = field(ctx.state as S)\n let generation = 0\n let registeredOnClear = false\n\n function updateBucket(bucket: SelectorEntry[], match: boolean, gen: number): void {\n let hasStale = false\n for (let i = 0; i < bucket.length; i++) {\n const entry = bucket[i]!\n if (entry.gen !== gen) {\n hasStale = true\n continue\n }\n const v = entry.transform(match)\n if (!Object.is(v, entry.lastValue)) {\n entry.lastValue = v\n applyBinding({ kind: entry.kind, node: entry.node, key: entry.key }, v)\n }\n }\n // Lazy compaction — remove stale entries when encountered\n if (hasStale) {\n let w = 0\n for (let r = 0; r < bucket.length; r++) {\n if (bucket[r]!.gen === gen) bucket[w++] = bucket[r]!\n }\n bucket.length = w\n }\n }\n\n function updateSelector(state: S): V {\n const newValue = field(state)\n if (Object.is(newValue, lastValue)) return lastValue\n const gen = generation\n\n const oldBucket = registry.get(lastValue)\n if (oldBucket) updateBucket(oldBucket, false, gen)\n\n const newBucket = registry.get(newValue)\n if (newBucket) updateBucket(newBucket, true, gen)\n\n lastValue = newValue\n return newValue\n }\n\n createBinding(scope, {\n mask: FULL_MASK,\n accessor: ((state: S) => updateSelector(state)) as (state: never) => unknown,\n kind: 'text',\n node: ctx.dom.createComment('selector'),\n perItem: false,\n })\n\n return {\n bind(\n node: Node,\n key: V | (() => V),\n kind: BindingKind,\n propKey: string | undefined,\n transform: (match: boolean) => unknown,\n ): void {\n const currentKey = typeof key === 'function' ? (key as () => V)() : key\n const initialMatch = Object.is(lastValue, currentKey)\n const initialValue = transform(initialMatch)\n\n applyBinding({ kind, node, key: propKey }, initialValue)\n\n const entry: SelectorEntry = {\n node,\n kind,\n key: propKey,\n lastValue: initialValue,\n transform,\n gen: generation,\n }\n\n let bucket = registry.get(currentKey)\n if (!bucket) {\n bucket = []\n registry.set(currentKey, bucket)\n }\n bucket.push(entry)\n\n // Register bulk clear callback (once per selector per each() block)\n if (!registeredOnClear) {\n registerOnClear(() => {\n generation++\n registry.clear()\n })\n registeredOnClear = true\n }\n\n // Per-row disposer for generic reconcile paths (scope disposal).\n // Uses generation check to skip work if already bulk-cleared.\n const gen = generation\n const itemLifetime = getRenderContext('selector').rootLifetime\n addDisposer(itemLifetime, () => {\n if (gen !== generation) return // already bulk-cleared, no-op\n const idx = bucket!.indexOf(entry)\n if (idx !== -1) bucket!.splice(idx, 1)\n if (bucket!.length === 0) registry.delete(currentKey)\n })\n },\n\n __directUpdate(state: unknown): void {\n updateSelector(state as S)\n },\n }\n}\n\nexport interface SelectorInstance<V> {\n bind(\n node: Node,\n key: V | (() => V),\n kind: BindingKind,\n propKey: string | undefined,\n transform: (match: boolean) => unknown,\n ): void\n __directUpdate(state: unknown): void\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"slice.d.ts","sourceRoot":"","sources":["../../src/primitives/slice.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAyD,MAAM,aAAa,CAAA;AAC9F,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAY9C;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,EAChC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG;IAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;CAAE,EACpC,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,GAAG,GACrB,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAsFd"}
1
+ {"version":3,"file":"slice.d.ts","sourceRoot":"","sources":["../../src/primitives/slice.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAyD,MAAM,aAAa,CAAA;AAC9F,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AAa9C;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,EAChC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG;IAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;CAAE,EACpC,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,GAAG,GACrB,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CA2Fd"}