@vobs/runtime 1.7.8 → 1.8.1

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 (127) hide show
  1. package/README.md +1 -1
  2. package/dist/async-boundary.cjs +14 -4
  3. package/dist/async-boundary.cjs.map +1 -1
  4. package/dist/async-boundary.js +17 -7
  5. package/dist/async-boundary.js.map +1 -1
  6. package/dist/bind.cjs +43 -3
  7. package/dist/bind.cjs.map +1 -1
  8. package/dist/bind.js +48 -8
  9. package/dist/bind.js.map +1 -1
  10. package/dist/boundary.cjs +159 -84
  11. package/dist/boundary.cjs.map +1 -1
  12. package/dist/boundary.js +162 -87
  13. package/dist/boundary.js.map +1 -1
  14. package/dist/client-only.cjs +323 -0
  15. package/dist/client-only.cjs.map +1 -0
  16. package/dist/client-only.d.cts +42 -0
  17. package/dist/client-only.d.ts +42 -0
  18. package/dist/client-only.js +299 -0
  19. package/dist/client-only.js.map +1 -0
  20. package/dist/debug.cjs.map +1 -1
  21. package/dist/debug.d.cts +12 -2
  22. package/dist/debug.d.ts +12 -2
  23. package/dist/debug.js.map +1 -1
  24. package/dist/dom-events.cjs +46 -0
  25. package/dist/dom-events.cjs.map +1 -0
  26. package/dist/dom-events.d.cts +23 -0
  27. package/dist/dom-events.d.ts +23 -0
  28. package/dist/dom-events.js +21 -0
  29. package/dist/dom-events.js.map +1 -0
  30. package/dist/dom-props.cjs +154 -0
  31. package/dist/dom-props.cjs.map +1 -0
  32. package/dist/dom-props.d.cts +21 -0
  33. package/dist/dom-props.d.ts +21 -0
  34. package/dist/dom-props.js +128 -0
  35. package/dist/dom-props.js.map +1 -0
  36. package/dist/dynamic.cjs +68 -14
  37. package/dist/dynamic.cjs.map +1 -1
  38. package/dist/dynamic.js +73 -19
  39. package/dist/dynamic.js.map +1 -1
  40. package/dist/error-boundary.cjs +159 -84
  41. package/dist/error-boundary.cjs.map +1 -1
  42. package/dist/error-boundary.js +162 -87
  43. package/dist/error-boundary.js.map +1 -1
  44. package/dist/error.cjs +52 -20
  45. package/dist/error.cjs.map +1 -1
  46. package/dist/error.d.cts +8 -0
  47. package/dist/error.d.ts +8 -0
  48. package/dist/error.js +52 -20
  49. package/dist/error.js.map +1 -1
  50. package/dist/fragment.cjs.map +1 -1
  51. package/dist/fragment.js +1 -1
  52. package/dist/fragment.js.map +1 -1
  53. package/dist/hmr.cjs +137 -1
  54. package/dist/hmr.cjs.map +1 -1
  55. package/dist/hmr.js +135 -1
  56. package/dist/hmr.js.map +1 -1
  57. package/dist/index.cjs +713 -236
  58. package/dist/index.cjs.map +1 -1
  59. package/dist/index.d.cts +5 -2
  60. package/dist/index.d.ts +5 -2
  61. package/dist/index.js +715 -245
  62. package/dist/index.js.map +1 -1
  63. package/dist/ops.cjs +561 -107
  64. package/dist/ops.cjs.map +1 -1
  65. package/dist/ops.d.cts +49 -4
  66. package/dist/ops.d.ts +49 -4
  67. package/dist/ops.js +557 -108
  68. package/dist/ops.js.map +1 -1
  69. package/dist/profiler.cjs +14 -4
  70. package/dist/profiler.cjs.map +1 -1
  71. package/dist/profiler.js +17 -7
  72. package/dist/profiler.js.map +1 -1
  73. package/dist/ref.cjs +160 -5
  74. package/dist/ref.cjs.map +1 -1
  75. package/dist/ref.js +160 -5
  76. package/dist/ref.js.map +1 -1
  77. package/dist/renderer.cjs.map +1 -1
  78. package/dist/renderer.d.cts +2 -0
  79. package/dist/renderer.d.ts +2 -0
  80. package/dist/show.cjs +196 -0
  81. package/dist/show.cjs.map +1 -0
  82. package/dist/show.d.cts +54 -0
  83. package/dist/show.d.ts +54 -0
  84. package/dist/show.js +171 -0
  85. package/dist/show.js.map +1 -0
  86. package/dist/svg.cjs +102 -0
  87. package/dist/svg.cjs.map +1 -0
  88. package/dist/svg.d.cts +21 -0
  89. package/dist/svg.d.ts +21 -0
  90. package/dist/svg.js +76 -0
  91. package/dist/svg.js.map +1 -0
  92. package/package.json +20 -2
  93. package/src/bind.ts +30 -2
  94. package/src/boundaries.test.ts +54 -1
  95. package/src/boundary.ts +24 -8
  96. package/src/clear-remove.test.ts +85 -0
  97. package/src/client-only.test.ts +140 -0
  98. package/src/client-only.ts +65 -0
  99. package/src/component-empty-return.test.ts +123 -0
  100. package/src/debug.ts +12 -1
  101. package/src/dom-events.ts +32 -0
  102. package/src/dom-props-consistency.test.ts +149 -0
  103. package/src/dom-props.test.ts +70 -0
  104. package/src/dom-props.ts +107 -0
  105. package/src/dynamic.ts +91 -14
  106. package/src/error.test.ts +76 -1
  107. package/src/error.ts +87 -22
  108. package/src/event-cleanup-growth.test.ts +128 -0
  109. package/src/events.test.ts +16 -3
  110. package/src/hmr.ts +8 -2
  111. package/src/index.ts +13 -1
  112. package/src/invariants.test.ts +252 -0
  113. package/src/list-fast-path.test.ts +83 -0
  114. package/src/list-reactive-item.test.ts +77 -0
  115. package/src/ops.ts +419 -60
  116. package/src/props.test.ts +61 -1
  117. package/src/ref-cleanup.test.ts +144 -0
  118. package/src/ref.ts +57 -8
  119. package/src/remove-listener-identity.test.ts +97 -0
  120. package/src/renderer.ts +3 -1
  121. package/src/select-hidden-subscription.test.ts +104 -0
  122. package/src/show-classlist.test.ts +205 -0
  123. package/src/show.ts +107 -0
  124. package/src/spread-stable-shape.test.ts +109 -0
  125. package/src/spread.test.ts +86 -0
  126. package/src/svg.test.ts +28 -1
  127. package/src/svg.ts +34 -0
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/debug.ts","../src/fragment.ts","../src/ops.ts","../src/hmr.ts","../src/ref.ts","../src/bind.ts","../src/dynamic.ts","../src/template.ts","../src/error.ts","../src/boundary.ts","../src/error-boundary.ts","../src/async-boundary.ts","../src/profiler.ts"],"sourcesContent":["import type { Owner } from '@vobs/reactivity'\n\nexport type RuntimeDebugEnvironment = 'client' | 'server'\n\n/**\n * Lightweight context copied onto debug events created synchronously inside a\n * Router loader, Effect or SSR render. It is intentionally optional so the\n * runtime remains useful without DevTools.\n */\nexport interface RuntimeDebugContext {\n readonly environment?: RuntimeDebugEnvironment\n readonly sessionId?: string\n readonly route?: string\n readonly navigationId?: number\n readonly dataRequestId?: number\n readonly updateId?: string\n readonly effectId?: string\n readonly source?: string\n}\n\nexport interface RuntimeHydrationMismatch {\n readonly kind: 'missing-node' | 'extra-node' | 'position' | 'content'\n readonly expected: string\n readonly actual: string\n readonly path: string\n readonly message: string\n}\n\nexport type RuntimeDomMutationOperation = 'text' | 'property' | 'attribute' | 'insert' | 'remove'\n\nexport interface RuntimeDomMutation {\n readonly operation: RuntimeDomMutationOperation\n readonly target: string\n readonly parent?: string\n readonly key?: string\n readonly previousValue?: unknown\n readonly nextValue?: unknown\n}\n\nexport interface RuntimeErrorEvent {\n readonly error: unknown\n readonly owner: Owner\n readonly phase: 'event' | 'boundary'\n readonly handled: boolean\n readonly recovery: 'propagated' | 'handled' | 'fallback' | 'retrying' | 'recovered'\n}\n\nexport interface RuntimeDebugHooks {\n domMutation?(mutation: RuntimeDomMutation): void\n error?(event: RuntimeErrorEvent): void\n hydrationMismatch?(event: RuntimeHydrationMismatch): void\n}\n\nlet activeRuntimeDebugHooks: RuntimeDebugHooks | null = null\nlet activeRuntimeDebugContext: RuntimeDebugContext | null = null\n\nexport function setRuntimeDebugHooks(hooks: RuntimeDebugHooks | null): RuntimeDebugHooks | null {\n const previous = activeRuntimeDebugHooks\n activeRuntimeDebugHooks = hooks\n return previous\n}\n\nexport function getRuntimeDebugHooks(): RuntimeDebugHooks | null {\n return activeRuntimeDebugHooks\n}\n\nexport function getRuntimeDebugContext(): RuntimeDebugContext | null {\n return activeRuntimeDebugContext\n}\n\n/** Run a synchronous operation with trace context, preserving async renders. */\nexport function runWithRuntimeDebugContext<T>(context: RuntimeDebugContext, task: () => T): T {\n const previous = activeRuntimeDebugContext\n const next = { ...previous, ...context }\n activeRuntimeDebugContext = next\n let result: T\n try {\n result = task()\n } catch (error) {\n activeRuntimeDebugContext = previous\n throw error\n }\n if (isPromiseLike(result)) {\n return Promise.resolve(result).finally(() => {\n if (activeRuntimeDebugContext === next) activeRuntimeDebugContext = previous\n }) as T\n }\n activeRuntimeDebugContext = previous\n return result\n}\n\n/** Keep a context active across callback boundaries such as Effect execution. */\nexport function pushRuntimeDebugContext(context: RuntimeDebugContext): () => void {\n const previous = activeRuntimeDebugContext\n activeRuntimeDebugContext = { ...previous, ...context }\n let restored = false\n return () => {\n if (restored) return\n restored = true\n activeRuntimeDebugContext = previous\n }\n}\n\nexport function invokeRuntimeDebug<K extends keyof RuntimeDebugHooks>(\n name: K,\n ...args: Parameters<NonNullable<RuntimeDebugHooks[K]>>\n): void {\n const callback = activeRuntimeDebugHooks?.[name] as ((...values: unknown[]) => void) | undefined\n if (!callback) return\n try {\n callback(...args)\n } catch {\n // Debug tooling must never change runtime behavior.\n }\n}\n\nexport function readDebugValue(read: () => unknown): unknown {\n try {\n return read()\n } catch {\n return '[Uninspectable]'\n }\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return Boolean(value) && (typeof value === 'object' || typeof value === 'function')\n && typeof (value as { then?: unknown }).then === 'function'\n}\n\nexport function describeDebugNode(node: unknown): string {\n if (!node || typeof node !== 'object') return 'node'\n const value = node as {\n readonly nodeName?: unknown\n readonly tagName?: unknown\n readonly id?: unknown\n readonly className?: unknown\n }\n const name = typeof value.tagName === 'string'\n ? value.tagName.toLowerCase()\n : typeof value.nodeName === 'string' ? value.nodeName.toLowerCase() : 'node'\n const id = typeof value.id === 'string' && value.id ? `#${value.id}` : ''\n const className = typeof value.className === 'string' && value.className\n ? `.${value.className.trim().split(/\\s+/).filter(Boolean).join('.')}`\n : ''\n return `${name}${id}${className}`\n}\n","import { getCurrentOwner } from '@vobs/reactivity'\nimport { createComment, getRenderer } from './ops'\n\nexport interface VobsFragment {\n readonly kind: 'vobs-fragment'\n readonly start: Node\n readonly end: Node\n readonly mount: (parent: Node, anchor: Node | null) => void\n readonly unmount: (parent: Node) => void\n}\n\nexport type VobsNode = Node | VobsFragment\nexport type FragmentFactory = (parent: Node, anchor: Node) => void\n\nexport function createFragment(factory: FragmentFactory): VobsFragment {\n const start = createComment('vobs:fragment:start')\n const end = createComment('vobs:fragment:end')\n let parent: Node | null = null\n let initialized = false\n const owner = getCurrentOwner()\n\n const fragment: VobsFragment = {\n kind: 'vobs-fragment',\n start,\n end,\n mount(nextParent, anchor): void {\n if (parent && parent !== nextParent) {\n throw new Error('Vobs Fragment: 不能跨父节点移动 Fragment')\n }\n\n if (initialized) {\n moveRange(nextParent, start, end, anchor)\n return\n }\n\n const renderer = getRenderer()\n renderer.insertBefore(nextParent, start, anchor)\n renderer.insertBefore(nextParent, end, anchor)\n parent = nextParent\n initialized = true\n if (owner) owner.run(() => factory(nextParent, end))\n else factory(nextParent, end)\n },\n unmount(nextParent): void {\n if (!initialized || parent !== nextParent) {\n throw new Error('Vobs Fragment: Fragment 不属于指定父节点')\n }\n const renderer = getRenderer()\n let current = renderer.nextSibling(start)\n while (current && current !== end) {\n const next = renderer.nextSibling(current)\n renderer.removeChild(nextParent, current)\n current = next\n }\n renderer.removeChild(nextParent, start)\n renderer.removeChild(nextParent, end)\n parent = null\n initialized = false\n }\n }\n return fragment\n}\n\nexport function isVobsFragment(value: unknown): value is VobsFragment {\n return Boolean(value) && typeof value === 'object' && (value as VobsFragment).kind === 'vobs-fragment'\n}\n\nfunction moveRange(parent: Node, start: Node, end: Node, anchor: Node | null): void {\n const renderer = getRenderer()\n const nodes: Node[] = [start]\n let current = renderer.nextSibling(start)\n while (current) {\n nodes.push(current)\n if (current === end) break\n current = renderer.nextSibling(current)\n }\n if (nodes[nodes.length - 1] !== end) {\n throw new Error('Vobs Fragment: 找不到结束锚点')\n }\n for (const node of nodes) renderer.insertBefore(parent, node, anchor)\n}\n","// 编译产物调用的基础操作\n\nimport { createOwner, getCurrentOwner, setOwnerDebugName, untrack, type Owner } from '@vobs/reactivity'\nimport { isVobsFragment, type VobsNode } from './fragment'\nimport { describeDebugNode, getRuntimeDebugHooks, invokeRuntimeDebug, readDebugValue } from './debug'\nimport {\n associateHmrInstance,\n markHmrInstanceMounted,\n registerHmrInstance,\n type HmrInstance\n} from './hmr'\nimport type { VobsRenderer } from './renderer'\nimport { setRef } from './ref'\n\ntype RuntimeRenderer = VobsRenderer<Node, Text, Element, Comment>\n\nlet currentRenderer: RuntimeRenderer | null = null\nconst nodeOwners = new WeakMap<object, Owner>()\ninterface EventBinding {\n readonly handler: EventListener\n readonly owner: Owner | null\n readonly original: EventListener\n}\nconst eventBindings = new WeakMap<object, Map<string, EventBinding>>()\n\nexport function setRenderer<\n NodeType,\n TextNode extends NodeType,\n ElementNode extends NodeType,\n CommentNode extends NodeType\n>(renderer: VobsRenderer<NodeType, TextNode, ElementNode, CommentNode>): void {\n // 编译产物仍使用 DOM 节点声明;实际宿主类型由应用提供的渲染器决定。\n currentRenderer = renderer as unknown as RuntimeRenderer\n}\n\nexport function getRenderer(): RuntimeRenderer {\n if (!currentRenderer) {\n throw new Error('渲染器未初始化')\n }\n return currentRenderer\n}\n\nexport function createText(content: string): Text {\n return getRenderer().createText(content)\n}\n\n/** SVG 命名空间(与 HTML 解析器 foreign-content 规则一致) */\nexport const SVG_NAMESPACE = 'http://www.w3.org/2000/svg'\n\n/**\n * SVG 标签全集(= TypeScript SVGElementTagNameMap 的键,运行时分发依据)。\n * 与 React 的运行时清单同思路:只含纯 SVG 标签,刻意排除与 HTML 同名的\n * a/script/style/title(它们在 JSX 类型里归 HTMLElement,按 HTML 创建)。\n */\nconst SVG_TAGS = new Set([\n 'animate', 'animateMotion', 'animateTransform', 'circle', 'clipPath', 'defs', 'desc',\n 'ellipse', 'feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite',\n 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight',\n 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR',\n 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset',\n 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence',\n 'filter', 'foreignObject', 'g', 'image', 'line', 'linearGradient', 'marker', 'mask',\n 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient',\n 'rect', 'set', 'stop', 'svg', 'switch', 'symbol', 'text', 'textPath', 'tspan',\n 'use', 'view'\n])\n\nexport function createElement(tag: string): Element {\n // SVG 标签走命名空间创建:document.createElement('rect') 产物是 HTMLUnknownElement,\n // 整棵 SVG 子树都不会渲染(无报错)。渲染器未实现 createSvgElement 时按 createElement\n // 兜底(旧自定义渲染器保持原行为)。\n if (SVG_TAGS.has(tag)) {\n const renderer = getRenderer()\n if (renderer.createSvgElement) return renderer.createSvgElement(tag)\n }\n return getRenderer().createElement(tag)\n}\n\nexport function createComment(content: string): Comment {\n return getRenderer().createComment(content)\n}\n\nexport function insertBefore(\n parent: Node,\n child: VobsNode,\n anchor: VobsNode | null\n): void {\n if (isVobsFragment(child)) {\n child.mount(parent, isVobsFragment(anchor) ? anchor.start : anchor)\n markHmrInstanceMounted(child, parent)\n return\n }\n getRenderer().insertBefore(parent, child, isVobsFragment(anchor) ? anchor.start : anchor)\n markHmrInstanceMounted(child, parent)\n const nodeName = (child as Element).nodeName\n if (nodeName === 'OPTION' || nodeName === 'OPTGROUP') syncSelectValue(parent)\n if (getRuntimeDebugHooks()) {\n invokeRuntimeDebug('domMutation', {\n operation: 'insert',\n target: describeDebugNode(child),\n parent: describeDebugNode(parent)\n })\n }\n}\n\n/**\n * Select initial-value auto resync: `bindProperty(node, 'value', …)` registers the value\n * reader for `<select>` elements; whenever an `<option>` is inserted into the select\n * (directly or through an `<optgroup>`), the current bound value is re-applied. This\n * removes the last reason for apps to keep `ref + queueMicrotask` value-sync workarounds\n * for options that arrive after the value binding (e.g. asynchronously loaded lists).\n */\nconst selectValueReaders = new WeakMap<object, () => unknown>()\n\nexport function registerSelectValueBinding(select: Element, read: () => unknown): void {\n selectValueReaders.set(select, read)\n}\n\nfunction syncSelectValue(parent: Node): void {\n let current: Node | null = parent\n while (current !== null) {\n if ((current as Element).nodeName === 'SELECT') {\n const read = selectValueReaders.get(current)\n if (read !== undefined) setProperty(current as Element, 'value', read())\n return\n }\n current = current.parentNode\n }\n}\n\nexport function removeChild(\n parent: Node,\n child: VobsNode\n): void {\n disposeNodeOwner(child)\n if (isVobsFragment(child)) {\n child.unmount(parent)\n return\n }\n getRenderer().removeChild(parent, child)\n if (getRuntimeDebugHooks()) {\n invokeRuntimeDebug('domMutation', {\n operation: 'remove',\n target: describeDebugNode(child),\n parent: describeDebugNode(parent)\n })\n }\n}\n\nexport function setTextContent(\n node: Text,\n content: string\n): void {\n const previousValue = getRuntimeDebugHooks()\n ? readDebugValue(() => node.textContent)\n : undefined\n getRenderer().setTextContent(node, content)\n if (getRuntimeDebugHooks()) {\n invokeRuntimeDebug('domMutation', {\n operation: 'text',\n target: describeDebugNode(node),\n previousValue,\n nextValue: content\n })\n }\n}\n\nexport function setProperty(\n node: Element,\n key: string,\n value: unknown\n): void {\n const previousValue = getRuntimeDebugHooks()\n ? readDebugValue(() => Reflect.get(node, key))\n : undefined\n getRenderer().setProperty(node, key, value)\n if (key === 'value' && (node as { tagName?: unknown }).tagName === 'SELECT') {\n scheduleSelectValueSync(node, value)\n }\n if (getRuntimeDebugHooks()) {\n invokeRuntimeDebug('domMutation', {\n operation: 'property',\n target: describeDebugNode(node),\n key,\n previousValue,\n nextValue: value\n })\n }\n}\n\nconst pendingSelectValues = new WeakMap<Element, unknown>()\nconst selectSyncScheduled = new WeakSet<Element>()\n\n/**\n * `<select value>` 在 option 子节点存在前赋值不生效(HTML 规范:select 的 value\n * 由已存在的 option 决定)。编译产物先设置属性、后插入子节点,静态写法必然丢初始值\n * (消费方此前只能用 ref + queueMicrotask 规避)。\n * 这里对 select 的 value 赋值统一延迟到微任务重放一次:静态子节点在同一同步任务内\n * 插入完毕,重放即命中。动态(insertList/insertDynamic)插入的 option 晚于该微任务时,\n * 由 value 的绑定 effect 在后续信号更新中正常覆盖。\n */\nfunction scheduleSelectValueSync(node: Element, value: unknown): void {\n pendingSelectValues.set(node, value)\n if (selectSyncScheduled.has(node)) return\n selectSyncScheduled.add(node)\n queueMicrotask(() => {\n selectSyncScheduled.delete(node)\n if (!pendingSelectValues.has(node)) return\n const pending = pendingSelectValues.get(node)\n pendingSelectValues.delete(node)\n getRenderer().setProperty(node, 'value', pending)\n })\n}\n\nexport function setAttribute(\n node: Element,\n key: string,\n value: string\n): void {\n const previousValue = getRuntimeDebugHooks()\n ? readDebugValue(() => typeof node.getAttribute === 'function' ? node.getAttribute(key) : undefined)\n : undefined\n getRenderer().setAttribute(node, key, value)\n if (getRuntimeDebugHooks()) {\n invokeRuntimeDebug('domMutation', {\n operation: 'attribute',\n target: describeDebugNode(node),\n key,\n previousValue,\n nextValue: value\n })\n }\n}\n\nexport function spreadProps(node: Element, props: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(props)) {\n if (key === 'key' || value === null || value === undefined) continue\n if (key === 'ref') {\n setRef(node, value)\n continue\n }\n if (key.startsWith('on') && typeof value === 'function') addEventListener(node, key.slice(2).toLowerCase(), value as EventListener)\n // property 键的 false 有语义(如 disabled={false} 必须清除),不能跳过;\n // attribute 键的 false 表示“不设置”,与 HTML 语义一致。\n else if (isPropertyKey(key)) setProperty(node, key, value)\n else if (value === false) continue\n else setAttribute(node, domAttributeName(key), key === 'style' && isStyleObject(value) ? formatStyle(value) : String(value))\n }\n}\n\n/** Apply compile-time host properties in one renderer pass. */\nexport function setStaticProps(node: Element, props: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(props)) {\n if (key === 'key' || key === 'ref' || key.startsWith('on')) continue\n if (value === null || value === undefined) continue\n if (isPropertyKey(key)) setProperty(node, key, value)\n else if (value === false) continue\n else setAttribute(node, domAttributeName(key), key === 'style' && isStyleObject(value) ? formatStyle(value) : String(value))\n }\n}\n\nfunction isPropertyKey(key: string): boolean {\n return key === 'value' || key === 'checked' || key === 'selected' || key === 'disabled'\n || key === 'multiple' || key === 'readOnly' || key === 'required'\n || key === 'autofocus' || key === 'hidden' || key === 'tabIndex'\n || key === 'colSpan' || key === 'rowSpan'\n}\n\n/** camelCase JSX 属性名 → HTML attribute 名(与 compiler 的 domAttributeName 保持一致) */\nfunction domAttributeName(key: string): string {\n switch (key) {\n case 'className': return 'class'\n case 'htmlFor': return 'for'\n case 'autoComplete': return 'autocomplete'\n case 'spellCheck': return 'spellcheck'\n default: return key\n }\n}\n\nfunction isStyleObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction formatStyle(value: Record<string, unknown>): string {\n return Object.entries(value).filter(([, entry]) => entry !== null && entry !== undefined && entry !== false)\n .map(([key, entry]) => `${key.replace(/[A-Z]/gu, match => `-${match.toLowerCase()}`)}:${String(entry)}`).join(';')\n}\n\nexport function addEventListener(\n node: Element,\n event: string,\n handler: EventListener\n): void {\n const renderer = getRenderer()\n const owner = getCurrentOwner()\n let bindings = eventBindings.get(node)\n if (!bindings) {\n bindings = new Map()\n eventBindings.set(node, bindings)\n }\n const previous = bindings.get(event)\n if (previous && previous.original === handler && previous.owner === owner) return\n if (previous) renderer.removeEventListener(node, event, previous.handler)\n const listener = owner ? (reason: Event) => {\n // Owner 已销毁说明节点所属子树已被卸载/替换,事件来自游离 DOM,直接忽略。\n // 否则 owner.run 会抛\"已销毁的 Owner\",在事件流里制造无意义的错误噪音。\n if (owner.disposed) return\n try {\n owner.run(() => handler(reason))\n } catch (error) {\n const handled = owner.handleError(error)\n invokeRuntimeDebug('error', {\n error,\n owner,\n phase: 'event',\n handled,\n recovery: handled ? 'handled' : 'propagated'\n })\n if (!handled) throw error\n }\n } : handler\n const binding: EventBinding = { handler: listener, owner, original: handler }\n bindings.set(event, binding)\n renderer.addEventListener(node, event, listener)\n owner?.onDispose(() => {\n if (bindings?.get(event) !== binding) return\n bindings.delete(event)\n renderer.removeEventListener(node, event, listener)\n })\n}\n\nexport function removeEventListener(\n node: Element,\n event: string,\n handler: EventListener\n): void {\n const renderer = getRenderer()\n const binding = eventBindings.get(node)?.get(event)\n renderer.removeEventListener(node, event, binding?.handler ?? handler)\n eventBindings.get(node)?.delete(event)\n}\n\nexport function clear(container: Node): void {\n getRenderer().clear(container)\n}\n\ntype VobsComponent = (...args: any[]) => VobsNode\n\ntype ComponentProps<Component extends VobsComponent> = Component extends (\n props: infer Props\n) => VobsNode\n ? NonNullable<Props> extends object ? NonNullable<Props> : Record<string, never>\n : Record<string, never>\n\nexport function createComponent<Component extends VobsComponent>(\n component: Component,\n props: ComponentProps<Component>,\n source?: VobsSourceLocation\n): VobsNode {\n const owner = createOwner()\n const componentName = (component as typeof component & { displayName?: string }).displayName\n || component.name\n || 'anonymous'\n setOwnerDebugName(owner, source\n ? `${componentName} (${source.file}:${source.line}:${source.column})`\n : componentName)\n owner.onError(reason => {\n attachSourceLocation(reason, source)\n attachComponentContext(reason, componentName, owner.id)\n throw reason\n })\n // HMR 注册先于渲染作用域标记:注册清理必须跨热更新保活,不能被\n // disposeSince 当作上一轮渲染的清理释放掉。\n const hmrKey = (component as typeof component & { hmrKey?: string }).hmrKey\n let instance: HmrInstance | null = null\n if (hmrKey) {\n const separator = hmrKey.lastIndexOf(':')\n const moduleId = separator < 0 ? hmrKey : hmrKey.slice(0, separator)\n instance = { node: null as unknown as VobsNode, parent: null, refresh: () => refreshInstance() }\n const cleanup = registerHmrInstance(moduleId, instance)\n owner.onDispose(cleanup)\n }\n // 渲染作用域:组件 Owner 只承载 HMR 注册与错误处理,每轮渲染注册的 effect、\n // onDispose(含 portal 清理)与嵌套组件 Owner 都归属该轮作用域。HMR refresh\n // 重渲染前释放上一轮作用域,旧实例的 effect 不再订阅信号、portal 节点不再\n // 残留在 body 中每轮热更新叠加;组件 Owner 与 HMR 注册保活。\n const renderScope = owner.mark()\n let node: VobsNode\n try {\n // 组件渲染必须 untrack:组件是 run-once 的,其渲染发生在某次 effect 求值\n // (insertDynamic/insertBoundary 的渲染工厂、路由挂载)内时,若不切断追踪,\n // 组件体内读取的信号会被收集为祖先 effect 的依赖——一次无关编辑就会触发\n // 整棵子树销毁重建(输入框被换掉、焦点丢失、事件监听随旧树一起被清理)。\n // 结构性响应只属于条件工厂与绑定 effect,组件本体渲染一次即止。\n node = owner.run(() => untrack(() => component(props)))\n } catch (error) {\n owner.dispose()\n attachSourceLocation(error, source)\n attachComponentContext(error, componentName, owner.id)\n throw error\n }\n associateNodeOwner(node, owner)\n if (instance) {\n instance.node = node\n associateHmrInstance(node, instance)\n }\n function refreshInstance(): void {\n // 组件已随旧渲染树一起卸载(如父级在同一次热更新中先完成刷新),\n // 无法也无需再刷新。\n if (owner.disposed) return\n const previous = instance!.node\n owner.disposeSince(renderScope)\n const next = owner.run(() => untrack(() => component(props)))\n const parent = instance!.parent\n if (parent) {\n // 先插入新树再卸载旧树:替换锚点始终取自仍在文档中的旧树,\n // fragment 与普通节点两种形态任意组合都能正确定位插入点。\n const anchor = isVobsFragment(previous) ? previous.start : previous\n if (isVobsFragment(next)) next.mount(parent, anchor)\n else getRenderer().insertBefore(parent, next, anchor)\n if (isVobsFragment(previous)) previous.unmount(parent)\n else getRenderer().removeChild(parent, previous)\n }\n nodeOwners.delete(previous as object)\n nodeOwners.set(next as object, owner)\n associateHmrInstance(next, instance!)\n instance!.node = next\n }\n return node\n}\n\nexport interface VobsSourceLocation {\n readonly file: string\n readonly line: number\n readonly column: number\n}\n\nexport interface VobsLocatedError extends Error {\n readonly vobsSource?: VobsSourceLocation\n readonly vobsComponent?: string\n readonly vobsOwnerId?: string\n}\n\nfunction attachSourceLocation(reason: unknown, source: VobsSourceLocation | undefined): void {\n if (!source || (!reason || (typeof reason !== 'object' && typeof reason !== 'function'))) return\n const error = reason as VobsLocatedError\n if (error.vobsSource) return\n try {\n Object.defineProperty(error, 'vobsSource', {\n configurable: true,\n enumerable: false,\n value: source,\n writable: false\n })\n } catch {\n // Frozen third-party errors still propagate with their original details.\n }\n}\n\nfunction attachComponentContext(reason: unknown, component: string, ownerId: string): void {\n if (!reason || (typeof reason !== 'object' && typeof reason !== 'function')) return\n const error = reason as VobsLocatedError\n try {\n if (!error.vobsComponent) Object.defineProperty(error, 'vobsComponent', { configurable: true, enumerable: false, value: component, writable: false })\n if (!error.vobsOwnerId) Object.defineProperty(error, 'vobsOwnerId', { configurable: true, enumerable: false, value: ownerId, writable: false })\n } catch {\n // Frozen third-party errors still propagate with their original details.\n }\n}\n\nexport function createBlock(factory: () => VobsNode | null | undefined | false): VobsNode | null {\n const owner = createOwner()\n setOwnerDebugName(owner, 'dynamic')\n let node: VobsNode | null | undefined | false\n try {\n node = owner.run(factory)\n } catch (error) {\n owner.dispose()\n throw error\n }\n if (!node) {\n owner.dispose()\n return null\n }\n associateNodeOwner(node, owner)\n return node\n}\n\nexport function associateNodeOwner(node: VobsNode, owner: Owner): void {\n nodeOwners.set(node, owner)\n}\n\nexport function disposeNodeOwner(node: VobsNode): void {\n const owner = nodeOwners.get(node)\n if (!owner) return\n nodeOwners.delete(node)\n owner.dispose()\n}\n","import type { VobsNode } from './fragment'\n\nexport type HmrComponent<Props extends object = Record<string, unknown>> =\n (props: Props) => VobsNode\n\nexport interface HmrStateStore {\n get<T>(key: string, initial: T | (() => T)): T\n set<T>(key: string, value: T): void\n has(key: string): boolean\n delete(key: string): void\n clear(): void\n}\n\nexport interface HmrInstance {\n node: VobsNode\n parent: Node | null\n refresh(): void\n}\n\ninterface HmrModuleState {\n readonly components: Map<string, HmrComponent>\n readonly state: Map<string, unknown>\n readonly instances: Set<HmrInstance>\n}\n\ninterface HmrGlobal {\n modules: Map<string, HmrModuleState>\n /** 编译器生成的 hmrStateRef 注册表:键为 `${moduleId}#${声明名}`,值跨模块重执行保活。 */\n states: Map<string, unknown>\n}\n\nconst globalTarget = globalThis as typeof globalThis & { __VOBS_HMR__?: HmrGlobal }\nconst hmrGlobal = globalTarget.__VOBS_HMR__ ?? { modules: new Map<string, HmrModuleState>(), states: new Map<string, unknown>() }\nglobalTarget.__VOBS_HMR__ = hmrGlobal\n\nexport function resolveComponent<Props extends object>(\n component: HmrComponent<Props>,\n moduleId: string,\n exportName: string\n): HmrComponent<Props> {\n const module = getModule(moduleId)\n const existing = module.components.get(exportName)\n if (existing) return existing as HmrComponent<Props>\n\n const proxy = ((props: Props) => {\n const current = (proxy as HmrComponent<Props> & { current: HmrComponent<Props> }).current\n return current(props)\n }) as HmrComponent<Props> & { current: HmrComponent<Props> }\n proxy.current = component\n Object.defineProperties(proxy, {\n displayName: { configurable: true, value: component.name || exportName },\n hmrKey: { configurable: false, value: `${moduleId}:${exportName}` }\n })\n module.components.set(exportName, proxy as HmrComponent)\n return proxy\n}\n\nexport function updateHmrModule(moduleId: string, nextModule: Record<string, unknown>): void {\n const module = hmrGlobal.modules.get(moduleId)\n if (!module) return\n let changed = false\n for (const [name, proxy] of module.components) {\n const next = nextModule[name]\n if (typeof next !== 'function') continue\n const hmrProxy = proxy as HmrComponent & { current: HmrComponent; displayName?: string }\n hmrProxy.current = next as HmrComponent\n Object.defineProperty(hmrProxy, 'displayName', { configurable: true, value: next.name || name })\n changed = true\n }\n if (!changed) return\n // 快照后正序遍历:实例在自身渲染开始前注册,祖先必然先于后代入列——\n // 祖先先刷新会 dispose 上一轮渲染作用域,其树内旧后代实例的 refresh\n // 命中已销毁守卫被跳过,避免同一组件在一次热更新中重渲染两次。\n // 同时 refresh 重渲染以新代码创建的全新实例不在快照中,天然不会再刷新。\n const instances = [...module.instances]\n for (const instance of instances) {\n try {\n instance.refresh()\n } catch {\n // HMR failures remain application errors on the next normal render.\n }\n }\n}\n\nexport function disposeHmrModule(_moduleId: string): void {\n // State and component proxies intentionally survive module disposal.\n}\n\nexport function createHmrStateStore(moduleId: string): HmrStateStore {\n const state = getModule(moduleId).state\n return {\n get<T>(key: string, initial: T | (() => T)): T {\n if (!state.has(key)) state.set(key, typeof initial === 'function' ? (initial as () => T)() : initial)\n return state.get(key) as T\n },\n set<T>(key: string, value: T): void {\n state.set(key, value)\n },\n has: key => state.has(key),\n delete: key => { state.delete(key) },\n clear: () => { state.clear() }\n }\n}\n\n/**\n * 编译器为模块顶层 state() 声明生成的取值入口。键为 `${moduleId}#${声明名}`,\n * 与手动 store 键空间隔离。模块热更新重执行时复用既有信号实例:旧导入方持有的\n * 实例与新模块实例共享同一份状态,消除\"两份模块、两份状态\"导致的编辑不生效/页面半边失灵。\n */\nexport function hmrStateRef<T>(key: string, create: () => T): T {\n const states = hmrGlobal.states\n if (states.has(key)) return states.get(key) as T\n const value = create()\n states.set(key, value)\n return value\n}\n\nexport function registerHmrInstance(moduleId: string, instance: HmrInstance): () => void {\n const instances = getModule(moduleId).instances\n instances.add(instance)\n return () => instances.delete(instance)\n}\n\nexport function markHmrInstanceMounted(node: VobsNode, parent: Node): void {\n const instance = hmrInstances.get(node as object)\n if (instance) instance.parent = parent\n}\n\nfunction getModule(moduleId: string): HmrModuleState {\n let module = hmrGlobal.modules.get(moduleId)\n if (!module) {\n module = { components: new Map(), state: new Map(), instances: new Set() }\n hmrGlobal.modules.set(moduleId, module)\n }\n return module\n}\n\nconst hmrInstances = new WeakMap<object, HmrInstance>()\n\nexport function associateHmrInstance(node: VobsNode, instance: HmrInstance): void {\n hmrInstances.set(node as object, instance)\n}\n","import { getCurrentOwner } from '@vobs/reactivity'\n\n/** A mutable reference populated when a host node is mounted. */\nexport interface Ref<T extends object = Node> {\n current: T | null\n}\n\nexport type RefTarget<T extends object = Node> = Ref<T> | ((value: T | null) => void)\n\nexport function ref<T extends object = Node>(initialValue: T | null = null): Ref<T> {\n return { current: initialValue }\n}\n\n/** Bind a host node to an object or callback ref and clear it with its Owner. */\nexport function setRef<T extends object>(node: T, target: unknown): void {\n if (!isRefTarget<T>(target)) return\n // SSR's serializable nodes are never exposed as live refs. Custom renderers\n // may use arbitrary host objects, so only exclude the known SSR shape.\n if (isSSRNode(node)) return\n const owner = getCurrentOwner()\n assignRef(target, node)\n owner?.onDispose(() => {\n // Do not clear a ref that has since been reassigned to another node.\n if (isObjectRef(target) && target.current !== node) return\n assignRef(target, null)\n })\n}\n\nfunction isSSRNode(value: object): boolean {\n const type = (value as { type?: unknown }).type\n return (type === 'element' || type === 'text' || type === 'comment')\n && !('nodeType' in value)\n}\n\nfunction isObjectRef<T extends object>(value: unknown): value is Ref<T> {\n return Boolean(value && typeof value === 'object' && 'current' in value)\n}\n\nfunction isRefTarget<T extends object>(value: unknown): value is RefTarget<T> {\n return isObjectRef<T>(value) || typeof value === 'function'\n}\n\nfunction assignRef<T extends object>(target: RefTarget<T>, value: T | null): void {\n try {\n if (typeof target === 'function') target(value)\n else target.current = value\n } catch {\n // Ref callbacks are user code; never make mounting fail because of them.\n }\n}\n","// 动态绑定:将 Signal 绑定到 DOM 节点\n\nimport { effect } from '@vobs/reactivity'\nimport type { Signal } from '@vobs/reactivity'\nimport { registerSelectValueBinding, setAttribute, setProperty, setTextContent } from './ops'\n\nexport type ValueSource<T> = Signal<T> | (() => T)\n\nfunction readSource<T>(source: ValueSource<T>): T {\n return typeof source === 'function' ? source() : source.value\n}\n\nexport function bindText(\n node: Text,\n source: ValueSource<unknown>\n): void {\n effect(() => {\n const value = readSource(source)\n setTextContent(node, value === null || value === undefined || typeof value === 'boolean' ? '' : String(value))\n })\n}\n\nexport function bindAttribute(\n node: Element,\n key: string,\n source: ValueSource<unknown>\n): void {\n effect(() => {\n const value = readSource(source)\n setAttribute(node, key, key === 'style' && value && typeof value === 'object' && !Array.isArray(value)\n ? Object.entries(value as Record<string, unknown>)\n .filter(([, entry]) => entry !== null && entry !== undefined && entry !== false)\n .map(([name, entry]) => `${name.replace(/[A-Z]/gu, match => `-${match.toLowerCase()}`)}:${String(entry)}`)\n .join(';')\n : String(value))\n })\n}\n\nexport function bindProperty(\n node: Element,\n key: string,\n source: ValueSource<unknown>\n): void {\n // Select initial-value auto resync: remember the bound reader so that inserting\n // <option> children later re-applies the current value (see ops.insertBefore).\n if (key === 'value' && node.nodeName === 'SELECT') {\n registerSelectValueBinding(node, () => readSource(source))\n }\n effect(() => {\n setProperty(node, key, readSource(source))\n })\n}\n","import { createOwner, effect, state, type Owner, type Signal } from '@vobs/reactivity'\nimport {\n associateNodeOwner,\n createBlock,\n createComment,\n createText,\n insertBefore,\n removeChild,\n setTextContent\n} from './ops'\nimport { createFragment, isVobsFragment, type VobsNode } from './fragment'\n\nexport type NodeFactory = () => VobsNode | null | undefined | false\nexport type DynamicChild = VobsNode | string | number | boolean | null | undefined | readonly DynamicChild[]\n\ninterface ListEntry<T> {\n key: unknown\n node: VobsNode\n owner: Owner\n viewOwner: Owner\n item: Signal<T>\n /** 最近一次赋值的原始 item:供比较与刷新使用,避免在列表 effect 内读取 item 信号造成自依赖。 */\n value: T\n index: number\n}\n\nexport function insertDynamic(parent: Node, anchor: Node | null, factory: NodeFactory): void {\n const marker = createComment('vobs:dynamic')\n insertBefore(parent, marker, anchor)\n let current: VobsNode | null = null\n\n effect(() => {\n const next = createBlock(factory)\n if (next === current) return\n\n if (current) removeChild(parent, current)\n current = next\n if (current) insertBefore(parent, current, marker)\n })\n}\n\n/**\n * Inserts any Vobs child value. This is the escape hatch for JSX expressions\n * that return a node, an array of nodes, text, or an empty conditional value.\n *\n * 多态插入(Solid 式):编译器把所有非静态子表达式统一路由到这里,值类型在运行时\n * 分发——原始值走自管理文本节点的原地更新快路径(等价 bindText 性能),节点/Fragment/\n * 数组走 scope 隔离的挂载/卸载路径。函数调用返回节点因此与返回字符串同样安全。\n */\nexport function insertDynamicValue(\n parent: Node,\n anchor: Node | null,\n factory: () => DynamicChild\n): void {\n const marker = createComment('vobs:value')\n insertBefore(parent, marker, anchor)\n let current: VobsNode | null = null\n /** current 是否为本 effect 自建的文本节点(可安全原地改写内容) */\n let currentIsText = false\n let scope: Owner | null = null\n\n effect(() => {\n // 每轮求值使用独立 scope Owner:factory 求值与挂载期间创建的组件 Owner 全部挂在它下面。\n // 数组/节点被替换时整体 dispose 旧 scope,避免被丢弃子树的 effect 继续订阅信号(幽灵更新与内存泄漏)。\n const nextScope = createOwner()\n const value = nextScope.run(factory)\n // ── 原始值快路径:自建文本节点原地改写,不销毁重建(高频文本零 GC)──\n if (typeof value === 'string' || typeof value === 'number') {\n if (currentIsText) {\n setTextContent(current as Text, String(value))\n nextScope.dispose()\n return\n }\n if (current) removeChild(parent, current)\n scope?.dispose()\n scope = null\n const text = createText(String(value))\n insertBefore(parent, text, marker)\n current = text\n currentIsText = true\n nextScope.dispose()\n return\n }\n if (value === null || value === undefined || typeof value === 'boolean') {\n if (current) removeChild(parent, current)\n scope?.dispose()\n scope = null\n current = null\n currentIsText = false\n nextScope.dispose()\n return\n }\n // ── 节点/Fragment/数组路径:scope 隔离的挂载与整体替换 ──\n const next = nextScope.run(() => normalizeDynamicChild(value))\n if (next === current) {\n nextScope.dispose()\n return\n }\n if (current) removeChild(parent, current)\n scope?.dispose()\n scope = nextScope\n current = next\n currentIsText = false\n if (current) insertBefore(parent, current, marker)\n })\n}\n\n/** Convert a JSX child value to a host node without creating a wrapper element. */\nexport function normalizeDynamicChild(value: DynamicChild): VobsNode | null {\n if (value === null || value === undefined || typeof value === 'boolean') return null\n if (typeof value === 'string' || typeof value === 'number') return createText(String(value))\n if (isVobsFragment(value) || isHostNode(value)) return value as VobsNode\n if (Array.isArray(value)) {\n const children = value\n if (children.length === 0) return null\n return createFragment((parent, anchor) => {\n for (const child of children) {\n const node = normalizeDynamicChild(child)\n if (node) insertBefore(parent, node, anchor)\n }\n })\n }\n return null\n}\n\nfunction isHostNode(value: unknown): value is Node {\n return Boolean(value && typeof value === 'object'\n && ('nodeType' in value || ((value as { type?: unknown }).type === 'element'\n || (value as { type?: unknown }).type === 'text'\n || (value as { type?: unknown }).type === 'comment')))\n}\n\nexport function insertList<T>(\n parent: Node,\n anchor: Node | null,\n source: () => readonly T[],\n renderItem: (item: T, index: number) => VobsNode,\n keyOf?: (item: T, index: number) => unknown\n): void {\n const marker = createComment('vobs:list')\n insertBefore(parent, marker, anchor)\n let entries: Array<ListEntry<T>> = []\n const tracksIndex = renderItem.length >= 2\n\n effect(() => {\n const items = source()\n\n // key 只计算一次:keyed 判定与调和共用,避免 keyOf 每轮被调用两遍。\n let keys: unknown[] | null = null\n if (keyOf) {\n keys = new Array(items.length)\n let allKeyed = items.length > 0\n for (let index = 0; index < items.length; index++) {\n const key = keyOf(items[index], index)\n if (key == null) {\n allKeyed = false\n break\n }\n keys[index] = key\n }\n if (!allKeyed) keys = null\n }\n\n const nextEntries = keys\n ? reconcileKeyed(items, keys, entries, renderItem)\n : reconcileIndexed(items, entries, renderItem)\n\n // tracksIndex 时 index 参与渲染,位置变化的行必须整体重建,新节点不在 DOM 中,\n // 重排阶段强制插入;否则只同步记录的位置,节点保持原样交给重排阶段移动。\n const refreshed = tracksIndex ? new Set<ListEntry<T>>() : null\n for (let index = 0; index < nextEntries.length; index++) {\n const entry = nextEntries[index]\n if (tracksIndex) {\n if (entry.index !== index) {\n refreshListEntry(parent, entry, index, renderItem)\n refreshed!.add(entry)\n }\n } else {\n entry.index = index\n }\n }\n\n const retained = new Set(nextEntries)\n for (const entry of entries) {\n if (!retained.has(entry)) disposeEntry(parent, entry)\n }\n\n reorderListEntries(parent, marker, entries, nextEntries, refreshed)\n entries = nextEntries\n })\n}\n\n/**\n * 按 nextEntries 顺序整理 DOM,但只移动必须移动的节点。\n */\nfunction reorderListEntries<T>(\n parent: Node,\n marker: Node,\n previous: readonly ListEntry<T>[],\n nextEntries: readonly ListEntry<T>[],\n forceInsert: Set<ListEntry<T>> | null\n): void {\n const count = nextEntries.length\n if (count === 0) return\n\n // 首次挂载(旧列表为空):全部是新节点,倒序直插即可,跳过 Map/LIS 构建。\n if (previous.length === 0) {\n let reference: VobsNode = marker\n for (let index = count - 1; index >= 0; index--) {\n const node = nextEntries[index].node\n insertBefore(parent, node, reference)\n reference = node\n }\n return\n }\n\n const oldIndexOf = new Map<ListEntry<T>, number>()\n for (let index = 0; index < previous.length; index++) oldIndexOf.set(previous[index], index)\n\n // seq[i] = 条目在旧序中的位置;新条目、重建条目与强制插入条目为 -1。\n const seq: number[] = new Array(count)\n for (let index = 0; index < count; index++) {\n const entry = nextEntries[index]\n seq[index] = forceInsert?.has(entry) ? -1 : oldIndexOf.get(entry) ?? -1\n }\n\n const keep = computeKeptByLis(seq)\n\n let reference: VobsNode = marker\n for (let index = count - 1; index >= 0; index--) {\n const node = nextEntries[index].node\n if (keep[index]) {\n reference = node\n continue\n }\n insertBefore(parent, node, reference)\n reference = node\n }\n}\n\n/**\n * 严格递增子序列(LIS)成员标记,O(n log n)。\n * 负值(新节点)不参与 LIS,永远视为需要移动。\n */\nfunction computeKeptByLis(seq: readonly number[]): boolean[] {\n const count = seq.length\n const keep = new Array<boolean>(count).fill(false)\n const tailsIndex: number[] = []\n const tailsValue: number[] = []\n const prev = new Array<number>(count).fill(-1)\n\n for (let i = 0; i < count; i++) {\n const value = seq[i]\n if (value < 0) continue\n let lo = 0\n let hi = tailsValue.length\n while (lo < hi) {\n const mid = (lo + hi) >> 1\n if (tailsValue[mid] < value) lo = mid + 1\n else hi = mid\n }\n if (lo === tailsValue.length) {\n tailsValue.push(value)\n tailsIndex.push(i)\n } else {\n tailsValue[lo] = value\n tailsIndex[lo] = i\n }\n prev[i] = lo > 0 ? tailsIndex[lo - 1] : -1\n }\n\n let cursor = tailsIndex.length > 0 ? tailsIndex[tailsIndex.length - 1] : -1\n while (cursor >= 0) {\n keep[cursor] = true\n cursor = prev[cursor]\n }\n return keep\n}\n\nfunction reconcileKeyed<T>(\n items: readonly T[],\n keys: readonly unknown[],\n entries: Array<ListEntry<T>>,\n renderItem: (item: T, index: number) => VobsNode\n): Array<ListEntry<T>> {\n const previous = new Map(entries.map(entry => [entry.key, entry]))\n const seen = new Set<unknown>()\n const nextEntries: Array<ListEntry<T>> = []\n\n for (let index = 0; index < items.length; index++) {\n const item = items[index]\n const key = keys[index]\n if (seen.has(key)) {\n console.warn(`Vobs: 检测到重复的列表 key: ${String(key)}`)\n }\n seen.add(key)\n const entry = previous.get(key)\n if (entry) {\n previous.delete(key)\n if (isPrimitiveItem(item) && !Object.is(entry.value, item)) {\n // 原始类型项在编译产物中被静态捕获,无法通过 item 信号刷新视图:值变化时必须重建行。\n nextEntries.push(createListEntry(item, index, key, renderItem))\n continue\n }\n entry.item.value = item\n entry.value = item\n nextEntries.push(entry)\n continue\n }\n nextEntries.push(createListEntry(item, index, key, renderItem))\n }\n\n return nextEntries\n}\n\nfunction reconcileIndexed<T>(\n items: readonly T[],\n entries: Array<ListEntry<T>>,\n renderItem: (item: T, index: number) => VobsNode\n): Array<ListEntry<T>> {\n const nextEntries: Array<ListEntry<T>> = []\n for (let index = 0; index < items.length; index++) {\n const item = items[index]\n const entry = entries[index]\n if (entry && isPrimitiveItem(item) && !Object.is(entry.value, item)) {\n // 原始类型项被编译产物静态捕获,值变化时必须重建行;旧行由主循环统一 dispose。\n nextEntries.push(createListEntry(item, index, index, renderItem))\n continue\n }\n if (entry) {\n entry.item.value = item\n entry.value = item\n nextEntries.push(entry)\n continue\n }\n nextEntries.push(createListEntry(item, index, index, renderItem))\n }\n return nextEntries\n}\n\n/** 原始类型(含 function)无法被 Proxy 响应化,只能整行重建。 */\nfunction isPrimitiveItem(item: unknown): boolean {\n return item === null || typeof item !== 'object'\n}\n\nfunction createListEntry<T>(\n item: T,\n index: number,\n key: unknown,\n renderItem: (item: T, index: number) => VobsNode\n): ListEntry<T> {\n const owner = createOwner()\n let itemSignal!: Signal<T>\n let viewOwner!: Owner\n let node!: VobsNode\n owner.run(() => {\n itemSignal = state(item)\n viewOwner = createOwner()\n node = viewOwner.run(() => renderItem(toReactiveItem(itemSignal, item), index))\n })\n associateNodeOwner(node, viewOwner)\n return { key, node, owner, viewOwner, item: itemSignal, value: item, index }\n}\n\nfunction refreshListEntry<T>(\n parent: Node,\n entry: ListEntry<T>,\n index: number,\n renderItem: (item: T, index: number) => VobsNode\n): void {\n removeChild(parent, entry.node)\n entry.index = index\n const previousView = entry.viewOwner\n entry.owner.run(() => {\n entry.viewOwner = createOwner()\n entry.node = entry.viewOwner.run(() => renderItem(\n toReactiveItem(entry.item, entry.value),\n index\n ))\n })\n // 旧视图的 effect 仍订阅着 item 信号,必须 dispose,否则会写已脱离的 DOM(幽灵更新)。\n previousView.dispose()\n associateNodeOwner(entry.node, entry.viewOwner)\n}\n\nfunction toReactiveItem<T>(item: Signal<T>, initialValue: T): T {\n if (typeof initialValue !== 'object' || initialValue === null) {\n return initialValue\n }\n\n // 代理目标使用创建时的原始对象:避免在列表 effect 内读取 item 信号造成自依赖;\n // 属性读取始终转发到 item.value,在行内绑定 effect 中被正常追踪。\n return new Proxy(initialValue as object, {\n get(_target, property, receiver) {\n return Reflect.get(item.value as object, property, receiver)\n },\n has(_target, property) {\n return property in (item.value as object)\n },\n ownKeys() {\n return Reflect.ownKeys(item.value as object)\n },\n getOwnPropertyDescriptor(_target, property) {\n return Object.getOwnPropertyDescriptor(item.value as object, property)\n }\n }) as T\n}\n\nfunction disposeEntry(parent: Node, entry: ListEntry<unknown>): void {\n removeChild(parent, entry.node)\n entry.owner.dispose()\n}\n","// 编译器静态模板提升的运行时支撑:\n// 编译期把完全静态的 JSX 子树序列化为 HTML 字符串,模块加载时解析一次,\n// 运行时通过 cloneNode 复制,替代逐个 createElement + setStaticProps + insertBefore。\n// 仅适用于 DOM 渲染器(模板本质是 HTML),自定义渲染器场景由编译产物不使用该优化兜底。\n\nconst templateCache = new Map<string, HTMLTemplateElement>()\n\n/** Parse a static template once; called at module load for each hoisted template. */\nexport function createTemplate(html: string): HTMLTemplateElement {\n let template = templateCache.get(html)\n if (!template) {\n template = document.createElement('template')\n template.innerHTML = html\n templateCache.set(html, template)\n }\n return template\n}\n\n/** Clone a hoisted template for one mount; the compiled HTML always has a single root element. */\nexport function cloneTemplate(template: HTMLTemplateElement): Node {\n const root = template.content.firstElementChild\n if (!root) throw new Error('Vobs: 静态模板缺少根元素,请检查编译产物')\n return root.cloneNode(true)\n}\n","/** Shared error protocol used by the runtime, compiler and DevTools. */\nexport type VobsErrorSeverity = 'error' | 'warning' | 'info'\nexport type VobsErrorLayer =\n | 'compiler'\n | 'runtime'\n | 'constraint'\n | 'permission'\n | 'ssr'\n | 'http'\n | 'resource'\n\nexport interface VobsErrorLocation {\n readonly file: string\n readonly line: number\n readonly column: number\n}\n\nexport interface VobsErrorOptions {\n readonly code: string\n readonly message: string\n readonly severity?: VobsErrorSeverity\n readonly layer?: VobsErrorLayer\n readonly cause?: unknown\n readonly fix?: string\n readonly location?: VobsErrorLocation\n readonly trace?: readonly string[]\n readonly example?: string\n readonly docs?: string\n readonly codeFrame?: string\n}\n\nexport interface VobsErrorDefaults {\n readonly code?: string\n readonly severity?: VobsErrorSeverity\n readonly layer?: VobsErrorLayer\n readonly fix?: string\n}\n\n/** A framework error with stable machine-readable metadata. */\nexport class VobsError extends Error {\n readonly code: string\n readonly severity: VobsErrorSeverity\n readonly layer: VobsErrorLayer\n readonly cause?: unknown\n readonly fix?: string\n readonly location?: VobsErrorLocation\n readonly trace?: readonly string[]\n readonly example?: string\n readonly docs?: string\n readonly codeFrame?: string\n\n constructor(options: VobsErrorOptions) {\n super(options.message)\n this.name = 'VobsError'\n this.code = options.code\n this.severity = options.severity ?? 'error'\n this.layer = options.layer ?? 'runtime'\n this.cause = options.cause\n this.fix = options.fix\n this.location = options.location\n this.trace = options.trace\n this.example = options.example\n this.docs = options.docs\n this.codeFrame = options.codeFrame\n }\n}\n\nexport function createVobsError(options: VobsErrorOptions): VobsError {\n return new VobsError(options)\n}\n\nexport function isVobsError(value: unknown): value is VobsError {\n return value instanceof VobsError\n || Boolean(value && typeof value === 'object'\n && typeof (value as { code?: unknown }).code === 'string'\n && typeof (value as { message?: unknown }).message === 'string'\n && typeof (value as { layer?: unknown }).layer === 'string')\n}\n\n/** Convert thrown strings and third-party errors without losing their message. */\nexport function normalizeVobsError(value: unknown, defaults: VobsErrorDefaults = {}): VobsError {\n if (value instanceof VobsError) return value\n if (value instanceof Error) {\n // Preserve the original Error identity so boundaries and DevTools can\n // correlate event/effect phases without creating duplicate diagnostics.\n const metadata = value as Error & {\n readonly vobsCode?: unknown\n readonly vobsHint?: unknown\n readonly vobsSource?: unknown\n }\n const code = defaults.code ?? (typeof metadata.vobsCode === 'string' ? metadata.vobsCode : undefined)\n if (code) defineErrorMetadata(value, 'code', code)\n defineErrorMetadata(value, 'severity', defaults.severity ?? 'error')\n defineErrorMetadata(value, 'layer', defaults.layer ?? 'runtime')\n const fix = defaults.fix ?? (typeof metadata.vobsHint === 'string' ? metadata.vobsHint : undefined)\n if (fix) defineErrorMetadata(value, 'fix', fix)\n const source = metadata.vobsSource\n if (source && typeof source === 'object'\n && typeof (source as { file?: unknown }).file === 'string'\n && typeof (source as { line?: unknown }).line === 'number'\n && typeof (source as { column?: unknown }).column === 'number') {\n defineErrorMetadata(value, 'location', source)\n }\n return value as VobsError\n }\n if (isVobsError(value)) {\n const candidate = value as VobsErrorOptions & { severity?: VobsErrorSeverity; layer?: VobsErrorLayer }\n return new VobsError({\n code: candidate.code,\n message: candidate.message,\n severity: candidate.severity ?? defaults.severity,\n layer: candidate.layer ?? defaults.layer,\n cause: candidate.cause,\n fix: candidate.fix ?? defaults.fix,\n location: candidate.location,\n trace: candidate.trace,\n example: candidate.example,\n docs: candidate.docs,\n codeFrame: candidate.codeFrame\n })\n }\n const message = String(value)\n return new VobsError({\n code: defaults.code ?? 'VOBS_UNKNOWN',\n message,\n severity: defaults.severity ?? 'error',\n layer: defaults.layer ?? 'runtime',\n cause: undefined,\n fix: defaults.fix\n })\n}\n\nfunction defineErrorMetadata(target: Error, key: string, value: unknown): void {\n if (key in target) return\n try {\n Object.defineProperty(target, key, { configurable: true, enumerable: false, value, writable: true })\n } catch {\n // Frozen third-party errors still retain their original message and stack.\n }\n}\n\nexport interface FormatVobsErrorOptions {\n readonly environment?: 'development' | 'production'\n readonly includeStack?: boolean\n}\n\n/** Format a concise, actionable message for terminals and dev overlays. */\nexport function formatVobsError(\n value: unknown,\n options: FormatVobsErrorOptions = {}\n): string {\n const error = normalizeVobsError(value)\n const code = error.code || 'VOBS_UNKNOWN'\n const severity = error.severity || 'error'\n if (options.environment === 'production') return `[Vobs ${code}] ${error.message}`\n\n const lines = [`[Vobs ${capitalize(severity)}] ${error.message}`, `Code: ${code}`]\n if (error.location) lines.push(`Location: ${error.location.file}:${error.location.line}:${error.location.column}`)\n if (error.codeFrame) lines.push('', error.codeFrame)\n if (error.cause !== undefined) lines.push(`Cause: ${formatCause(error.cause)}`)\n if (error.trace?.length) lines.push('', `Trace: ${error.trace.join(' → ')}`)\n if (error.fix) lines.push('', `Fix: ${error.fix}`)\n if (error.example) lines.push('', `Example:\\n${error.example}`)\n if (error.docs) lines.push(`Docs: ${error.docs}`)\n if (options.includeStack && error.stack) lines.push('', error.stack)\n return lines.join('\\n')\n}\n\nfunction formatCause(value: unknown): string {\n return value instanceof Error ? `${value.name}: ${value.message}` : String(value)\n}\n\nfunction capitalize(value: string): string {\n return value.slice(0, 1).toUpperCase() + value.slice(1)\n}\n","import { createOwner, state } from '@vobs/reactivity'\nimport { invokeRuntimeDebug } from './debug'\nimport { insertDynamic, type NodeFactory } from './dynamic'\nimport { normalizeVobsError } from './error'\n\nexport type BoundaryRetry = () => void | Promise<unknown>\nexport type BoundaryFallback = (error: Error, retry: BoundaryRetry) => ReturnType<NodeFactory>\n\nexport interface BoundaryOptions {\n children: NodeFactory\n fallback: BoundaryFallback\n onRetry?: () => void | Promise<unknown>\n resetKey?: () => unknown\n}\n\n/**\n * Shared no-wrapper boundary protocol. The boundary owns its reactive error\n * state and child branch, so replacing the branch also disposes its Owner.\n */\nexport function insertBoundary(\n parent: Node,\n anchor: Node | null,\n options: BoundaryOptions\n): void {\n const boundary = createOwner()\n boundary.run(() => {\n const error = state<Error | null>(null)\n let fallbackActive = false\n let lastError: Error | null = null\n let initialized = false\n let previousKey: unknown\n\n boundary.onError(reason => {\n if (fallbackActive) throw reason\n const normalized = normalizeVobsError(reason, {\n code: 'VOBS_R001',\n layer: 'runtime',\n fix: '检查组件渲染逻辑,或在边界 fallback 中提供恢复操作。'\n })\n lastError = normalized\n invokeRuntimeDebug('error', {\n error: normalized,\n owner: boundary,\n phase: 'boundary',\n handled: true,\n recovery: 'fallback'\n })\n error.value = normalized\n })\n\n const retry = (): void | Promise<unknown> => {\n if (error.value) {\n invokeRuntimeDebug('error', {\n error: error.value,\n owner: boundary,\n phase: 'boundary',\n handled: true,\n recovery: 'retrying'\n })\n }\n error.value = null\n return options.onRetry?.()\n }\n\n insertDynamic(parent, anchor, () => {\n const nextKey = options.resetKey?.()\n if (!initialized || !Object.is(previousKey, nextKey)) {\n initialized = true\n previousKey = nextKey\n if (error.value) error.value = null\n }\n\n const currentError = error.value\n if (!currentError) {\n if (fallbackActive && lastError) {\n invokeRuntimeDebug('error', {\n error: lastError,\n owner: boundary,\n phase: 'boundary',\n handled: true,\n recovery: 'recovered'\n })\n lastError = null\n }\n fallbackActive = false\n return options.children()\n }\n\n fallbackActive = true\n return options.fallback(currentError, retry)\n })\n })\n}\n","import { createFragment, type VobsNode } from './fragment'\nimport { insertBoundary, type BoundaryRetry } from './boundary'\nimport type { NodeFactory } from './dynamic'\n\nexport type ErrorBoundaryFallback = (\n error: Error,\n retry: BoundaryRetry\n) => ReturnType<NodeFactory>\n\n/**\n * 子节点双形态:JSX 属性经编译器编译为惰性 getter(工厂),手写对象字面量可直接传节点。\n */\nexport type ErrorBoundaryChildren = NodeFactory | VobsNode\n\nexport interface ErrorBoundaryOptions {\n children: ErrorBoundaryChildren\n fallback: ErrorBoundaryFallback\n}\n\nexport interface ErrorBoundaryProps {\n children: ErrorBoundaryChildren\n fallback: ErrorBoundaryFallback\n}\n\n/** Normalize child sources to the lazy factory shape insertBoundary expects. */\nfunction resolveBoundaryChildren(children: ErrorBoundaryChildren): NodeFactory {\n return typeof children === 'function' ? children : () => children\n}\n\n/**\n * Inserts an error boundary without adding a wrapper node. It captures errors\n * from its child render branch and child-owned effects, then renders fallback.\n */\nexport function insertErrorBoundary(\n parent: Node,\n anchor: Node | null,\n options: ErrorBoundaryOptions\n): void {\n insertBoundary(parent, anchor, { ...options, children: resolveBoundaryChildren(options.children) })\n}\n\n/** Component-shaped API backed by the same no-wrapper host instruction. */\nexport function ErrorBoundary(props: ErrorBoundaryProps): VobsNode {\n return createFragment((parent, anchor) => insertErrorBoundary(parent, anchor, props))\n}\n","import { createOwner, state } from '@vobs/reactivity'\nimport { insertDynamic, type NodeFactory } from './dynamic'\nimport { createFragment, type VobsNode } from './fragment'\n\nexport type AsyncBoundaryView = ReturnType<NodeFactory> | NodeFactory\nexport type AsyncBoundaryFallback = (error: Error, retry: () => void) => ReturnType<NodeFactory>\nexport interface AsyncBoundaryOptions<T> {\n promise: PromiseLike<T> | (() => PromiseLike<T>)\n children: (value: T) => ReturnType<NodeFactory>\n loading?: AsyncBoundaryView\n fallback?: AsyncBoundaryFallback\n resetKey?: () => unknown\n}\nexport interface AsyncBoundaryProps<T> extends AsyncBoundaryOptions<T> {}\n\nexport function insertAsyncBoundary<T>(parent: Node, anchor: Node | null, options: AsyncBoundaryOptions<T>): void {\n const boundary = createOwner()\n boundary.run(() => {\n const loading = state(true)\n const data = state<T | undefined>(undefined)\n const resolved = state(false)\n const error = state<Error | null>(null)\n let token = 0\n let previousKey: unknown\n let initialized = false\n let fallbackActive = false\n boundary.onError(reason => {\n if (fallbackActive) throw reason\n error.value = normalizeError(reason)\n loading.value = false\n })\n\n const start = (): void => {\n const current = ++token\n loading.value = true\n error.value = null\n data.value = undefined\n resolved.value = false\n let promise: PromiseLike<T>\n try {\n promise = typeof options.promise === 'function' ? options.promise() : options.promise\n } catch (reason) {\n if (current === token) {\n loading.value = false\n error.value = normalizeError(reason)\n }\n return\n }\n Promise.resolve(promise).then(value => {\n if (current !== token || boundary.disposed) return\n data.value = value\n resolved.value = true\n loading.value = false\n }, reason => {\n if (current !== token || boundary.disposed) return\n error.value = normalizeError(reason)\n loading.value = false\n })\n }\n\n const retry = (): void => start()\n start()\n insertDynamic(parent, anchor, () => {\n const key = options.resetKey?.()\n if (!initialized) {\n initialized = true\n previousKey = key\n } else if (!Object.is(previousKey, key)) {\n previousKey = key\n start()\n }\n if (loading.value) {\n fallbackActive = false\n return resolveView(options.loading)\n }\n if (error.value) {\n fallbackActive = true\n return options.fallback?.(error.value, retry) ?? null\n }\n fallbackActive = false\n return resolved.value ? options.children(data.value as T) : resolveView(options.loading)\n })\n })\n}\n\nexport function AsyncBoundary<T>(props: AsyncBoundaryProps<T>): VobsNode {\n return createFragment((parent, anchor) => insertAsyncBoundary(parent, anchor, props))\n}\n\nfunction resolveView(view: AsyncBoundaryView | undefined): ReturnType<NodeFactory> {\n if (!view) return null\n return typeof view === 'function' ? view() : view\n}\n\nfunction normalizeError(reason: unknown): Error {\n return reason instanceof Error ? reason : new Error(String(reason))\n}\n","import { createFragment } from './fragment'\nimport { insertDynamic, type NodeFactory } from './dynamic'\nimport type { VobsNode } from './fragment'\nimport { createOwner } from '@vobs/reactivity'\n\nexport interface ProfilerRenderInfo {\n readonly id: string\n readonly phase: 'mount' | 'update'\n readonly duration: number\n readonly timestamp: number\n}\nexport interface ProfilerOptions {\n id: string\n children: NodeFactory\n onRender?: (info: ProfilerRenderInfo) => void\n}\nexport interface ProfilerProps extends ProfilerOptions {}\n\nexport function insertProfiler(parent: Node, anchor: Node | null, options: ProfilerOptions): void {\n const profiler = createOwner()\n let mounted = false\n profiler.run(() => {\n insertDynamic(parent, anchor, () => {\n const started = now()\n const value = options.children()\n const info: ProfilerRenderInfo = {\n id: options.id,\n phase: mounted ? 'update' : 'mount',\n duration: Math.max(0, now() - started),\n timestamp: Date.now()\n }\n mounted = true\n try { options.onRender?.(info) } catch { /* profiler callbacks are isolated */ }\n return value\n })\n })\n}\n\nexport function Profiler(props: ProfilerProps): VobsNode {\n return createFragment((parent, anchor) => insertProfiler(parent, anchor, props))\n}\n\nfunction now(): number {\n return typeof performance !== 'undefined' && typeof performance.now === 'function' ? performance.now() : Date.now()\n}\n"],"mappings":"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","names":["getCurrentOwner","getCurrentOwner","state","getCurrentOwner","getCurrentOwner","createOwner","effect","effect","createOwner","reference","createOwner","state","createOwner","state","createOwner","state","createOwner","state","createOwner","createOwner"]}
1
+ {"version":3,"sources":["../src/debug.ts","../src/fragment.ts","../src/ops.ts","../src/dom-props.ts","../src/dom-events.ts","../src/svg.ts","../src/error.ts","../src/hmr.ts","../src/ref.ts","../src/bind.ts","../src/dynamic.ts","../src/template.ts","../src/boundary.ts","../src/error-boundary.ts","../src/async-boundary.ts","../src/profiler.ts","../src/show.ts","../src/client-only.ts"],"sourcesContent":["import type { Owner } from '@vobs/reactivity'\n\nexport type RuntimeDebugEnvironment = 'client' | 'server'\n\n/**\n * Lightweight context copied onto debug events created synchronously inside a\n * Router loader, Effect or SSR render. It is intentionally optional so the\n * runtime remains useful without DevTools.\n */\nexport interface RuntimeDebugContext {\n readonly environment?: RuntimeDebugEnvironment\n readonly sessionId?: string\n readonly route?: string\n readonly navigationId?: number\n readonly dataRequestId?: number\n readonly updateId?: string\n readonly effectId?: string\n readonly source?: string\n}\n\nexport interface RuntimeHydrationMismatch {\n readonly kind: 'missing-node' | 'extra-node' | 'position' | 'content'\n readonly expected: string\n readonly actual: string\n readonly path: string\n readonly message: string\n}\n\nexport type RuntimeDomMutationOperation = 'text' | 'property' | 'attribute' | 'insert' | 'remove' | 'clear'\n\nexport interface RuntimeDomMutation {\n readonly operation: RuntimeDomMutationOperation\n readonly target: string\n readonly parent?: string\n readonly key?: string\n readonly previousValue?: unknown\n readonly nextValue?: unknown\n}\n\nexport interface RuntimeErrorEvent {\n readonly error: unknown\n readonly owner: Owner\n readonly phase: 'event' | 'boundary'\n readonly handled: boolean\n readonly recovery: 'propagated' | 'handled' | 'fallback' | 'retrying' | 'recovered'\n}\n\nexport interface RuntimeDebugHooks {\n domMutation?(mutation: RuntimeDomMutation): void\n error?(event: RuntimeErrorEvent): void\n hydrationMismatch?(event: RuntimeHydrationMismatch): void\n /**\n * 水合时**临时认领**了一个内容不为空的文本节点(服务端渲染了真实文本,客户端此刻要的是空文本:\n * 只能先认领、等绑定 effect 覆写)。这一步过去完全无声 —— 服务端 \"Ada\" 遇上客户端忘传 state\n * (会渲染 \"loading\")时就静默变成了后者。给出可观测出口,便于工具发现这类\"值被悄悄换掉\"。\n */\n hydrationProvisionalText?(event: RuntimeProvisionalText): void\n}\n\nexport interface RuntimeProvisionalText {\n readonly expected: string\n readonly actual: string\n}\n\nlet activeRuntimeDebugHooks: RuntimeDebugHooks | null = null\nlet activeRuntimeDebugContext: RuntimeDebugContext | null = null\n\nexport function setRuntimeDebugHooks(hooks: RuntimeDebugHooks | null): RuntimeDebugHooks | null {\n const previous = activeRuntimeDebugHooks\n activeRuntimeDebugHooks = hooks\n return previous\n}\n\nexport function getRuntimeDebugHooks(): RuntimeDebugHooks | null {\n return activeRuntimeDebugHooks\n}\n\nexport function getRuntimeDebugContext(): RuntimeDebugContext | null {\n return activeRuntimeDebugContext\n}\n\n/** Run a synchronous operation with trace context, preserving async renders. */\nexport function runWithRuntimeDebugContext<T>(context: RuntimeDebugContext, task: () => T): T {\n const previous = activeRuntimeDebugContext\n const next = { ...previous, ...context }\n activeRuntimeDebugContext = next\n let result: T\n try {\n result = task()\n } catch (error) {\n activeRuntimeDebugContext = previous\n throw error\n }\n if (isPromiseLike(result)) {\n return Promise.resolve(result).finally(() => {\n if (activeRuntimeDebugContext === next) activeRuntimeDebugContext = previous\n }) as T\n }\n activeRuntimeDebugContext = previous\n return result\n}\n\n/** Keep a context active across callback boundaries such as Effect execution. */\nexport function pushRuntimeDebugContext(context: RuntimeDebugContext): () => void {\n const previous = activeRuntimeDebugContext\n activeRuntimeDebugContext = { ...previous, ...context }\n let restored = false\n return () => {\n if (restored) return\n restored = true\n activeRuntimeDebugContext = previous\n }\n}\n\nexport function invokeRuntimeDebug<K extends keyof RuntimeDebugHooks>(\n name: K,\n ...args: Parameters<NonNullable<RuntimeDebugHooks[K]>>\n): void {\n const callback = activeRuntimeDebugHooks?.[name] as ((...values: unknown[]) => void) | undefined\n if (!callback) return\n try {\n callback(...args)\n } catch {\n // Debug tooling must never change runtime behavior.\n }\n}\n\nexport function readDebugValue(read: () => unknown): unknown {\n try {\n return read()\n } catch {\n return '[Uninspectable]'\n }\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return Boolean(value) && (typeof value === 'object' || typeof value === 'function')\n && typeof (value as { then?: unknown }).then === 'function'\n}\n\nexport function describeDebugNode(node: unknown): string {\n if (!node || typeof node !== 'object') return 'node'\n const value = node as {\n readonly nodeName?: unknown\n readonly tagName?: unknown\n readonly id?: unknown\n readonly className?: unknown\n }\n const name = typeof value.tagName === 'string'\n ? value.tagName.toLowerCase()\n : typeof value.nodeName === 'string' ? value.nodeName.toLowerCase() : 'node'\n const id = typeof value.id === 'string' && value.id ? `#${value.id}` : ''\n const className = typeof value.className === 'string' && value.className\n ? `.${value.className.trim().split(/\\s+/).filter(Boolean).join('.')}`\n : ''\n return `${name}${id}${className}`\n}\n","import { getCurrentOwner } from '@vobs/reactivity'\nimport { createComment, getRenderer } from './ops'\n\nexport interface VobsFragment {\n readonly kind: 'vobs-fragment'\n readonly start: Node\n readonly end: Node\n readonly mount: (parent: Node, anchor: Node | null) => void\n readonly unmount: (parent: Node) => void\n}\n\nexport type VobsNode = Node | VobsFragment\nexport type FragmentFactory = (parent: Node, anchor: Node) => void\n\nexport function createFragment(factory: FragmentFactory): VobsFragment {\n const start = createComment('vobs:fragment:start')\n const end = createComment('vobs:fragment:end')\n let parent: Node | null = null\n let initialized = false\n const owner = getCurrentOwner()\n\n const fragment: VobsFragment = {\n kind: 'vobs-fragment',\n start,\n end,\n mount(nextParent, anchor): void {\n if (parent && parent !== nextParent) {\n throw new Error('Vobs Fragment: 不能跨父节点移动 Fragment')\n }\n\n if (initialized) {\n moveRange(nextParent, start, end, anchor)\n return\n }\n\n const renderer = getRenderer()\n renderer.insertBefore(nextParent, start, anchor)\n renderer.insertBefore(nextParent, end, anchor)\n parent = nextParent\n initialized = true\n if (owner) owner.run(() => factory(nextParent, end))\n else factory(nextParent, end)\n },\n unmount(nextParent): void {\n if (!initialized || parent !== nextParent) {\n throw new Error('Vobs Fragment: Fragment 不属于指定父节点')\n }\n const renderer = getRenderer()\n let current = renderer.nextSibling(start)\n while (current && current !== end) {\n const next = renderer.nextSibling(current)\n renderer.removeChild(nextParent, current)\n current = next\n }\n renderer.removeChild(nextParent, start)\n renderer.removeChild(nextParent, end)\n parent = null\n initialized = false\n }\n }\n return fragment\n}\n\nexport function isVobsFragment(value: unknown): value is VobsFragment {\n return Boolean(value) && typeof value === 'object' && (value as VobsFragment).kind === 'vobs-fragment'\n}\n\nfunction moveRange(parent: Node, start: Node, end: Node, anchor: Node | null): void {\n const renderer = getRenderer()\n const nodes: Node[] = [start]\n let current = renderer.nextSibling(start)\n while (current) {\n nodes.push(current)\n if (current === end) break\n current = renderer.nextSibling(current)\n }\n if (nodes[nodes.length - 1] !== end) {\n throw new Error('Vobs Fragment: 找不到结束锚点')\n }\n for (const node of nodes) renderer.insertBefore(parent, node, anchor)\n}\n","// 编译产物调用的基础操作\n\nimport { createOwner, effect, getCurrentOwner, setOwnerDebugName, untrack, type Owner } from '@vobs/reactivity'\nimport { isVobsFragment, type VobsNode } from './fragment'\nimport { domAttributeName, isPropertyName } from './dom-props'\nimport { resolveEventName } from './dom-events'\nimport { isSvgTag } from './svg'\nimport { formatVobsError } from './error'\nimport { describeDebugNode, getRuntimeDebugHooks, invokeRuntimeDebug, readDebugValue } from './debug'\nimport {\n associateHmrInstance,\n markHmrInstanceMounted,\n registerHmrInstance,\n type HmrInstance\n} from './hmr'\nimport type { VobsRenderer } from './renderer'\nimport { setRef } from './ref'\n\ntype RuntimeRenderer = VobsRenderer<Node, Text, Element, Comment>\n\nlet currentRenderer: RuntimeRenderer | null = null\nconst nodeOwners = new WeakMap<object, Owner>()\ninterface EventBinding {\n readonly handler: EventListener\n readonly owner: Owner | null\n readonly original: EventListener\n}\nconst eventBindings = new WeakMap<object, Map<string, EventBinding>>()\n\n/*\n * 事件清理槽。目的:让**每个 (Owner, node, event) 只在 `Owner.cleanups` 里占一个槽**,\n * 重绑 handler 时只换槽里的间接引用,数组不增长(理由见 addEventListener)。\n *\n * 用 WeakMap<Owner, Map<key, handle>> 而不是往 Owner 上挂属性:\n * Owner 是 class 实例,挂新属性会把它推进字典模式(reactivity/src/owner.ts:30-50 记过这笔账)。\n * key 由 per-node 数字 id 与事件名拼成,避免每次重绑比较长字符串前缀。\n */\nconst eventCleanupSlots = new WeakMap<Owner, Map<string, EventBinding>>()\nconst eventCleanupNodeIds = new WeakMap<object, number>()\nlet nextEventCleanupNodeId = 0\n\nfunction eventCleanupKey(node: object, event: string): string {\n let id = eventCleanupNodeIds.get(node)\n if (id === undefined) {\n id = ++nextEventCleanupNodeId\n eventCleanupNodeIds.set(node, id)\n }\n return `${id}:${event}`\n}\n\nexport function setRenderer<\n NodeType,\n TextNode extends NodeType,\n ElementNode extends NodeType,\n CommentNode extends NodeType\n>(\n renderer: VobsRenderer<NodeType, TextNode, ElementNode, CommentNode> | undefined\n): VobsRenderer<NodeType, TextNode, ElementNode, CommentNode> | undefined {\n // 返回**上一份**渲染器(没有则是 undefined),调用方据此成对\"安装 / 还原\"。\n // 全局单例原来只装不还:一次 renderToString 之后就永久停在 SSR 渲染器上(见 vobs/src/app.ts)。\n const previous = currentRenderer as unknown as\n VobsRenderer<NodeType, TextNode, ElementNode, CommentNode> | undefined\n // 编译产物仍使用 DOM 节点声明;实际宿主类型由应用提供的渲染器决定。\n currentRenderer = (renderer as unknown as RuntimeRenderer) ?? null\n return previous\n}\n\nexport function getRenderer(): RuntimeRenderer {\n if (!currentRenderer) {\n throw new Error('渲染器未初始化')\n }\n return currentRenderer\n}\n\nexport function createText(content: string): Text {\n return getRenderer().createText(content)\n}\n\n/** SVG 命名空间与标签清单见 ./svg —— 编译期判定提升用的是同一份依据。 */\nexport { SVG_NAMESPACE } from './svg'\n\nexport function createElement(tag: string): Element {\n // SVG 标签走命名空间创建:document.createElement('rect') 产物是 HTMLUnknownElement,\n // 整棵 SVG 子树都不会渲染(无报错)。渲染器未实现 createSvgElement 时按 createElement\n // 兜底(旧自定义渲染器保持原行为)。\n if (isSvgTag(tag)) {\n const renderer = getRenderer()\n if (renderer.createSvgElement) return renderer.createSvgElement(tag)\n }\n return getRenderer().createElement(tag)\n}\n\n/**\n * 在 SVG 命名空间里建元素,**不看标签名**。\n *\n * 给编译器用在 `<svg>` 祖先下那些与 HTML 同名的标签(a / title / style / script)——\n * 它们不在 SVG_TAGS 里,`createElement` 会按 HTML 建。只按名字判定命名空间是行不通的:\n * `<svg><a href=\"…\">` 会变成 HTML 锚点,而且不报错。\n *\n * 渲染器没实现 createSvgElement 时按 createElement 兜底(自定义渲染器保持原行为)。\n */\nexport function createSvgElement(tag: string): Element {\n const renderer = getRenderer()\n if (renderer.createSvgElement) return renderer.createSvgElement(tag)\n return renderer.createElement(tag)\n}\n\nexport function createComment(content: string): Comment {\n return getRenderer().createComment(content)\n}\n\nexport function insertBefore(\n parent: Node,\n child: VobsNode,\n anchor: VobsNode | null\n): void {\n if (isVobsFragment(child)) {\n child.mount(parent, isVobsFragment(anchor) ? anchor.start : anchor)\n markHmrInstanceMounted(child, parent)\n return\n }\n getRenderer().insertBefore(parent, child, isVobsFragment(anchor) ? anchor.start : anchor)\n markHmrInstanceMounted(child, parent)\n const nodeName = (child as Element).nodeName\n if (nodeName === 'OPTION' || nodeName === 'OPTGROUP') syncSelectValue(parent)\n if (getRuntimeDebugHooks()) {\n invokeRuntimeDebug('domMutation', {\n operation: 'insert',\n target: describeDebugNode(child),\n parent: describeDebugNode(parent)\n })\n }\n}\n\n/**\n * Select initial-value auto resync: `bindProperty(node, 'value', …)` registers the value\n * reader for `<select>` elements; whenever an `<option>` is inserted into the select\n * (directly or through an `<optgroup>`), the current bound value is re-applied. This\n * removes the last reason for apps to keep `ref + queueMicrotask` value-sync workarounds\n * for options that arrive after the value binding (e.g. asynchronously loaded lists).\n */\nconst selectValueReaders = new WeakMap<object, () => unknown>()\n\nexport function registerSelectValueBinding(select: Element, read: () => unknown): void {\n selectValueReaders.set(select, read)\n}\n\nfunction syncSelectValue(parent: Node): void {\n let current: Node | null = parent\n while (current !== null) {\n if ((current as Element).nodeName === 'SELECT') {\n const read = selectValueReaders.get(current)\n /*\n * 读取必须 `untrack` —— 这里是在**插入 option 的过程中同步**重放当前值,\n * 而插入往往发生在某个 effect 运行时(`insertList` / `insertDynamic` 都由 effect 驱动)。\n * 若那次读取被算进外层 effect 的依赖,该 effect 以后会被这个信号唤醒:\n * 一个**隐藏订阅** —— 依赖关系图上多一条没人打算建立的边,\n * 表现为\"插入选项时恰好重跑了某个不相关的 effect\",很难追。\n *\n * 这条绑定的订阅由 `bindProperty` 自己的 effect 负责(bind.ts),\n * 这里的重放只是把值**再写一次**,不需要也不应该建立依赖。\n */\n if (read !== undefined) setProperty(current as Element, 'value', untrack(read))\n return\n }\n current = current.parentNode\n }\n}\n\nexport function removeChild(\n parent: Node,\n child: VobsNode\n): void {\n /*\n * **先摘 DOM,再释放 Owner。**\n *\n * 原来是反过来的:`disposeNodeOwner(child)` 抛错(用户 cleanup 里抛)就永远走不到\n * 摘除那一步 —— DOM 里留着旧节点、它的 effect 却已经没了,屏幕上出现两棵树且没有提示。\n * 顺序反过来之后,即使清理抛错,DOM 也已一致;错误照旧抛给调用方。\n */\n if (isVobsFragment(child)) {\n child.unmount(parent)\n disposeNodeOwner(child)\n return\n }\n getRenderer().removeChild(parent, child)\n if (getRuntimeDebugHooks()) {\n invokeRuntimeDebug('domMutation', {\n operation: 'remove',\n target: describeDebugNode(child),\n parent: describeDebugNode(parent)\n })\n }\n disposeNodeOwner(child)\n}\n\nexport function setTextContent(\n node: Text,\n content: string\n): void {\n const previousValue = getRuntimeDebugHooks()\n ? readDebugValue(() => node.textContent)\n : undefined\n getRenderer().setTextContent(node, content)\n if (getRuntimeDebugHooks()) {\n invokeRuntimeDebug('domMutation', {\n operation: 'text',\n target: describeDebugNode(node),\n previousValue,\n nextValue: content\n })\n }\n}\n\nexport function setProperty(\n node: Element,\n key: string,\n value: unknown\n): void {\n const previousValue = getRuntimeDebugHooks()\n ? readDebugValue(() => Reflect.get(node, key))\n : undefined\n getRenderer().setProperty(node, PROPERTY_IDL_NAMES[key] ?? key, value)\n if (key === 'value' && (node as { tagName?: unknown }).tagName === 'SELECT') {\n scheduleSelectValueSync(node, value)\n }\n if (getRuntimeDebugHooks()) {\n invokeRuntimeDebug('domMutation', {\n operation: 'property',\n target: describeDebugNode(node),\n key,\n previousValue,\n nextValue: value\n })\n }\n}\n\nconst pendingSelectValues = new WeakMap<Element, unknown>()\nconst selectSyncScheduled = new WeakSet<Element>()\n\n/**\n * `<select value>` 在 option 子节点存在前赋值不生效(HTML 规范:select 的 value\n * 由已存在的 option 决定)。编译产物先设置属性、后插入子节点,静态写法必然丢初始值\n * (消费方此前只能用 ref + queueMicrotask 规避)。\n * 这里对 select 的 value 赋值统一延迟到微任务重放一次:静态子节点在同一同步任务内\n * 插入完毕,重放即命中。动态(insertList/insertDynamic)插入的 option 晚于该微任务时,\n * 由 value 的绑定 effect 在后续信号更新中正常覆盖。\n */\nfunction scheduleSelectValueSync(node: Element, value: unknown): void {\n pendingSelectValues.set(node, value)\n if (selectSyncScheduled.has(node)) return\n selectSyncScheduled.add(node)\n /*\n * 在这一刻就把渲染器抓下来,**不要**在微任务里再 getRenderer():\n * 1) 应用销毁会把全局渲染器还原(没装过就是\"没有\"),那时微任务里的 getRenderer() 会抛\n * \"渲染器未初始化\" —— 抛在微任务里没人接,直接变成进程级 unhandled error(实测\n * `packages/ui/src/bind.test.ts` 就因为这条让 vitest 报 1 个 unhandled error,退出码非 0);\n * 2) 语义上也更对:节点是哪个渲染器造的,就用哪个渲染器写回(期间全局可能已经换人)。\n */\n const renderer = getRenderer()\n queueMicrotask(() => {\n selectSyncScheduled.delete(node)\n if (!pendingSelectValues.has(node)) return\n const pending = pendingSelectValues.get(node)\n pendingSelectValues.delete(node)\n renderer.setProperty(node, 'value', pending)\n })\n}\n\nexport function setAttribute(\n node: Element,\n key: string,\n value: string\n): void {\n const previousValue = getRuntimeDebugHooks()\n ? readDebugValue(() => typeof node.getAttribute === 'function' ? node.getAttribute(key) : undefined)\n : undefined\n getRenderer().setAttribute(node, key, value)\n if (getRuntimeDebugHooks()) {\n invokeRuntimeDebug('domMutation', {\n operation: 'attribute',\n target: describeDebugNode(node),\n key,\n previousValue,\n nextValue: value\n })\n }\n}\n\nexport function spreadProps(node: Element, props: Record<string, unknown>): void {\n applySpreadProps(node, null, props)\n}\n\n/** 删除一个 attribute。渲染器没实现时退回空串(属性仍在,但内容清空)—— 老自定义渲染器的降级行为。 */\nexport function removeAttribute(node: Element, key: string): void {\n const renderer = getRenderer()\n if (renderer.removeAttribute) {\n renderer.removeAttribute(node, key)\n return\n }\n renderer.setAttribute(node, key, '')\n}\n\n/** 布尔型 property 的「清除」值是 false,其余是空串(与 React 的移除语义一致)。 */\nconst BOOLEAN_PROPERTIES = new Set([\n 'checked', 'selected', 'disabled', 'multiple', 'readOnly', 'required',\n 'hidden', 'open', 'indeterminate', 'defaultChecked', 'muted', 'autoFocus'\n])\n\n/**\n * JSX 属性名 → **IDL 属性名**(`el[name] = value` 里的那个 name)。\n *\n * 多数名字两边相同,但少数不同;写错名字的后果是**静默的**:\n * `Reflect.set(el, 'autoFocus', …)` 只是给元素挂了一个不反射的 expando,\n * 既不产生 `autofocus` 属性、也不改变 IDL 属性 —— 于是 `autoFocus={false}` 毫无作用。\n * 实测(jsdom,与真实 DOM 同语义):\n * IDL 名 `autofocus`(全小写)→ has=true/idl=true,写 false 则 has=false/idl=false ← 反射正确\n * JSX 名 `autoFocus`(驼峰) → 只挂 expando,属性与 IDL 都不变\n * 这也解释了为什么 `disabled` / `checked` / `readOnly` / `tabIndex` 一直是对的:\n * 它们的 IDL 名恰好与 JSX 名相同。\n */\nconst PROPERTY_IDL_NAMES: Readonly<Record<string, string>> = {\n autoFocus: 'autofocus'\n}\n\n/**\n * 把一份 props 应用(或**增量**应用到)节点上。\n *\n * `previous` 为 null 表示首次应用(`spreadProps` 的老路径);否则只处理真正变化的键,\n * 并**移除**新对象里已经消失的键 —— 这正是原来缺的那一半:`{...props}` 只在创建时应用一次,\n * 之后对象里删掉的键会永远留在 DOM 上,而且改了的值也不会生效。\n */\nfunction applySpreadProps(\n node: Element,\n previous: Record<string, unknown> | null,\n next: Record<string, unknown>\n): void {\n for (const [key, value] of Object.entries(next)) {\n if (key === 'key') continue\n if (previous !== null && Object.is(previous[key], value)) continue\n\n if (key.startsWith('on')) {\n // 事件:先摘旧监听(值变了、或新值不再是函数),再挂新的。\n // 事件名必须过别名表:`onDoubleClick` 的真实事件名是 `dblclick`,\n // 直接小写会得到不存在的 `\"doubleclick\"`(回调永不触发且静默)。\n const eventName = resolveEventName(key) ?? key.slice(2).toLowerCase()\n const previousHandler = previous?.[key]\n if (typeof previousHandler === 'function') {\n removeEventListener(node, eventName, previousHandler as EventListener)\n }\n if (typeof value === 'function') {\n addEventListener(node, eventName, value as EventListener)\n }\n continue\n }\n if (key === 'ref') {\n setRef(node, value)\n continue\n }\n // null/undefined 表示\"不提供值\",**保持现状**(props.test.ts 把这条钉成了契约)。\n // 注意它有一个已知后果:键仍在 `next` 里时移除循环够不着(`key in next`),\n // 所以\"值从中变成 null\"不会清掉已有属性 —— 要清就得把键从对象里删掉。\n if (value === null || value === undefined) continue\n // property 键的 false 有语义(如 disabled={false} 必须清除),不能跳过;\n // attribute 键的 false 表示\"不设置\",与 HTML 语义一致。\n else if (isClassListKey(key)) applyClassList(node, value)\n else if (isPropertyName(key)) setProperty(node, key, value)\n else if (value === false) continue\n else setAttribute(node, domAttributeName(key), key === 'style' && isStyleObject(value) ? formatStyle(value) : String(value))\n }\n\n if (previous === null) return\n for (const key of Object.keys(previous)) {\n if (key in next || key === 'key') continue\n if (key.startsWith('on')) {\n const eventName = resolveEventName(key) ?? key.slice(2).toLowerCase()\n const previousHandler = previous[key]\n if (typeof previousHandler === 'function') {\n removeEventListener(node, eventName, previousHandler as EventListener)\n }\n continue\n }\n if (key === 'ref') continue\n if (isPropertyName(key)) setProperty(node, key, BOOLEAN_PROPERTIES.has(key) ? false : '')\n else removeAttribute(node, domAttributeName(key))\n }\n}\n\n/**\n * 把 `{...props}` 绑定成**响应式**的:对象变了就增量应用,消失的键会被移除。\n *\n * 编译器对带展开的 JSX 属性发射这个而不是 `spreadProps` —— 后者只在创建时应用一次,\n * 于是「改了 props 不生效」「删掉的键留在 DOM 上」两个问题都**不报错**。\n *\n * ⚠️ `previous` 必须是**值的快照**,不能是 `next` 的引用。\n * 这里存引用时,下一轮 `applySpreadProps` 里的 `Object.is(previous[key], value)`\n * 读的是同一份值 → 恒等 → **整个 diff 短路**,移除循环也因 `key in next` 全跳过。\n * 而编译器为 `<div {...props}>` 发射的正是**身份稳定 + getter**的形状\n * (`bindSpreadProps(_el0, () => props)`,值经 getter 反应式求值),\n * 于是真实产物下\"改了 props 什么都不更新\"。\n *\n * 快照用浅拷贝即可,且**必须在应用之前取**:拷贝会把 getter 求值一次、转成数据属性,\n * 而 `applySpreadProps` 又会把 `next` 的每个键读一遍 —— 两者都在 effect 的追踪窗口内,\n * 所以信号依赖不会因为多这一遍而丢失。\n */\n/**\n * `classList` 每次贡献的类名(按元素记账,便于下次替换而不是叠加)。\n *\n * 为什么需要记账:`classList` 与 `class` 写的是**同一个** HTML 属性。\n * 若不记住上次由 `classList` 贡献了哪些,切换时要么越加越多、要么把作者的 `class` 抹掉。\n */\nconst classListContributions = new WeakMap<object, string[]>()\n\n/** `classList` 值 → 类名数组。支持对象 / 数组 / 字符串三种写法。 */\nexport function parseClassList(value: unknown): string[] {\n const names: string[] = []\n const push = (candidate: unknown): void => {\n if (typeof candidate === 'string') {\n for (const name of candidate.split(/\\s+/u)) if (name !== '') names.push(name)\n }\n }\n if (Array.isArray(value)) {\n for (const entry of value) {\n if (entry !== null && typeof entry === 'object') {\n for (const [name, on] of Object.entries(entry)) if (on) push(name)\n } else push(entry)\n }\n } else if (value !== null && typeof value === 'object') {\n for (const [name, on] of Object.entries(value)) if (on) push(name)\n } else push(value)\n return names\n}\n\n/**\n * 应用 `classList`:与元素上已有的 `class` **合并**,并可反复切换。\n *\n * 存在的理由(外部踩坑文档 C 条):条件分支里的输入控件会丢焦点 ——\n * `insertDynamic` 按引用比较(`next === current`),写条件表达式就会重建子树。\n * 文档给出的对策是「固定渲染 + 响应式 class 显隐」,但此前只能手写字符串模板:\n *\n * ```tsx\n * <div class={open.value ? 'panel is-open' : 'panel'}> // 易漏、易写错\n * <div class=\"panel\" classList={{ 'is-open': open.value }}> // 现在:\n * ```\n *\n * `classList` 只负责它自己贡献的部分,作者写在 `class` 里的类名不受影响。\n */\nexport function applyClassList(node: Element, value: unknown): void {\n const next = parseClassList(value)\n const previous = classListContributions.get(node) ?? []\n classListContributions.set(node, next)\n const base = (node.getAttribute('class') ?? '')\n .split(/\\s+/u)\n .filter(name => name !== '' && !previous.includes(name))\n const merged = [...new Set([...base, ...next])]\n setAttribute(node, 'class', merged.join(' '))\n}\n\nfunction isClassListKey(key: string): boolean {\n return key === 'classList'\n}\n\nexport function bindSpreadProps(node: Element, source: () => Record<string, unknown>): void {\n let previous: Record<string, unknown> | null = null\n effect(() => {\n const next = source() ?? {}\n const snapshot = { ...next }\n applySpreadProps(node, previous, next)\n previous = snapshot\n })\n}\n\n/** Apply compile-time host properties in one renderer pass. */\nexport function setStaticProps(node: Element, props: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(props)) {\n if (key === 'key' || key === 'ref' || key.startsWith('on')) continue\n if (value === null || value === undefined) continue\n if (isClassListKey(key)) applyClassList(node, value)\n else if (isPropertyName(key)) setProperty(node, key, value)\n else if (value === false) continue\n else setAttribute(node, domAttributeName(key), key === 'style' && isStyleObject(value) ? formatStyle(value) : String(value))\n }\n}\n\n\nfunction isStyleObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction formatStyle(value: Record<string, unknown>): string {\n return Object.entries(value).filter(([, entry]) => entry !== null && entry !== undefined && entry !== false)\n .map(([key, entry]) => `${key.replace(/[A-Z]/gu, match => `-${match.toLowerCase()}`)}:${String(entry)}`).join(';')\n}\n\nexport function addEventListener(\n node: Element,\n event: string,\n handler: EventListener\n): void {\n const renderer = getRenderer()\n const owner = getCurrentOwner()\n let bindings = eventBindings.get(node)\n if (!bindings) {\n bindings = new Map()\n eventBindings.set(node, bindings)\n }\n const previous = bindings.get(event)\n if (previous && previous.original === handler && previous.owner === owner) return\n if (previous) {\n // 旧监听先摘掉;Owner 清理槽由下面的 slots 原地续用,不在清理表里增删\n renderer.removeEventListener(node, event, previous.handler)\n }\n const listener = owner ? (reason: Event) => {\n // Owner 已销毁说明节点所属子树已被卸载/替换,事件来自游离 DOM,直接忽略。\n // 否则 owner.run 会抛\"已销毁的 Owner\",在事件流里制造无意义的错误噪音。\n if (owner.disposed) return\n try {\n owner.run(() => handler(reason))\n } catch (error) {\n const handled = owner.handleError(error)\n invokeRuntimeDebug('error', {\n error,\n owner,\n phase: 'event',\n handled,\n recovery: handled ? 'handled' : 'propagated'\n })\n /*\n * 被 owner 的 onError 处理掉之后,错误就只剩 debug 钩子这一个出口 ——\n * 没装 DevTools 时控制台一个字都没有:事件处理器抛错、界面没反应、无从查起。\n * 没被处理的情况下面会 rethrow(浏览器自己会报),所以只在「被吞下」时补控制台。\n */\n if (handled && getRuntimeDebugHooks()?.error === undefined) {\n console.error(formatVobsError(error, { includeStack: true }))\n }\n if (!handled) throw error\n }\n } : handler\n /*\n * 这个 (node,event) 在 Owner 清理表里只占**一个**槽,替换 handler 时**原地**换掉它做的事。\n *\n * 此前是在**每次** addEventListener 里无条件 `owner.onDispose(...)`,而 `Owner.cleanups`\n * 是只 push 的数组(reactivity/src/owner.ts:57,84)→ 换一次 handler 就多一条永不执行的\n * 清理项,旧的 handler 闭包也被一并扣住。实测(.artifacts/reports/runtime.supplement.md\n * 缺点 4 与既有报告缺点 1,两轮独立复现):500 次替换 → `cleanups.length === 500`;\n * 一轮 `{...props}` 换 onClick → 202。组件的 effect 每次重跑都会重绑事件,\n * 所以这是热路径上的**无界增长**(长寿命页面里等价于内存泄漏)。\n *\n * `binding` 是 `const`,所以槽里必须包一层可变的 `current` —— 换绑时改的是 `current`,\n * 数组长度不变、旧闭包被释放。\n */\n const binding: EventBinding = { handler: listener, owner, original: handler }\n bindings.set(event, binding)\n renderer.addEventListener(node, event, listener)\n if (!owner) return\n /*\n * **每个 (node,event) 在 Owner 清理表里只占一个槽。**\n *\n * 此前是在**每次** addEventListener 里无条件 `owner.onDispose(...)`,而 `Owner.cleanups`\n * 是只 push 的数组(reactivity/src/owner.ts:57,84)→ 换一次 handler 就多一条永不执行的\n * 清理项,旧的 handler 闭包也被一并扣住。实测(.artifacts/reports/runtime.supplement.md\n * 缺点 4 与既有报告缺点 1,两轮独立复现):500 次替换 → `cleanups.length === 500`;\n * 一轮 `{...props}` 换 onClick → 202。组件 effect 每次重跑都会重绑事件,\n * 所以这是热路径上的**无界增长**(长寿命页面里等价于内存泄漏)。\n *\n * 做法:清理槽里存的是**间接引用**(owner → (node,event) → 当前 handle),\n * 重绑时只换间接引用指向的东西,槽本身不增不减;最后一个引用被清掉时槽自然失效。\n * 键用 per-owner 的 `eventCleanupKeys` 映射成数字,避免长字符串前缀比较。\n */\n const key = eventCleanupKey(node, event)\n let slots = eventCleanupSlots.get(owner)\n if (!slots) {\n slots = new Map()\n eventCleanupSlots.set(owner, slots)\n }\n // 槽存的永远是\"当前该清哪一条绑定\",所以重绑/摘除后再绑都只是覆盖它\n const hasSlot = slots.has(key)\n slots.set(key, binding)\n if (hasSlot) return\n owner.onDispose(() => {\n const current = eventCleanupSlots.get(owner)?.get(key)\n if (!current) return\n eventCleanupSlots.get(owner)?.delete(key)\n const map = eventBindings.get(node)\n if (map?.get(event) === current) map.delete(event)\n renderer.removeEventListener(node, event, current.handler)\n })\n}\n\nexport function removeEventListener(\n node: Element,\n event: string,\n handler: EventListener\n): void {\n const renderer = getRenderer()\n const map = eventBindings.get(node)\n const binding = map?.get(event)\n /*\n * **必须比 handler 身份**(DOM 的 `removeEventListener` 语义就是如此)。\n *\n * 原来这里忽略传入的 `handler`:只要 `(node,event)` 上有绑定就一律摘掉,\n * 并把绑定记录删掉。于是\"用另一个 handler 调 remove\"会把**别人的**绑定误摘 ——\n * 调用方以为只是取消自己那次(本来应当是 no-op),实际把当前生效的监听弄没了。\n *\n * 现在的行为:\n * - 有绑定且身份一致 → 摘掉(正常路径)\n * - 有绑定但身份不同 → **no-op**(不去动别人的绑定)\n * - 绑定记录里没有(例如由别处直接经 renderer 绑的)→ 按传入的 handler 兜底摘一次,\n * 保持与渲染器 API 直连时的可用性\n */\n if (binding) {\n if (binding.handler !== handler) return\n map?.delete(event)\n }\n renderer.removeEventListener(node, event, binding?.handler ?? handler)\n}\n\n/**\n * 清空容器。\n *\n * 原来只调渲染器的 clear(DOM 实现就是 `textContent = ''`)—— **被清掉子树的 Owner\n * 一个都不释放**:组件里的 effect 继续订阅信号(幽灵更新)、监听不解绑、onDispose 不跑。\n * 现在先把子树里能找到的 Owner 释放掉,再清 DOM。\n *\n * 覆盖范围如实说明:`nodeOwners` 只登记**组件输出节点**(`createComponent` 时\n * `associateNodeOwner`)。所以在组件边界上清理是完整的(组件 Owner 的销毁会级联它的\n * effect 与子 Owner);而在组件外直接 `bindText` 之类建立的 effect 挂在调用方当时的\n * Owner 上、不在节点表里,这里**清不到** —— 那部分归它的 Owner 管,通常由\n * `app.destroy()` 负责。要彻底解决需要节点表能反向枚举,代价更大,先不做。\n *\n * 清理抛错不影响 DOM 被清空(先释放、后清 DOM 的顺序也保证了这一点)。\n */\nexport function clear(container: Node): void {\n let firstError: unknown\n const walk = (node: Node): void => {\n try {\n disposeNodeOwner(node as unknown as VobsNode)\n } catch (error) {\n firstError ??= error\n }\n for (const child of Array.from(node.childNodes)) walk(child)\n }\n for (const child of Array.from(container.childNodes)) walk(child)\n\n getRenderer().clear(container)\n if (getRuntimeDebugHooks()) {\n invokeRuntimeDebug('domMutation', {\n operation: 'clear',\n target: describeDebugNode(container as unknown as VobsNode),\n parent: describeDebugNode(container as unknown as VobsNode)\n })\n }\n if (firstError) throw firstError\n}\n\ntype VobsComponent = (...args: any[]) => VobsNode\n\ntype ComponentProps<Component extends VobsComponent> = Component extends (\n props: infer Props\n) => VobsNode\n ? NonNullable<Props> extends object ? NonNullable<Props> : Record<string, never>\n : Record<string, never>\n\nexport function createComponent<Component extends VobsComponent>(\n component: Component,\n props: ComponentProps<Component>,\n source?: VobsSourceLocation\n): VobsNode {\n const owner = createOwner()\n const componentName = (component as typeof component & { displayName?: string }).displayName\n || component.name\n || 'anonymous'\n setOwnerDebugName(owner, source\n ? `${componentName} (${source.file}:${source.line}:${source.column})`\n : componentName)\n owner.onError(reason => {\n attachSourceLocation(reason, source)\n attachComponentContext(reason, componentName, owner.id)\n throw reason\n })\n // HMR 注册先于渲染作用域标记:注册清理必须跨热更新保活,不能被\n // disposeSince 当作上一轮渲染的清理释放掉。\n const hmrKey = (component as typeof component & { hmrKey?: string }).hmrKey\n let instance: HmrInstance | null = null\n if (hmrKey) {\n const separator = hmrKey.lastIndexOf(':')\n const moduleId = separator < 0 ? hmrKey : hmrKey.slice(0, separator)\n instance = { node: null as unknown as VobsNode, parent: null, refresh: () => refreshInstance() }\n const cleanup = registerHmrInstance(moduleId, instance)\n owner.onDispose(cleanup)\n }\n // 渲染作用域:组件 Owner 只承载 HMR 注册与错误处理,每轮渲染注册的 effect、\n // onDispose(含 portal 清理)与嵌套组件 Owner 都归属该轮作用域。HMR refresh\n // 重渲染前释放上一轮作用域,旧实例的 effect 不再订阅信号、portal 节点不再\n // 残留在 body 中每轮热更新叠加;组件 Owner 与 HMR 注册保活。\n const renderScope = owner.mark()\n /*\n * 局部类型放宽到运行时真实值域:组件返回 `null` / `undefined` / `false`\n * 都是合法 JSX 写法(`cond ? <X/> : null`、`cond && <X/>`),\n * 只是 `VobsComponent` 的声明把它写窄了。下面统一归一化成空注释节点。\n */\n /*\n * 用**独立变量**承接渲染结果再归一化。\n * 直接写 `let node: VobsNode | null | undefined | false` 再比较 `node === false` 时,\n * TS 的控制流分析会依据 `component(props)` 的声明类型把 `node` 收窄回 `VobsNode`,\n * 于是 `false` 分支被判成\"类型不可达\"而报错 —— 但运行时它确实会出现。\n */\n let rendered: unknown\n try {\n // 组件渲染必须 untrack:组件是 run-once 的,其渲染发生在某次 effect 求值\n // (insertDynamic/insertBoundary 的渲染工厂、路由挂载)内时,若不切断追踪,\n // 组件体内读取的信号会被收集为祖先 effect 的依赖——一次无关编辑就会触发\n // 整棵子树销毁重建(输入框被换掉、焦点丢失、事件监听随旧树一起被清理)。\n // 结构性响应只属于条件工厂与绑定 effect,组件本体渲染一次即止。\n rendered = owner.run(() => untrack(() => component(props)))\n } catch (error) {\n owner.dispose()\n attachSourceLocation(error, source)\n attachComponentContext(error, componentName, owner.id)\n throw error\n }\n /*\n * 组件返回 `null` / `undefined` / `false` 时用**注释节点**代替。\n *\n * 这是生产事故(Labelune 2026-09-30 发版黑屏)的根因:`createComponent` 把渲染结果\n * 直接当作 `nodeOwners` 这个 **WeakMap 的 key**,而 `null` / `undefined` 不是合法 key ——\n * `nodeOwners.set(null, owner)` 抛 `Invalid value used as weak map key`。\n * 后果特别贵:App 挂载即崩、**没有任何 JS 崩溃日志**、splash 兜底也失效,\n * 只能靠人肉纪律「组件永远返回真实节点」避免。\n *\n * 「组件顶层条件 return null」是合法的 JSX 写法,框架不该崩。\n * 注释节点是**渲染为空的既有原语**(fragment 与 dynamic 的标记都用它),\n * 视觉结果与返回 null 完全一致,但满足 `VobsNode` 契约 —— 于是挂载、HMR 刷新、\n * 节点替换、水合这些下游路径都不需要各自特判一个\"空\"分支。\n */\n const node: VobsNode = isRenderableNode(rendered) ? rendered : createComment('vobs:empty')\n associateNodeOwner(node, owner)\n if (instance) {\n instance.node = node\n associateHmrInstance(node, instance)\n }\n function refreshInstance(): void {\n // 组件已随旧渲染树一起卸载(如父级在同一次热更新中先完成刷新),\n // 无法也无需再刷新。\n if (owner.disposed) return\n const previous = instance!.node\n owner.disposeSince(renderScope)\n const next = owner.run(() => untrack(() => component(props)))\n const parent = instance!.parent\n if (parent) {\n // 先插入新树再卸载旧树:替换锚点始终取自仍在文档中的旧树,\n // fragment 与普通节点两种形态任意组合都能正确定位插入点。\n const anchor = isVobsFragment(previous) ? previous.start : previous\n if (isVobsFragment(next)) next.mount(parent, anchor)\n else getRenderer().insertBefore(parent, next, anchor)\n if (isVobsFragment(previous)) previous.unmount(parent)\n else getRenderer().removeChild(parent, previous)\n }\n nodeOwners.delete(previous as object)\n nodeOwners.set(next as object, owner)\n associateHmrInstance(next, instance!)\n instance!.node = next\n }\n return node\n}\n\nexport interface VobsSourceLocation {\n readonly file: string\n readonly line: number\n readonly column: number\n}\n\nexport interface VobsLocatedError extends Error {\n readonly vobsSource?: VobsSourceLocation\n readonly vobsComponent?: string\n readonly vobsOwnerId?: string\n}\n\nfunction attachSourceLocation(reason: unknown, source: VobsSourceLocation | undefined): void {\n if (!source || (!reason || (typeof reason !== 'object' && typeof reason !== 'function'))) return\n const error = reason as VobsLocatedError\n if (error.vobsSource) return\n try {\n Object.defineProperty(error, 'vobsSource', {\n configurable: true,\n enumerable: false,\n value: source,\n writable: false\n })\n } catch {\n // Frozen third-party errors still propagate with their original details.\n }\n}\n\nfunction attachComponentContext(reason: unknown, component: string, ownerId: string): void {\n if (!reason || (typeof reason !== 'object' && typeof reason !== 'function')) return\n const error = reason as VobsLocatedError\n try {\n if (!error.vobsComponent) Object.defineProperty(error, 'vobsComponent', { configurable: true, enumerable: false, value: component, writable: false })\n if (!error.vobsOwnerId) Object.defineProperty(error, 'vobsOwnerId', { configurable: true, enumerable: false, value: ownerId, writable: false })\n } catch {\n // Frozen third-party errors still propagate with their original details.\n }\n}\n\nexport function createBlock(factory: () => VobsNode | null | undefined | false): VobsNode | null {\n const owner = createOwner()\n setOwnerDebugName(owner, 'dynamic')\n let node: VobsNode | null | undefined | false\n try {\n node = owner.run(factory)\n } catch (error) {\n owner.dispose()\n throw error\n }\n if (!node) {\n owner.dispose()\n return null\n }\n associateNodeOwner(node, owner)\n return node\n}\n\n/**\n * 组件渲染结果是否是**可用的节点值**。\n *\n * `VobsNode` 的真实值域是一个对象(`Node` / fragment / 自定义渲染器的宿主对象),\n * 而合法 JSX 写法可能返回 `null` / `undefined` / `false`(`cond ? <X/> : null`、`cond && <X/>`)。\n * 用一个守卫而不是直接比较,是因为 `component()` 的声明类型是 `VobsNode`,\n * TS 的控制流会把 `=== false` 之类的比较判成\"类型不可达\"。\n */\nfunction isRenderableNode(value: unknown): value is VobsNode {\n return (typeof value === 'object' && value !== null) || typeof value === 'function'\n}\n\nexport function associateNodeOwner(node: VobsNode, owner: Owner): void {\n /*\n * 防御:`node` 在类型上必然是 `VobsNode`,但运行时可能收到 `null`/`undefined`\n * (组件返回空、第三方渲染器返回非节点)。直接当 WeakMap key 会抛\n * `Invalid value used as weak map key` —— 那是**框架内部错误**,信息量为零,\n * 且会让 App 挂载静默崩溃。这条断言把它变成一条能指认原因的报错。\n */\n if (node === null || node === undefined || (typeof node !== 'object' && typeof node !== 'function')) {\n throw new Error(\n `Vobs: associateNodeOwner 收到非节点值(${String(node)})。`\n + '组件必须返回 VobsNode;返回 null/undefined 由 createComponent 转成空注释节点。'\n )\n }\n nodeOwners.set(node, owner)\n}\n\nexport function disposeNodeOwner(node: VobsNode): void {\n const owner = nodeOwners.get(node)\n if (!owner) return\n nodeOwners.delete(node)\n owner.dispose()\n}\n","/**\n * JSX 属性名 → DOM 设置方式的**单一来源**。\n *\n * compiler 在编译期用它决定生成 setProperty/bindProperty 还是 setAttribute/bindAttribute,\n * runtime 在展开 `{...props}` 时用同一套判断。此前两边各写了一份**逐字重复**的实现\n * (compile.ts 与 ops.ts),注释还写着「保持一致」—— 分叉即静默改道,所以收到这里。\n *\n * 这张表只描述「名字」,不占用户包体:compiler 侧是构建期用,runtime 侧是几十个字符串。\n */\n\n/**\n * 走 property 通道的名字(`el[name] = value`)。\n *\n * 判断标准是「当成 attribute 设不管用、或者语义不同」:\n * - `innerHTML` / `textContent` 不是 HTML 属性,setAttribute 完全无效(静默无操作)\n * - `defaultValue` / `defaultChecked` 的 attribute 形式是 value/checked,名字对不上\n * - `indeterminate` / `currentTime` / `volume` 等根本没有对应 attribute\n * 其余常见名字(value/checked/disabled/…)两条通道都能工作,列在这里是为了语义正确\n * (如 `disabled={false}` 必须清除 property)。\n */\nconst PROPERTY_NAMES: ReadonlySet<string> = new Set([\n // 表单状态\n 'value', 'checked', 'selected', 'disabled', 'multiple', 'readOnly', 'required',\n 'defaultValue', 'defaultChecked', 'indeterminate',\n /*\n * `autoFocus` 用**驼峰**(与同表 readOnly/tabIndex/defaultChecked 一致),且必须走\n * **property 通道**:`autofocus` 是**布尔属性**(只看存在与否、与值无关),\n * 所以 `autoFocus={false}` 必须\"移除属性\"而不是写 `autofocus=\"false\"`\n * (attribute 通道只能把 false 序列化成字符串,属性照样存在 = 仍然聚焦)。\n *\n * ⚠️ 但 `setProperty` 必须把它映射成 **IDL 名 `autofocus`(全小写)** ——\n * `Reflect.set(el, 'autoFocus', …)` 只会挂一个不反射的 expando,**静默无效**。\n * 映射表见 ops.ts 的 `PROPERTY_IDL_NAMES`。实测(jsdom,与真实 DOM 同语义):\n * IDL `autofocus` → 写 true 得 has=true/idl=true;写 false 得 has=false/idl=false ✓\n * JSX `autoFocus` → 属性与 IDL 都不变(只是 expando) ✗\n */\n 'autoFocus', 'hidden', 'tabIndex', 'colSpan', 'rowSpan', 'open',\n // 只能走 property 的(attribute 路径会静默无效)\n 'innerHTML', 'innerText', 'textContent',\n // 媒体\n 'muted', 'volume', 'currentTime', 'playbackRate'\n])\n\n/** camelCase JSX 属性名 → HTML attribute 名的别名。 */\nconst ATTRIBUTE_ALIASES: Readonly<Record<string, string>> = {\n className: 'class',\n htmlFor: 'for',\n autoComplete: 'autocomplete',\n spellCheck: 'spellcheck',\n}\n\n/**\n * SVG 里「JSX 写驼峰、真实 DOM 属性是短横线」的那一批。\n *\n * **不能按通用规则把驼峰转短横线** —— SVG 的属性命名是混合的:\n * - 表现属性(就是那些能当 CSS 用的)是短横线:`stroke-width`、`fill-opacity`、`text-anchor`\n * - 结构属性却真是驼峰:`viewBox`、`preserveAspectRatio`、`markerWidth`、`pathLength`\n * 所以只对下面这批做转换;其余同名照旧(`viewBox` 写驼峰本来就是对的)。\n *\n * 写错大小写的后果是完全静默:setAttribute 出一个浏览器不认识的属性,图形照旧没有描边,\n * 没有任何报错。\n */\nconst SVG_KEBAB_ATTRIBUTES: ReadonlySet<string> = new Set([\n // stroke\n 'strokeWidth', 'strokeLinecap', 'strokeLinejoin', 'strokeDasharray', 'strokeDashoffset',\n 'strokeMiterlimit', 'strokeOpacity',\n // fill\n 'fillOpacity', 'fillRule',\n // clip(注意 clipPathUnits 是结构属性,不在这里)\n 'clipPath', 'clipRule',\n // 文本对齐\n 'textAnchor', 'dominantBaseline', 'alignmentBaseline', 'baselineShift',\n // 字体\n 'fontFamily', 'fontSize', 'fontSizeAdjust', 'fontStretch', 'fontStyle', 'fontVariant', 'fontWeight',\n 'letterSpacing', 'wordSpacing',\n // marker 的表现属性(markerWidth / markerHeight / markerUnits 是结构属性,不在这里)\n 'markerStart', 'markerMid', 'markerEnd',\n // 颜色\n 'colorInterpolation', 'colorInterpolationFilters', 'colorProfile', 'colorRendering',\n 'floodColor', 'floodOpacity', 'lightingColor', 'stopColor', 'stopOpacity',\n 'glyphOrientationHorizontal', 'glyphOrientationVertical',\n // 渲染与合成\n 'imageRendering', 'paintOrder', 'pointerEvents', 'shapeRendering',\n 'textDecoration', 'textRendering', 'transformOrigin', 'vectorEffect', 'writingMode'\n])\n\n/** 名字是否应走 property 通道(`el[name] = value`)。 */\nexport function isPropertyName(name: string): boolean {\n return PROPERTY_NAMES.has(name)\n}\n\n/** SVG 驼峰属性名是否应转成短横线形式(`strokeWidth` → `stroke-width`)。 */\nexport function isSvgKebabAttribute(name: string): boolean {\n return SVG_KEBAB_ATTRIBUTES.has(name)\n}\n\n/**\n * camelCase JSX 属性名 → 真正写进 DOM 的 attribute 名。\n *\n * 注意 property 通道**不**经过这里:`colSpan` / `rowSpan` 的 JS 属性名本就是驼峰。\n */\nexport function domAttributeName(name: string): string {\n const alias = ATTRIBUTE_ALIASES[name]\n if (alias !== undefined) return alias\n if (SVG_KEBAB_ATTRIBUTES.has(name)) return name.replace(/[A-Z]/gu, letter => `-${letter.toLowerCase()}`)\n return name\n}\n","/**\n * `on*` 属性名 → 真实 DOM 事件名。\n *\n * 与 `dom-props.ts` 的属性名表同理:这必须是**单一来源**。\n * 此前编译期与运行期各写一份、且不一致:\n * - 编译期(`@vobs/compiler` 的 `dom-events.ts`)有别名表,知道 `onDoubleClick` → `dblclick`;\n * - 运行期的 `{...props}` 展开路径只做 `name.slice(2).toLowerCase()`\n * → `onDoubleClick` 变成 `\"doubleclick\"`,**DOM 里根本叫 dblclick**,\n * 于是回调永不触发,而且不报错。\n * 实测(.artifacts/reports/runtime.supplement.md 缺点 2):派发 `dblclick` 命中 0 次,\n * 隐藏的 `doubleclick` 监听命中 1 次。同一个包在 `dom-props.ts:1-8` 自称\"两边逐字重复、\n * 已收拢成单一来源\",但那只覆盖属性名,没覆盖事件名。\n */\n\n/** JSX 驼峰名与 DOM 事件名不一致的少数情况(小写后的驼峰名 → 真实事件名)。 */\nexport const EVENT_NAME_ALIASES: Readonly<Record<string, string>> = {\n // React 风格的 onDoubleClick 对应的 DOM 事件是 dblclick\n doubleclick: 'dblclick',\n // 少数人按 addEventListener 的写法写成 onDblClick\n dblclick: 'dblclick'\n}\n\n/**\n * 把 `on*` 属性名解析成真实事件名。\n *\n * @returns 名字不以 `on` 开头或只有 `on` 本身时返回 undefined。\n */\nexport function resolveEventName(attributeName: string): string | undefined {\n if (!attributeName.startsWith('on') || attributeName.length <= 2) return undefined\n const lowered = attributeName.slice(2).toLowerCase()\n return EVENT_NAME_ALIASES[lowered] ?? lowered\n}\n","/**\n * SVG 标签与命名空间 —— 编译期判定提升、运行期决定怎么建节点的**同一份依据**。\n *\n * 两处都需要知道「这个名字是不是 SVG 标签」:\n * - 运行期:`document.createElement('rect')` 得到的是 HTMLUnknownElement,\n * 整棵 SVG 子树都不渲染(且没有报错),所以必须走 createElementNS\n * - 编译期:静态子树被提升成 HTML 模板串再 cloneNode,而模板串是**用 HTML 解析器**\n * 解析的 —— `<g>`、`<rect>` 同样变成 HTMLUnknownElement。这条路径漏了整整一个大版本\n * (1.7.4 只修了 createElement 那条入口,svg.test.ts 也只测那条)。\n */\nexport const SVG_NAMESPACE = 'http://www.w3.org/2000/svg'\n\n/**\n * SVG 标签全集(= TypeScript SVGElementTagNameMap 的键,运行时分发依据)。\n * 与 React 的运行时清单同思路:只含纯 SVG 标签,刻意排除与 HTML 同名的\n * a/script/style/title(它们在 JSX 类型里归 HTMLElement,按 HTML 创建)。\n */\nexport const SVG_TAGS: ReadonlySet<string> = new Set([\n 'animate', 'animateMotion', 'animateTransform', 'circle', 'clipPath', 'defs', 'desc',\n 'ellipse', 'feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite',\n 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight',\n 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR',\n 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset',\n 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence',\n 'filter', 'foreignObject', 'g', 'image', 'line', 'linearGradient', 'marker', 'mask',\n 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient',\n 'rect', 'set', 'stop', 'svg', 'switch', 'symbol', 'text', 'textPath', 'tspan',\n 'use', 'view'\n])\n\n/** 是否是 SVG 专属标签(按名字判定,不看父级)。 */\nexport function isSvgTag(tag: string): boolean {\n return SVG_TAGS.has(tag)\n}\n","/** Shared error protocol used by the runtime, compiler and DevTools. */\nexport type VobsErrorSeverity = 'error' | 'warning' | 'info'\nexport type VobsErrorLayer =\n | 'compiler'\n | 'runtime'\n | 'constraint'\n | 'permission'\n | 'ssr'\n | 'http'\n | 'resource'\n\nexport interface VobsErrorLocation {\n readonly file: string\n readonly line: number\n readonly column: number\n}\n\nexport interface VobsErrorOptions {\n readonly code: string\n readonly message: string\n readonly severity?: VobsErrorSeverity\n readonly layer?: VobsErrorLayer\n readonly cause?: unknown\n readonly fix?: string\n readonly location?: VobsErrorLocation\n readonly trace?: readonly string[]\n readonly example?: string\n readonly docs?: string\n readonly codeFrame?: string\n}\n\nexport interface VobsErrorDefaults {\n readonly code?: string\n readonly severity?: VobsErrorSeverity\n readonly layer?: VobsErrorLayer\n readonly fix?: string\n}\n\n/** A framework error with stable machine-readable metadata. */\nexport class VobsError extends Error {\n readonly code: string\n readonly severity: VobsErrorSeverity\n readonly layer: VobsErrorLayer\n readonly cause?: unknown\n readonly fix?: string\n readonly location?: VobsErrorLocation\n readonly trace?: readonly string[]\n readonly example?: string\n readonly docs?: string\n readonly codeFrame?: string\n\n constructor(options: VobsErrorOptions) {\n super(options.message)\n this.name = 'VobsError'\n this.code = options.code\n this.severity = options.severity ?? 'error'\n this.layer = options.layer ?? 'runtime'\n this.cause = options.cause\n this.fix = options.fix\n this.location = options.location\n this.trace = options.trace\n this.example = options.example\n this.docs = options.docs\n this.codeFrame = options.codeFrame\n }\n}\n\nexport function createVobsError(options: VobsErrorOptions): VobsError {\n return new VobsError(options)\n}\n\n/**\n * 结构化识别(不依赖 `instanceof`)。\n *\n * **不能要求 `layer` 也齐全** —— 原来要求 code + message + layer 三者都是字符串,\n * 于是调用方递一个 `{ code, message }` 就会被判为「不是 VobsError」,掉进最后的\n * `String(value)` 兜底,输出 `[object Object]`:诊断系统自己把诊断丢了。\n * layer 缺失在下面构造时会补上默认值,没有理由在识别阶段就否掉。\n */\nexport function isVobsError(value: unknown): value is VobsError {\n return value instanceof VobsError\n || Boolean(value && typeof value === 'object'\n && typeof (value as { code?: unknown }).code === 'string'\n && typeof (value as { message?: unknown }).message === 'string')\n}\n\n/**\n * 别的打包副本造的 VobsError。\n *\n * tsup `splitting: false` 让 error.ts 同时进 `dist/index.js` 与 `dist/error.js`,\n * 两份类互不 `instanceof`。字段齐全,只是身份不同 —— 识别出来复制成本地实例。\n */\nfunction isForeignVobsError(value: unknown): value is Error & VobsErrorOptions {\n return value instanceof Error\n && value.name === 'VobsError'\n && typeof (value as { code?: unknown }).code === 'string'\n}\n\n/** 兜底取消息:至少要能读出对象上的 message,别再输出 `[object Object]`。 */\nfunction describeUnknown(value: unknown): string {\n if (value === null || value === undefined) return String(value)\n if (typeof value === 'string') return value\n if (typeof value === 'object') {\n const message = (value as { message?: unknown }).message\n if (typeof message === 'string' && message !== '') return message\n try {\n return JSON.stringify(value) ?? String(value)\n } catch {\n return String(value)\n }\n }\n return String(value)\n}\n\n/** 把任意来源的「类 VobsError」字段复制成本地实例。 */\nfunction adoptVobsError(\n value: VobsErrorOptions & { cause?: unknown },\n defaults: VobsErrorDefaults\n): VobsError {\n return new VobsError({\n code: value.code,\n message: value.message,\n severity: value.severity ?? defaults.severity,\n layer: value.layer ?? defaults.layer,\n cause: value.cause ?? (value instanceof Error ? value : undefined),\n fix: value.fix ?? defaults.fix,\n location: value.location,\n trace: value.trace,\n example: value.example,\n docs: value.docs,\n codeFrame: value.codeFrame\n })\n}\n\n/** Convert thrown strings and third-party errors without losing their message. */\nexport function normalizeVobsError(value: unknown, defaults: VobsErrorDefaults = {}): VobsError {\n // 本地实例:原样返回,保持同一性与已有 stack\n if (value instanceof VobsError) return value\n\n // 别的副本造的:复制成本地实例,下游 instanceof 才成立\n if (isForeignVobsError(value)) return adoptVobsError(value, defaults)\n\n if (value instanceof Error) {\n // Preserve the original Error identity so boundaries and DevTools can\n // correlate event/effect phases without creating duplicate diagnostics.\n const metadata = value as Error & {\n readonly vobsCode?: unknown\n readonly vobsHint?: unknown\n readonly vobsSource?: unknown\n }\n const code = defaults.code ?? (typeof metadata.vobsCode === 'string' ? metadata.vobsCode : undefined)\n if (code) {\n defineErrorMetadata(value, 'code', code)\n /*\n * 冻结 / 不可扩展的第三方 Error 上挂不上元数据。原来这里静默吞掉,\n * 于是 normalize 的结果 code 是 undefined(打印成 VOBS_UNKNOWN)。\n * 挂不上就复制成本地实例,别把 code 丢了。\n */\n if ((value as { code?: unknown }).code !== code) {\n return new VobsError({\n code,\n message: value.message,\n severity: defaults.severity ?? 'error',\n layer: defaults.layer ?? 'runtime',\n cause: value,\n fix: defaults.fix ?? (typeof metadata.vobsHint === 'string' ? metadata.vobsHint : undefined)\n })\n }\n }\n defineErrorMetadata(value, 'severity', defaults.severity ?? 'error')\n defineErrorMetadata(value, 'layer', defaults.layer ?? 'runtime')\n const fix = defaults.fix ?? (typeof metadata.vobsHint === 'string' ? metadata.vobsHint : undefined)\n if (fix) defineErrorMetadata(value, 'fix', fix)\n const source = metadata.vobsSource\n if (source && typeof source === 'object'\n && typeof (source as { file?: unknown }).file === 'string'\n && typeof (source as { line?: unknown }).line === 'number'\n && typeof (source as { column?: unknown }).column === 'number') {\n defineErrorMetadata(value, 'location', source)\n }\n return value as VobsError\n }\n\n // 结构化对象(可能缺 layer,甚至缺 severity):补齐后构造成本地 VobsError\n if (isVobsError(value)) return adoptVobsError(value as VobsErrorOptions, defaults)\n\n return new VobsError({\n code: defaults.code ?? 'VOBS_UNKNOWN',\n message: describeUnknown(value),\n severity: defaults.severity ?? 'error',\n layer: defaults.layer ?? 'runtime',\n cause: undefined,\n fix: defaults.fix\n })\n}\n\nfunction defineErrorMetadata(target: Error, key: string, value: unknown): void {\n if (key in target) return\n try {\n Object.defineProperty(target, key, { configurable: true, enumerable: false, value, writable: true })\n } catch {\n // 冻结 / 不可扩展的第三方 Error:元数据挂不上。调用方会用「写完再读回」判断\n // 是否成功,失败时改成复制成本地实例,而不是静默丢掉 code。\n }\n}\n\nexport interface FormatVobsErrorOptions {\n readonly environment?: 'development' | 'production'\n readonly includeStack?: boolean\n}\n\n/** Format a concise, actionable message for terminals and dev overlays. */\nexport function formatVobsError(\n value: unknown,\n options: FormatVobsErrorOptions = {}\n): string {\n const error = normalizeVobsError(value)\n const code = error.code || 'VOBS_UNKNOWN'\n const severity = error.severity || 'error'\n if (options.environment === 'production') return `[Vobs ${code}] ${error.message}`\n\n const lines = [`[Vobs ${capitalize(severity)}] ${error.message}`, `Code: ${code}`]\n if (error.location) lines.push(`Location: ${error.location.file}:${error.location.line}:${error.location.column}`)\n if (error.codeFrame) lines.push('', error.codeFrame)\n if (error.cause !== undefined) lines.push(`Cause: ${formatCause(error.cause)}`)\n if (error.trace?.length) lines.push('', `Trace: ${error.trace.join(' → ')}`)\n if (error.fix) lines.push('', `Fix: ${error.fix}`)\n if (error.example) lines.push('', `Example:\\n${error.example}`)\n if (error.docs) lines.push(`Docs: ${error.docs}`)\n if (options.includeStack && error.stack) lines.push('', error.stack)\n return lines.join('\\n')\n}\n\nfunction formatCause(value: unknown): string {\n return value instanceof Error ? `${value.name}: ${value.message}` : String(value)\n}\n\nfunction capitalize(value: string): string {\n return value.slice(0, 1).toUpperCase() + value.slice(1)\n}\n","import type { VobsNode } from './fragment'\nimport { formatVobsError } from './error'\n\nexport type HmrComponent<Props extends object = Record<string, unknown>> =\n (props: Props) => VobsNode\n\nexport interface HmrStateStore {\n get<T>(key: string, initial: T | (() => T)): T\n set<T>(key: string, value: T): void\n has(key: string): boolean\n delete(key: string): void\n clear(): void\n}\n\nexport interface HmrInstance {\n node: VobsNode\n parent: Node | null\n refresh(): void\n}\n\ninterface HmrModuleState {\n readonly components: Map<string, HmrComponent>\n readonly state: Map<string, unknown>\n readonly instances: Set<HmrInstance>\n}\n\ninterface HmrGlobal {\n modules: Map<string, HmrModuleState>\n /** 编译器生成的 hmrStateRef 注册表:键为 `${moduleId}#${声明名}`,值跨模块重执行保活。 */\n states: Map<string, unknown>\n}\n\nconst globalTarget = globalThis as typeof globalThis & { __VOBS_HMR__?: HmrGlobal }\nconst hmrGlobal = globalTarget.__VOBS_HMR__ ?? { modules: new Map<string, HmrModuleState>(), states: new Map<string, unknown>() }\nglobalTarget.__VOBS_HMR__ = hmrGlobal\n\nexport function resolveComponent<Props extends object>(\n component: HmrComponent<Props>,\n moduleId: string,\n exportName: string\n): HmrComponent<Props> {\n const module = getModule(moduleId)\n const existing = module.components.get(exportName)\n if (existing) return existing as HmrComponent<Props>\n\n const proxy = ((props: Props) => {\n const current = (proxy as HmrComponent<Props> & { current: HmrComponent<Props> }).current\n return current(props)\n }) as HmrComponent<Props> & { current: HmrComponent<Props> }\n proxy.current = component\n Object.defineProperties(proxy, {\n displayName: { configurable: true, value: component.name || exportName },\n hmrKey: { configurable: false, value: `${moduleId}:${exportName}` }\n })\n module.components.set(exportName, proxy as HmrComponent)\n return proxy\n}\n\nexport function updateHmrModule(moduleId: string, nextModule: Record<string, unknown>): void {\n const module = hmrGlobal.modules.get(moduleId)\n if (!module) return\n let changed = false\n for (const [name, proxy] of module.components) {\n const next = nextModule[name]\n if (typeof next !== 'function') continue\n const hmrProxy = proxy as HmrComponent & { current: HmrComponent; displayName?: string }\n hmrProxy.current = next as HmrComponent\n Object.defineProperty(hmrProxy, 'displayName', { configurable: true, value: next.name || name })\n changed = true\n }\n if (!changed) return\n // 快照后正序遍历:实例在自身渲染开始前注册,祖先必然先于后代入列——\n // 祖先先刷新会 dispose 上一轮渲染作用域,其树内旧后代实例的 refresh\n // 命中已销毁守卫被跳过,避免同一组件在一次热更新中重渲染两次。\n // 同时 refresh 重渲染以新代码创建的全新实例不在快照中,天然不会再刷新。\n const instances = [...module.instances]\n for (const instance of instances) {\n try {\n instance.refresh()\n } catch (error) {\n /*\n * 静默吞掉会让开发者以为热更新成功了,而屏幕上是旧的 —— 最容易被当成\n * 「改了没生效」查半天。刷新失败本身不冒泡(下一次正常渲染会再抛),\n * 但必须留下记录。\n */\n console.error(formatVobsError(error, { includeStack: true }))\n }\n }\n}\n\nexport function disposeHmrModule(_moduleId: string): void {\n // State and component proxies intentionally survive module disposal.\n}\n\nexport function createHmrStateStore(moduleId: string): HmrStateStore {\n const state = getModule(moduleId).state\n return {\n get<T>(key: string, initial: T | (() => T)): T {\n if (!state.has(key)) state.set(key, typeof initial === 'function' ? (initial as () => T)() : initial)\n return state.get(key) as T\n },\n set<T>(key: string, value: T): void {\n state.set(key, value)\n },\n has: key => state.has(key),\n delete: key => { state.delete(key) },\n clear: () => { state.clear() }\n }\n}\n\n/**\n * 编译器为模块顶层 state() 声明生成的取值入口。键为 `${moduleId}#${声明名}`,\n * 与手动 store 键空间隔离。模块热更新重执行时复用既有信号实例:旧导入方持有的\n * 实例与新模块实例共享同一份状态,消除\"两份模块、两份状态\"导致的编辑不生效/页面半边失灵。\n */\nexport function hmrStateRef<T>(key: string, create: () => T): T {\n const states = hmrGlobal.states\n if (states.has(key)) return states.get(key) as T\n const value = create()\n states.set(key, value)\n return value\n}\n\nexport function registerHmrInstance(moduleId: string, instance: HmrInstance): () => void {\n const instances = getModule(moduleId).instances\n instances.add(instance)\n return () => instances.delete(instance)\n}\n\nexport function markHmrInstanceMounted(node: VobsNode, parent: Node): void {\n const instance = hmrInstances.get(node as object)\n if (instance) instance.parent = parent\n}\n\nfunction getModule(moduleId: string): HmrModuleState {\n let module = hmrGlobal.modules.get(moduleId)\n if (!module) {\n module = { components: new Map(), state: new Map(), instances: new Set() }\n hmrGlobal.modules.set(moduleId, module)\n }\n return module\n}\n\nconst hmrInstances = new WeakMap<object, HmrInstance>()\n\nexport function associateHmrInstance(node: VobsNode, instance: HmrInstance): void {\n hmrInstances.set(node as object, instance)\n}\n","import { getCurrentOwner, type Owner } from '@vobs/reactivity'\nimport { formatVobsError } from './error'\n\n/** A mutable reference populated when a host node is mounted. */\nexport interface Ref<T extends object = Node> {\n current: T | null\n}\n\nexport type RefTarget<T extends object = Node> = Ref<T> | ((value: T | null) => void)\n\nexport function ref<T extends object = Node>(initialValue: T | null = null): Ref<T> {\n return { current: initialValue }\n}\n\n/*\n * 每个 (Owner, ref 目标) 只保留**一条**清理注册。\n *\n * 为什么需要:`ref` 会被先后绑到不同节点(同一个 ref 对象、节点被替换;\n * 或条件分支里换了宿主元素)。若每次都 `onDispose` 追加一条,销毁时按注册**逆序**执行,\n * 后注册的那条先把 `target.current` 清成 `null`,于是先注册那条的守卫\n * (`isObjectRef(target) && target.current !== node`)**恰好通过**,再清一次 ——\n * 最终读到 `null` 而不是当前节点。\n *\n * 用 WeakMap<Owner, WeakMap<target, cleanup>> 而不是往 Owner 上挂属性:\n * Owner 是 class 实例,挂新属性会把它推进字典模式(reactivity/src/owner.ts 记过这笔代价)。\n * target 可弱引用(对象),函数型 ref 也可弱引用,所以不阻止回收。\n */\nconst refCleanups = new WeakMap<Owner, WeakMap<object, () => void>>()\n\nfunction rememberRefCleanup(owner: Owner, target: object, cleanup: () => void): void {\n let byTarget = refCleanups.get(owner)\n if (!byTarget) {\n byTarget = new WeakMap()\n refCleanups.set(owner, byTarget)\n }\n const previous = byTarget.get(target)\n if (previous) owner.removeCleanup(previous)\n byTarget.set(target, cleanup)\n}\n\n/** Bind a host node to an object or callback ref and clear it with its Owner. */\nexport function setRef<T extends object>(node: T, target: unknown): void {\n if (!isRefTarget<T>(target)) return\n // SSR's serializable nodes are never exposed as live refs. Custom renderers\n // may use arbitrary host objects, so only exclude the known SSR shape.\n if (isSSRNode(node)) return\n const owner = getCurrentOwner()\n assignRef(target, node)\n if (!owner) return\n const cleanup = (): void => {\n /*\n * 清除 ref 时**必须自己吞掉异常**,不能让 user 的 ref 回调把 dispose 级联打断。\n *\n * `assignRef` 内部已经 try/catch + `console.error`(回调是用户代码,不该让挂载失败),\n * 但那条保护只覆盖\"赋值\"这一步 —— 而这里还有一个**可能抛错的前置判断**。\n * 按 React 语义,函数型 ref 在卸载时**本来就该收到 `null`**;若回调没判空\n * (如 `node => insertList(node, …)`),它会抛,而异常从 onDispose 冒出去会\n * **中断 Owner 的整个清理循环**(实测:/runtime 页面的 `<ul ref={attachList}>`)。\n * 这与 owner.ts 已修的\"子 Owner 抛错不能中断级联\"是同一类缺陷。\n */\n try {\n // Do not clear a ref that has since been reassigned to another node.\n if (isObjectRef(target) && target.current !== node) return\n assignRef(target, null)\n } catch (error) {\n console.error(formatVobsError(error, { includeStack: true }))\n }\n }\n rememberRefCleanup(owner, target as object, cleanup)\n owner.onDispose(cleanup)\n}\n\nfunction isSSRNode(value: object): boolean {\n const type = (value as { type?: unknown }).type\n return (type === 'element' || type === 'text' || type === 'comment')\n && !('nodeType' in value)\n}\n\nfunction isObjectRef<T extends object>(value: unknown): value is Ref<T> {\n return Boolean(value && typeof value === 'object' && 'current' in value)\n}\n\nfunction isRefTarget<T extends object>(value: unknown): value is RefTarget<T> {\n return isObjectRef<T>(value) || typeof value === 'function'\n}\n\nfunction assignRef<T extends object>(target: RefTarget<T>, value: T | null): void {\n try {\n if (typeof target === 'function') target(value)\n else target.current = value\n } catch (error) {\n /*\n * ref 回调是用户代码,挂载不该因为它失败 —— 但也不能**完全无声**:\n * 回调抛错时 ref 拿不到节点,界面看起来正常,用户完全不知道为什么。\n * 保持吞掉(不冒泡),但打一条控制台记录。\n */\n console.error(formatVobsError(error, { includeStack: true }))\n }\n}\n","// 动态绑定:将 Signal 绑定到 DOM 节点\n\nimport { effect } from '@vobs/reactivity'\nimport type { Signal } from '@vobs/reactivity'\nimport { applyClassList, registerSelectValueBinding, setAttribute, setProperty, setTextContent } from './ops'\n\nexport type ValueSource<T> = Signal<T> | (() => T)\n\nfunction readSource<T>(source: ValueSource<T>): T {\n return typeof source === 'function' ? source() : source.value\n}\n\nexport function bindText(\n node: Text,\n source: ValueSource<unknown>\n): void {\n effect(() => {\n const value = readSource(source)\n setTextContent(node, value === null || value === undefined || typeof value === 'boolean' ? '' : String(value))\n })\n}\n\nexport function bindAttribute(\n node: Element,\n key: string,\n source: ValueSource<unknown>\n): void {\n effect(() => {\n const value = readSource(source)\n /*\n * 只挡 null/undefined:`String(undefined)` 会把字面量 \"undefined\" 写进 placeholder 等属性。\n *\n * ⚠️ **`false` 必须透传**,不能在这里当成\"不设置\" —— HTML 的属性分两类:\n * - **枚举属性**(spellcheck / contenteditable / draggable / autocomplete…)**值有语义**:\n * `spellcheck=\"false\"` 与缺省(= true)意图**相反**,所以 `spellCheck={false}`\n * 必须真的写出 `spellcheck=\"false\"`。这一条有测试钉住(jsx-integration ⑤)。\n * - **布尔属性**(disabled / checked / autofocus…)只看\"存在与否\"、与值无关 ——\n * 那类必须走 **property 通道**(`bindProperty` + 布尔清除值 false)才能正确移除。\n *\n * 曾经试过在这里把 `false` 一律当\"移除\"来修 `autoFocus={false}`,结果把 spellCheck\n * 的语义弄反了(`false` 变成\"移除属性\" = 回到缺省 true = 打开拼写检查,与意图相反)。\n * 正确做法是让**布尔属性走 property 通道**,见 `dom-props.ts` 的 PROPERTY_NAMES。\n */\n if (value === null || value === undefined) return\n /*\n * `classList` 走专用通道:它与 `class` 写的是同一个 HTML 属性,\n * 需要\"记住上次贡献、本次替换\"的合并语义(见 ops.ts 的 applyClassList)。\n * 直接 `setAttribute(node,'classList', …)` 只会写出一个浏览器不认识的 `classlist` 属性。\n */\n if (key === 'classList') {\n applyClassList(node, value)\n return\n }\n setAttribute(node, key, key === 'style' && value && typeof value === 'object' && !Array.isArray(value)\n ? Object.entries(value as Record<string, unknown>)\n .filter(([, entry]) => entry !== null && entry !== undefined && entry !== false)\n .map(([name, entry]) => `${name.replace(/[A-Z]/gu, match => `-${match.toLowerCase()}`)}:${String(entry)}`)\n .join(';')\n : String(value))\n })\n}\n\nexport function bindProperty(\n node: Element,\n key: string,\n source: ValueSource<unknown>\n): void {\n // Select initial-value auto resync: remember the bound reader so that inserting\n // <option> children later re-applies the current value (see ops.insertBefore).\n if (key === 'value' && node.nodeName === 'SELECT') {\n registerSelectValueBinding(node, () => readSource(source))\n }\n effect(() => {\n const value = readSource(source)\n // property 键的 false 有语义(如 disabled={false} 必须清除)必须透传;\n // 但 null/undefined 跳过——DOM 会把 undefined 强转成字符串 \"undefined\"(如 input.value)\n if (value === null || value === undefined) return\n setProperty(node, key, value)\n })\n}\n","import { createOwner, effect, state, type Owner, type Signal } from '@vobs/reactivity'\nimport {\n associateNodeOwner,\n createBlock,\n createComment,\n createText,\n insertBefore,\n removeChild,\n setTextContent\n} from './ops'\nimport { createFragment, isVobsFragment, type VobsNode } from './fragment'\n\nexport type NodeFactory = () => VobsNode | null | undefined | false\nexport type DynamicChild = VobsNode | string | number | boolean | null | undefined | readonly DynamicChild[]\n\ninterface ListEntry<T> {\n key: unknown\n node: VobsNode\n owner: Owner\n viewOwner: Owner\n item: Signal<T>\n /** 最近一次赋值的原始 item:供比较与刷新使用,避免在列表 effect 内读取 item 信号造成自依赖。\n * (刻意不叫 value —— `vobs check` 的 VOBS_C210 会把 `X.value` 的读写当成信号自订阅)。 */\n current: T\n index: number\n}\n\nexport function insertDynamic(parent: Node, anchor: Node | null, factory: NodeFactory): void {\n const marker = createComment('vobs:dynamic')\n insertBefore(parent, marker, anchor)\n let current: VobsNode | null = null\n\n effect(() => {\n const next = createBlock(factory)\n if (next === current) return\n\n if (current) removeChild(parent, current)\n current = next\n if (current) insertBefore(parent, current, marker)\n })\n}\n\n/**\n * Inserts any Vobs child value. This is the escape hatch for JSX expressions\n * that return a node, an array of nodes, text, or an empty conditional value.\n *\n * 多态插入(Solid 式):编译器把所有非静态子表达式统一路由到这里,值类型在运行时\n * 分发——原始值走自管理文本节点的原地更新快路径(等价 bindText 性能),节点/Fragment/\n * 数组走 scope 隔离的挂载/卸载路径。函数调用返回节点因此与返回字符串同样安全。\n */\nexport function insertDynamicValue(\n parent: Node,\n anchor: Node | null,\n factory: () => DynamicChild\n): void {\n const marker = createComment('vobs:value')\n insertBefore(parent, marker, anchor)\n let current: VobsNode | null = null\n /** current 是否为本 effect 自建的文本节点(可安全原地改写内容) */\n let currentIsText = false\n let scope: Owner | null = null\n\n effect(() => {\n // 每轮求值使用独立 scope Owner:factory 求值与挂载期间创建的组件 Owner 全部挂在它下面。\n // 数组/节点被替换时整体 dispose 旧 scope,避免被丢弃子树的 effect 继续订阅信号(幽灵更新与内存泄漏)。\n const nextScope = createOwner()\n const value = nextScope.run(factory)\n // ── 原始值快路径:自建文本节点原地改写,不销毁重建(高频文本零 GC)──\n if (typeof value === 'string' || typeof value === 'number') {\n if (currentIsText) {\n setTextContent(current as Text, String(value))\n nextScope.dispose()\n return\n }\n if (current) removeChild(parent, current)\n scope?.dispose()\n scope = null\n const text = createText(String(value))\n insertBefore(parent, text, marker)\n current = text\n currentIsText = true\n nextScope.dispose()\n return\n }\n if (value === null || value === undefined || typeof value === 'boolean') {\n if (current) removeChild(parent, current)\n scope?.dispose()\n scope = null\n current = null\n currentIsText = false\n nextScope.dispose()\n return\n }\n // ── 节点/Fragment/数组路径:scope 隔离的挂载与整体替换 ──\n const next = nextScope.run(() => normalizeDynamicChild(value))\n if (next === current) {\n nextScope.dispose()\n return\n }\n if (current) removeChild(parent, current)\n scope?.dispose()\n scope = nextScope\n current = next\n currentIsText = false\n if (current) insertBefore(parent, current, marker)\n })\n}\n\n/** Convert a JSX child value to a host node without creating a wrapper element. */\nexport function normalizeDynamicChild(value: DynamicChild): VobsNode | null {\n if (value === null || value === undefined || typeof value === 'boolean') return null\n if (typeof value === 'string' || typeof value === 'number') return createText(String(value))\n if (isVobsFragment(value) || isHostNode(value)) return value as VobsNode\n if (Array.isArray(value)) {\n const children = value\n if (children.length === 0) return null\n return createFragment((parent, anchor) => {\n for (const child of children) {\n const node = normalizeDynamicChild(child)\n if (node) insertBefore(parent, node, anchor)\n }\n })\n }\n return null\n}\n\nfunction isHostNode(value: unknown): value is Node {\n return Boolean(value && typeof value === 'object'\n && ('nodeType' in value || ((value as { type?: unknown }).type === 'element'\n || (value as { type?: unknown }).type === 'text'\n || (value as { type?: unknown }).type === 'comment')))\n}\n\nexport function insertList<T>(\n parent: Node,\n anchor: Node | null,\n source: () => readonly T[],\n renderItem: (item: T, index: number) => VobsNode,\n keyOf?: (item: T, index: number) => unknown\n): void {\n const marker = createComment('vobs:list')\n insertBefore(parent, marker, anchor)\n let entries: Array<ListEntry<T>> = []\n const tracksIndex = renderItem.length >= 2\n\n effect(() => {\n const items = source()\n\n // key 只计算一次:keyed 判定与调和共用,避免 keyOf 每轮被调用两遍。\n let keys: unknown[] | null = null\n if (keyOf) {\n keys = new Array(items.length)\n let allKeyed = items.length > 0\n for (let index = 0; index < items.length; index++) {\n const key = keyOf(items[index], index)\n if (key == null) {\n allKeyed = false\n break\n }\n keys[index] = key\n }\n if (!allKeyed) keys = null\n }\n\n /*\n * 快路径:key 序列与上一轮**逐位相同** —— 行一个不多、一个不少、顺序也没变。\n *\n * 此时 DOM 已经是正确顺序(每次更新末尾的重排保证了「DOM 顺序 === entries 顺序」),\n * 于是建表(Map)、查重(Set)、差集(retained Set)、重排(seq 数组 + LIS)**全都不需要**,\n * 只同步每行的 item 与 index。这些记账是逐行的,200 行一次的固定成本实测约 34µs,\n * 而这一轮真正需要做的 DOM 写只有 0.2µs(见 scripts/bench)。\n *\n * 扫描本身是 O(n) 的两次比较(key 与是否需重建),比省掉的记账便宜一个数量级。\n * 任何一行需要重建(原始类型项的值变了 —— 那种行的视图是静态捕获的)就退回常规路径。\n */\n if (keys !== null && entries.length === items.length) {\n let fast = true\n for (let index = 0; index < keys.length; index++) {\n if (!Object.is(entries[index].key, keys[index])) {\n fast = false\n break\n }\n const item = items[index]\n if (isPrimitiveItem(item) && !Object.is(entries[index].current, item)) {\n fast = false\n break\n }\n }\n if (fast) {\n for (let index = 0; index < items.length; index++) {\n const entry = entries[index]\n entry.index = index\n const item = items[index]\n if (!Object.is(entry.current, item)) {\n // item 信号写入在值相同时会被 Object.is 短路,所以这里只对真正变了的行动手\n entry.item.value = item\n entry.current = item\n }\n }\n return\n }\n }\n\n const nextEntries = keys\n ? reconcileKeyed(items, keys, entries, renderItem)\n : reconcileIndexed(items, entries, renderItem)\n\n // tracksIndex 时 index 参与渲染,位置变化的行必须整体重建,新节点不在 DOM 中,\n // 重排阶段强制插入;否则只同步记录的位置,节点保持原样交给重排阶段移动。\n const refreshed = tracksIndex ? new Set<ListEntry<T>>() : null\n for (let index = 0; index < nextEntries.length; index++) {\n const entry = nextEntries[index]\n if (tracksIndex) {\n if (entry.index !== index) {\n refreshListEntry(parent, entry, index, renderItem)\n refreshed!.add(entry)\n }\n } else {\n entry.index = index\n }\n }\n\n const retained = new Set(nextEntries)\n for (const entry of entries) {\n if (!retained.has(entry)) disposeEntry(parent, entry)\n }\n\n reorderListEntries(parent, marker, entries, nextEntries, refreshed)\n entries = nextEntries\n })\n}\n\n/**\n * 按 nextEntries 顺序整理 DOM,但只移动必须移动的节点。\n */\nfunction reorderListEntries<T>(\n parent: Node,\n marker: Node,\n previous: readonly ListEntry<T>[],\n nextEntries: readonly ListEntry<T>[],\n forceInsert: Set<ListEntry<T>> | null\n): void {\n const count = nextEntries.length\n if (count === 0) return\n\n // 首次挂载(旧列表为空):全部是新节点,倒序直插即可,跳过 Map/LIS 构建。\n if (previous.length === 0) {\n let reference: VobsNode = marker\n for (let index = count - 1; index >= 0; index--) {\n const node = nextEntries[index].node\n insertBefore(parent, node, reference)\n reference = node\n }\n return\n }\n\n const oldIndexOf = new Map<ListEntry<T>, number>()\n for (let index = 0; index < previous.length; index++) oldIndexOf.set(previous[index], index)\n\n // seq[i] = 条目在旧序中的位置;新条目、重建条目与强制插入条目为 -1。\n const seq: number[] = new Array(count)\n for (let index = 0; index < count; index++) {\n const entry = nextEntries[index]\n seq[index] = forceInsert?.has(entry) ? -1 : oldIndexOf.get(entry) ?? -1\n }\n\n const keep = computeKeptByLis(seq)\n\n let reference: VobsNode = marker\n for (let index = count - 1; index >= 0; index--) {\n const node = nextEntries[index].node\n if (keep[index]) {\n reference = node\n continue\n }\n insertBefore(parent, node, reference)\n reference = node\n }\n}\n\n/**\n * 严格递增子序列(LIS)成员标记,O(n log n)。\n * 负值(新节点)不参与 LIS,永远视为需要移动。\n */\nfunction computeKeptByLis(seq: readonly number[]): boolean[] {\n const count = seq.length\n const keep = new Array<boolean>(count).fill(false)\n const tailsIndex: number[] = []\n const tailsValue: number[] = []\n const prev = new Array<number>(count).fill(-1)\n\n for (let i = 0; i < count; i++) {\n const value = seq[i]\n if (value < 0) continue\n let lo = 0\n let hi = tailsValue.length\n while (lo < hi) {\n const mid = (lo + hi) >> 1\n if (tailsValue[mid] < value) lo = mid + 1\n else hi = mid\n }\n if (lo === tailsValue.length) {\n tailsValue.push(value)\n tailsIndex.push(i)\n } else {\n tailsValue[lo] = value\n tailsIndex[lo] = i\n }\n prev[i] = lo > 0 ? tailsIndex[lo - 1] : -1\n }\n\n let cursor = tailsIndex.length > 0 ? tailsIndex[tailsIndex.length - 1] : -1\n while (cursor >= 0) {\n keep[cursor] = true\n cursor = prev[cursor]\n }\n return keep\n}\n\nfunction reconcileKeyed<T>(\n items: readonly T[],\n keys: readonly unknown[],\n entries: Array<ListEntry<T>>,\n renderItem: (item: T, index: number) => VobsNode\n): Array<ListEntry<T>> {\n // 逐项建表,不用 entries.map(...):后者会先造一个等长的「键值对数组」中间产物,\n // 200 行就是 200 个元组对象的分配 —— 每次更新都白付一次。\n const previous = new Map<unknown, ListEntry<T>>()\n for (const entry of entries) previous.set(entry.key, entry)\n const seen = new Set<unknown>()\n const nextEntries: Array<ListEntry<T>> = []\n\n for (let index = 0; index < items.length; index++) {\n const item = items[index]\n const key = keys[index]\n if (seen.has(key)) {\n console.warn(`Vobs: 检测到重复的列表 key: ${String(key)}`)\n }\n seen.add(key)\n const entry = previous.get(key)\n if (entry) {\n previous.delete(key)\n if (isPrimitiveItem(item) && !Object.is(entry.current, item)) {\n // 原始类型项在编译产物中被静态捕获,无法通过 item 信号刷新视图:值变化时必须重建行。\n nextEntries.push(createListEntry(item, index, key, renderItem))\n continue\n }\n entry.item.value = item\n entry.current = item\n nextEntries.push(entry)\n continue\n }\n nextEntries.push(createListEntry(item, index, key, renderItem))\n }\n\n return nextEntries\n}\n\nfunction reconcileIndexed<T>(\n items: readonly T[],\n entries: Array<ListEntry<T>>,\n renderItem: (item: T, index: number) => VobsNode\n): Array<ListEntry<T>> {\n const nextEntries: Array<ListEntry<T>> = []\n for (let index = 0; index < items.length; index++) {\n const item = items[index]\n const entry = entries[index]\n if (entry && isPrimitiveItem(item) && !Object.is(entry.current, item)) {\n // 原始类型项被编译产物静态捕获,值变化时必须重建行;旧行由主循环统一 dispose。\n nextEntries.push(createListEntry(item, index, index, renderItem))\n continue\n }\n if (entry) {\n entry.item.value = item\n entry.current = item\n nextEntries.push(entry)\n continue\n }\n nextEntries.push(createListEntry(item, index, index, renderItem))\n }\n return nextEntries\n}\n\n/** 原始类型(含 function)无法被 Proxy 响应化,只能整行重建。 */\nfunction isPrimitiveItem(item: unknown): boolean {\n return item === null || typeof item !== 'object'\n}\n\nfunction createListEntry<T>(\n item: T,\n index: number,\n key: unknown,\n renderItem: (item: T, index: number) => VobsNode\n): ListEntry<T> {\n const owner = createOwner()\n let itemSignal!: Signal<T>\n let viewOwner!: Owner\n let node!: VobsNode\n owner.run(() => {\n itemSignal = state(item)\n viewOwner = createOwner()\n node = viewOwner.run(() => renderItem(toReactiveItem(itemSignal, item), index))\n })\n associateNodeOwner(node, viewOwner)\n return { key, node, owner, viewOwner, item: itemSignal, current: item, index }\n}\n\nfunction refreshListEntry<T>(\n parent: Node,\n entry: ListEntry<T>,\n index: number,\n renderItem: (item: T, index: number) => VobsNode\n): void {\n removeChild(parent, entry.node)\n entry.index = index\n const previousView = entry.viewOwner\n entry.owner.run(() => {\n entry.viewOwner = createOwner()\n entry.node = entry.viewOwner.run(() => renderItem(\n toReactiveItem(entry.item, entry.current),\n index\n ))\n })\n // 旧视图的 effect 仍订阅着 item 信号,必须 dispose,否则会写已脱离的 DOM(幽灵更新)。\n previousView.dispose()\n associateNodeOwner(entry.node, entry.viewOwner)\n}\n\nfunction toReactiveItem<T>(item: Signal<T>, initialValue: T): T {\n if (typeof initialValue !== 'object' || initialValue === null) {\n return initialValue\n }\n\n // 属性读取转发到 item.value(顶替后的新条目),由 get 陷阱完成追踪;目标见 reactiveProxyTarget。\n return new Proxy(reactiveProxyTarget(initialValue), {\n get(_target, property, receiver) {\n return Reflect.get(item.value as object, property, receiver)\n },\n has(_target, property) {\n return property in (item.value as object)\n },\n ownKeys() {\n return Reflect.ownKeys(item.value as object)\n },\n getOwnPropertyDescriptor(target, property) {\n const descriptor = Object.getOwnPropertyDescriptor(item.value as object, property)\n if (!descriptor) return undefined\n // 目标上已有的自有属性不能改报\"可配置性\"(数组的 length 就不可配置),否则违反不变量\n const own = Object.getOwnPropertyDescriptor(target, property)\n return { ...descriptor, configurable: own ? own.configurable : true }\n }\n }) as T\n}\n\n/**\n * 选择代理目标。\n *\n * 目标**不能**带\"不可配置\"的自有属性:代理把属性读取转发到 `item.value`(同 key 顶替后的\n * 新条目),而 Proxy 不变量要求 get / getOwnPropertyDescriptor / ownKeys 与目标一致。实测\n * `Object.freeze` 过的条目(@vobs/notification 每条通知都冻结)直接抛:\n *\n * TypeError: 'get' on proxy: property 'content' is a read-only and non-configurable data\n * property on the proxy target but the proxy did not return its actual value\n *\n * 于是\"冻结条目的行原地刷新\"这条路径根本不可能成立(首轮渲染恰好同值,把问题掩盖了)。\n *\n * 安全的条目(可扩展 + 自有属性全部可配置:普通字面量、DOM 包装器等)照旧用条目自身当目标 ——\n * jsdom 会把 sameObjectCaches 之类的 Symbol 缓存写在包装器上,写与读必须落在同一个对象上,\n * 换目标会让 `element.classList` 直接抛 TypeError。冻结/密封/defineProperty 过的条目改用\n * 同原型的空对象(数组用空数组,保住 Array.isArray)。\n */\nfunction reactiveProxyTarget(value: object): object {\n if (Object.isExtensible(value)) {\n let allConfigurable = true\n for (const key of Reflect.ownKeys(value)) {\n if (Object.getOwnPropertyDescriptor(value, key)?.configurable === false) {\n allConfigurable = false\n break\n }\n }\n if (allConfigurable) return value\n }\n return Array.isArray(value) ? [] : Object.create(Object.getPrototypeOf(value) as object | null)\n}\n\nfunction disposeEntry(parent: Node, entry: ListEntry<unknown>): void {\n removeChild(parent, entry.node)\n entry.owner.dispose()\n}\n","// 编译器静态模板提升的运行时支撑:\n// 编译期把完全静态的 JSX 子树序列化为 HTML 字符串,模块加载时解析一次,\n// 运行时通过 cloneNode 复制,替代逐个 createElement + setStaticProps + insertBefore。\n// 仅适用于 DOM 渲染器(模板本质是 HTML),自定义渲染器场景由编译产物不使用该优化兜底。\n\nconst templateCache = new Map<string, HTMLTemplateElement>()\n\n/** Parse a static template once; called at module load for each hoisted template. */\nexport function createTemplate(html: string): HTMLTemplateElement {\n let template = templateCache.get(html)\n if (!template) {\n template = document.createElement('template')\n template.innerHTML = html\n templateCache.set(html, template)\n }\n return template\n}\n\n/** Clone a hoisted template for one mount; the compiled HTML always has a single root element. */\nexport function cloneTemplate(template: HTMLTemplateElement): Node {\n const root = template.content.firstElementChild\n if (!root) throw new Error('Vobs: 静态模板缺少根元素,请检查编译产物')\n return root.cloneNode(true)\n}\n","import { createOwner, state } from '@vobs/reactivity'\nimport { getRuntimeDebugHooks, invokeRuntimeDebug, type RuntimeErrorEvent } from './debug'\nimport { insertDynamic, type NodeFactory } from './dynamic'\nimport { formatVobsError, normalizeVobsError } from './error'\n\nexport type BoundaryRetry = () => void | Promise<unknown>\nexport type BoundaryFallback = (error: Error, retry: BoundaryRetry) => ReturnType<NodeFactory>\n\n/**\n * 边界捕获到的错误必须有人看得见。\n *\n * 原来只调 `invokeRuntimeDebug('error', …)` —— 没装 DevTools(也就没有 error 钩子)时\n * 控制台**一个字都不输出**:错误被替换成 fallback,现场再无痕迹。这是排查成本最高的一种\n * 静默。装了钩子就交给它(避免重复输出),没装就打到控制台。\n *\n * @param loud 只有「真的吞下了错误」才需要吵;retrying / recovered 属于信息,不进控制台。\n */\nfunction reportBoundaryError(event: RuntimeErrorEvent, loud: boolean): void {\n invokeRuntimeDebug('error', event)\n if (loud && getRuntimeDebugHooks()?.error === undefined) {\n console.error(formatVobsError(event.error, { includeStack: true }))\n }\n}\n\nexport interface BoundaryOptions {\n children: NodeFactory\n fallback: BoundaryFallback\n onRetry?: () => void | Promise<unknown>\n resetKey?: () => unknown\n}\n\n/**\n * Shared no-wrapper boundary protocol. The boundary owns its reactive error\n * state and child branch, so replacing the branch also disposes its Owner.\n */\nexport function insertBoundary(\n parent: Node,\n anchor: Node | null,\n options: BoundaryOptions\n): void {\n const boundary = createOwner()\n boundary.run(() => {\n const error = state<Error | null>(null)\n let fallbackActive = false\n let lastError: Error | null = null\n let initialized = false\n let previousKey: unknown\n\n boundary.onError(reason => {\n if (fallbackActive) throw reason\n const normalized = normalizeVobsError(reason, {\n code: 'VOBS_R001',\n layer: 'runtime',\n fix: '检查组件渲染逻辑,或在边界 fallback 中提供恢复操作。'\n })\n lastError = normalized\n reportBoundaryError({\n error: normalized,\n owner: boundary,\n phase: 'boundary',\n handled: true,\n recovery: 'fallback'\n }, true)\n error.value = normalized\n })\n\n const retry = (): void | Promise<unknown> => {\n if (error.value) {\n reportBoundaryError({\n error: error.value,\n owner: boundary,\n phase: 'boundary',\n handled: true,\n recovery: 'retrying'\n }, false)\n }\n error.value = null\n return options.onRetry?.()\n }\n\n insertDynamic(parent, anchor, () => {\n const nextKey = options.resetKey?.()\n if (!initialized || !Object.is(previousKey, nextKey)) {\n initialized = true\n previousKey = nextKey\n if (error.value) error.value = null\n }\n\n const currentError = error.value\n if (!currentError) {\n if (fallbackActive && lastError) {\n reportBoundaryError({\n error: lastError,\n owner: boundary,\n phase: 'boundary',\n handled: true,\n recovery: 'recovered'\n }, false)\n lastError = null\n }\n fallbackActive = false\n return options.children()\n }\n\n fallbackActive = true\n return options.fallback(currentError, retry)\n })\n })\n}\n","import { createFragment, type VobsNode } from './fragment'\nimport { insertBoundary, type BoundaryRetry } from './boundary'\nimport type { NodeFactory } from './dynamic'\n\nexport type ErrorBoundaryFallback = (\n error: Error,\n retry: BoundaryRetry\n) => ReturnType<NodeFactory>\n\n/**\n * 子节点双形态:JSX 属性经编译器编译为惰性 getter(工厂),手写对象字面量可直接传节点。\n */\nexport type ErrorBoundaryChildren = NodeFactory | VobsNode\n\nexport interface ErrorBoundaryOptions {\n children: ErrorBoundaryChildren\n fallback: ErrorBoundaryFallback\n}\n\nexport interface ErrorBoundaryProps {\n children: ErrorBoundaryChildren\n fallback: ErrorBoundaryFallback\n}\n\n/** Normalize child sources to the lazy factory shape insertBoundary expects. */\nfunction resolveBoundaryChildren(children: ErrorBoundaryChildren): NodeFactory {\n return typeof children === 'function' ? children : () => children\n}\n\n/**\n * Inserts an error boundary without adding a wrapper node. It captures errors\n * from its child render branch and child-owned effects, then renders fallback.\n */\nexport function insertErrorBoundary(\n parent: Node,\n anchor: Node | null,\n options: ErrorBoundaryOptions\n): void {\n insertBoundary(parent, anchor, { ...options, children: resolveBoundaryChildren(options.children) })\n}\n\n/** Component-shaped API backed by the same no-wrapper host instruction. */\nexport function ErrorBoundary(props: ErrorBoundaryProps): VobsNode {\n return createFragment((parent, anchor) => insertErrorBoundary(parent, anchor, props))\n}\n","import { createOwner, state } from '@vobs/reactivity'\nimport { insertDynamic, type NodeFactory } from './dynamic'\nimport { createFragment, type VobsNode } from './fragment'\n\nexport type AsyncBoundaryView = ReturnType<NodeFactory> | NodeFactory\nexport type AsyncBoundaryFallback = (error: Error, retry: () => void) => ReturnType<NodeFactory>\nexport interface AsyncBoundaryOptions<T> {\n promise: PromiseLike<T> | (() => PromiseLike<T>)\n children: (value: T) => ReturnType<NodeFactory>\n loading?: AsyncBoundaryView\n fallback?: AsyncBoundaryFallback\n resetKey?: () => unknown\n}\nexport interface AsyncBoundaryProps<T> extends AsyncBoundaryOptions<T> {}\n\nexport function insertAsyncBoundary<T>(parent: Node, anchor: Node | null, options: AsyncBoundaryOptions<T>): void {\n const boundary = createOwner()\n boundary.run(() => {\n const loading = state(true)\n const data = state<T | undefined>(undefined)\n const resolved = state(false)\n const error = state<Error | null>(null)\n let token = 0\n let previousKey: unknown\n let initialized = false\n let fallbackActive = false\n boundary.onError(reason => {\n if (fallbackActive) throw reason\n error.value = normalizeError(reason)\n loading.value = false\n })\n\n const start = (): void => {\n const current = ++token\n loading.value = true\n error.value = null\n data.value = undefined\n resolved.value = false\n let promise: PromiseLike<T>\n try {\n promise = typeof options.promise === 'function' ? options.promise() : options.promise\n } catch (reason) {\n if (current === token) {\n loading.value = false\n error.value = normalizeError(reason)\n }\n return\n }\n Promise.resolve(promise).then(value => {\n if (current !== token || boundary.disposed) return\n data.value = value\n resolved.value = true\n loading.value = false\n }, reason => {\n if (current !== token || boundary.disposed) return\n error.value = normalizeError(reason)\n loading.value = false\n })\n }\n\n const retry = (): void => start()\n start()\n insertDynamic(parent, anchor, () => {\n const key = options.resetKey?.()\n if (!initialized) {\n initialized = true\n previousKey = key\n } else if (!Object.is(previousKey, key)) {\n previousKey = key\n start()\n }\n if (loading.value) {\n fallbackActive = false\n return resolveView(options.loading)\n }\n if (error.value) {\n fallbackActive = true\n return options.fallback?.(error.value, retry) ?? null\n }\n fallbackActive = false\n return resolved.value ? options.children(data.value as T) : resolveView(options.loading)\n })\n })\n}\n\nexport function AsyncBoundary<T>(props: AsyncBoundaryProps<T>): VobsNode {\n return createFragment((parent, anchor) => insertAsyncBoundary(parent, anchor, props))\n}\n\nfunction resolveView(view: AsyncBoundaryView | undefined): ReturnType<NodeFactory> {\n if (!view) return null\n return typeof view === 'function' ? view() : view\n}\n\nfunction normalizeError(reason: unknown): Error {\n return reason instanceof Error ? reason : new Error(String(reason))\n}\n","import { createFragment } from './fragment'\nimport { insertDynamic, type NodeFactory } from './dynamic'\nimport type { VobsNode } from './fragment'\nimport { createOwner } from '@vobs/reactivity'\n\nexport interface ProfilerRenderInfo {\n readonly id: string\n readonly phase: 'mount' | 'update'\n readonly duration: number\n readonly timestamp: number\n}\nexport interface ProfilerOptions {\n id: string\n children: NodeFactory\n onRender?: (info: ProfilerRenderInfo) => void\n}\nexport interface ProfilerProps extends ProfilerOptions {}\n\nexport function insertProfiler(parent: Node, anchor: Node | null, options: ProfilerOptions): void {\n const profiler = createOwner()\n let mounted = false\n profiler.run(() => {\n insertDynamic(parent, anchor, () => {\n const started = now()\n const value = options.children()\n const info: ProfilerRenderInfo = {\n id: options.id,\n phase: mounted ? 'update' : 'mount',\n duration: Math.max(0, now() - started),\n timestamp: Date.now()\n }\n mounted = true\n try { options.onRender?.(info) } catch { /* profiler callbacks are isolated */ }\n return value\n })\n })\n}\n\nexport function Profiler(props: ProfilerProps): VobsNode {\n return createFragment((parent, anchor) => insertProfiler(parent, anchor, props))\n}\n\nfunction now(): number {\n return typeof performance !== 'undefined' && typeof performance.now === 'function' ? performance.now() : Date.now()\n}\n","import { effect } from '@vobs/reactivity'\nimport { isVobsFragment, type VobsNode } from './fragment'\nimport { removeAttribute, setAttribute, setProperty } from './ops'\n\nexport interface ShowProps {\n /**\n * 条件。要响应式就传 getter / 信号读取表达式\n * (编译器会把动态 props 自动转成 getter,所以 JSX 里写 `when={open.value}` 即可)。\n */\n readonly when: unknown\n /**\n * 要显示的内容。**必须是单个元素**(`<div>` / `<input>` / 组件返回的元素都行)——\n * 因为\"保留挂载 + 切可见性\"必须有一个宿主元素来挂 `hidden`/`inert`,\n * 而框架**不会替你插包裹层**(包裹层会改变 flex/grid 布局,是更隐蔽的坑)。\n */\n readonly children?: VobsNode | (() => VobsNode | null | undefined)\n /** 隐藏时额外挂上的类名(可选)。默认只用 `hidden` + `inert`。 */\n readonly hiddenClass?: string\n}\n\n/**\n * 条件显示,**保留子树挂载状态**(不重建)。\n *\n * ## 为什么需要它(外部踩坑文档 C 条,★★)\n *\n * `insertDynamic` 按引用比较(`next === current`):条件表达式一变化就**重建子树**。\n * 后果是条件分支里的输入控件**每敲一个字符就丢焦点**、滚动位置与内部状态全丢。\n *\n * 文档给出的对策是「固定渲染 + 响应式 class 显隐」,但那是**人肉纪律** ——\n * 每个页面都要记得这么写。`Show` 把它变成一行:\n *\n * ```tsx\n * <Show when={open.value} hiddenClass=\"is-hidden\">\n * <input /> {/* 条件怎么变,这个 input 都不会被重建,焦点与状态保持 *\\/}\n * </Show>\n * ```\n *\n * 与 `{cond ? <A/> : <B/>}` 的分工:\n * - 要**保留状态**(输入框、滚动位置、内部子系统)→ 用 `Show`\n * - 要**真正卸载**(省内存、必须销毁副作用)→ 用 JSX 条件表达式(编译期生成条件工厂)\n *\n * ## 隐藏时同时挂 `inert`\n *\n * 只设 `hidden` 在部分场景下元素仍可被 Tab 到(详见 `@vobs/layout` 的同类处理)。\n * `inert` 把子树移出**焦点顺序与无障碍树**。旧浏览器不支持时 `inert=\"\"` 只是个\n * 无害的未知属性,`hidden` 仍在兜底。\n *\n * ## 边界\n *\n * 子节点不是单个元素(文本 / fragment / 多个节点)时**抛出并说明原因** ——\n * 不静默退化成\"卸载\"(那会让用户以为状态保住了,实际每变化一次就重建,\n * 正是 C 条那个 bug 的形态)。需要保留状态就请把内容包在一个元素里。\n */\nexport function Show(props: ShowProps): VobsNode {\n /*\n * 用 `unknown` 承接再判空:`props.children` 的声明类型不含 `false`,\n * 但运行时 `cond && <X/>` 这类写法确实会给出 `false` ——\n * 直接比较会被 TS 判成\"类型不可达\"(与 `createComponent` 同一处坑)。\n */\n const resolved: unknown = typeof props.children === 'function' ? props.children() : props.children\n if (resolved === null || resolved === undefined || resolved === false) {\n throw new Error('Vobs Show: children 不能为空 —— 它需要一个宿主元素来挂 hidden/inert。')\n }\n const node = resolved as VobsNode\n if (isVobsFragment(node) || (node as Element).nodeType !== 1) {\n throw new Error(\n 'Vobs Show: children 必须是单个元素。'\n + '「保留挂载 + 切可见性」需要宿主元素,而框架不会替你插包裹层(会改布局)。'\n + '请把内容包进一个元素,例如 <Show when={…}><div>…</div></Show>;'\n + '若确实需要卸载语义,请改用 JSX 条件表达式 {cond ? <A/> : <B/>}。'\n )\n }\n const element = node as Element\n\n effect(() => {\n const visible = Boolean(readMaybeGetter(props.when))\n /*\n * 可见性切换只碰这三个东西:`hidden`、`inert`、可选类名。\n * 不读任何信号(`when` 的读取在 effect 内、由调用方提供的 getter 完成),\n * 所以不会自我订阅。\n */\n setProperty(element, 'hidden', !visible)\n if (visible) removeAttribute(element, 'inert')\n else setAttribute(element, 'inert', '')\n if (props.hiddenClass !== undefined) applyExtraClass(element, props.hiddenClass, !visible)\n })\n\n return element\n}\n\nfunction readMaybeGetter<T>(value: T | (() => T)): T {\n return typeof value === 'function' ? (value as () => T)() : value\n}\n\n/** 按需增删一个类名(不影响作者写在 `class` 里的其它类)。 */\nfunction applyExtraClass(element: Element, className: string, on: boolean): void {\n const names = element.getAttribute('class')?.split(/\\s+/u).filter(Boolean) ?? []\n if (on) {\n if (names.includes(className)) return\n setAttribute(element, 'class', [...names, className].join(' '))\n return\n }\n if (!names.includes(className)) return\n setAttribute(element, 'class', names.filter(name => name !== className).join(' '))\n}\n\nexport { readMaybeGetter }\n","import { getCurrentOwner, state } from '@vobs/reactivity'\nimport { insertDynamic } from './dynamic'\nimport { createFragment, type VobsNode } from './fragment'\n\nexport interface ClientOnlyProps {\n /** 只在客户端渲染的内容。 */\n readonly children?: VobsNode | (() => VobsNode | null | undefined)\n /** 服务端(以及水合首轮)渲染的占位。 */\n readonly fallback?: VobsNode | (() => VobsNode | null | undefined)\n}\n\n/**\n * `<ClientOnly>` —— 只在客户端渲染的子树。\n *\n * 补的是外部踩坑文档 D 条的后一半:`onMount`(`39c155b`)管**副作用**\n * (定时器 / matchMedia / localStorage),`ClientOnly` 管**渲染** ——\n * 某些子树在服务端根本渲染不出来(依赖 `window`、第三方 widget、需要真实布局测量)。\n *\n * ## 为什么必须是**两阶段**(这是这个组件唯一需要想清楚的地方)\n *\n * 朴素实现是\"服务端渲染空、客户端渲染 children\" —— **那会造成水合不匹配**:\n * 服务端产物里没有那棵子树,客户端却期望认领它(本仓库严格水合会报 `missing-node`,\n * 非严格模式也会静默重建,表现为内容闪烁)。\n *\n * 所以这里:\n * 1. **首轮**:服务端与客户端**都**渲染 `fallback`(默认什么都不渲染)—— 对得上\n * 2. **挂载之后**(微任务):翻成\"已就绪\",`insertDynamic` 换入 `children`\n *\n * ## 父节点从哪来\n *\n * 用 `createFragment` —— 它的工厂签名是 `(parent, anchor) => void`,\n * **框架在挂载时把父节点与锚点交进来**,于是可以直接用 `insertDynamic` 换内容,\n * 不需要包裹元素(包裹层会改 flex/grid 布局)。\n *\n * ## 边界(如实说明)\n *\n * 客户端判定用的是 `typeof document === 'undefined'`,与 `onMount`(`39c155b`)\n * 以及 `@vobs/ssr` 的 `prerender.ts` **同一套判据**。其已知局限也一样:\n * **在 jsdom 这类带 DOM 的环境里做预渲染时会被判成客户端**(框架目前没有\"正在预渲染\"标志)。\n * 那种环境下 `ClientOnly` 的首轮会渲染 `fallback`、微任务里再换成 `children`,\n * 水合仍然是对得上的(两侧首轮一致),只是\"跳过客户端渲染\"这件事没生效。\n */\nexport function ClientOnly(props: ClientOnlyProps = {}): VobsNode {\n return createFragment((parent, anchor) => {\n const ready = state(false)\n /*\n * 只有存在 `document` 才排这个微任务 —— Node 端预渲染时不应留下会稍后执行的副作用\n * (那会让\"服务端渲染\"在 renderToString 返回之后还动到已完成的输出)。\n */\n if (typeof document !== 'undefined') {\n const owner = getCurrentOwner()\n queueMicrotask(() => {\n // 组件在这之前被卸载 → 不再翻转(与 onMount 同一防御)\n if (owner?.disposed) return\n ready.value = true\n })\n }\n insertDynamic(parent, anchor, () => {\n const slot = ready.value ? props.children : props.fallback\n // 用 unknown 承接:声明类型不含 false,但 `cond && <X/>` 会给出 false\n const value: unknown = typeof slot === 'function' ? slot() : slot\n return value === undefined || value === null || value === false ? null : (value as VobsNode)\n })\n })\n}\n"],"mappings":"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","names":["getCurrentOwner","getCurrentOwner","state","getCurrentOwner","getCurrentOwner","effect","effect","createOwner","effect","effect","createOwner","reference","createOwner","state","createOwner","state","createOwner","state","createOwner","state","createOwner","createOwner","effect","effect","getCurrentOwner","state","state","getCurrentOwner"]}