bobe-dom 0.0.72 → 0.0.73

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.
@@ -1 +1 @@
1
- {"version":3,"file":"bobe-dom.cjs","sources":["../src/render.ts","../src/render-hydrate.ts"],"sourcesContent":["import { customRender, Interpreter } from 'bobe';\n\nexport const BOOLEAN_ATTRS = new Set([\n 'disabled', 'readonly', 'checked', 'selected', 'hidden',\n 'multiple', 'required', 'autofocus', 'autoplay', 'controls',\n 'loop', 'muted', 'defer', 'async', 'reversed', 'open',\n 'itemscope', 'ismap', 'nohref', 'noshade', 'nowrap', 'compact', 'default'\n]);\n\nconst VALUE_PROP_TAGS = new Set(['INPUT', 'TEXTAREA', 'SELECT']);\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst MATH_NS = 'http://www.w3.org/1998/Math/MathML';\n\nconst SVG_TAGS = new Set([\n 'svg', 'animate', 'animateMotion', 'animateTransform', 'circle', 'clipPath',\n 'defs', 'desc', 'ellipse', 'feBlend', 'feColorMatrix', 'feComponentTransfer',\n 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap',\n 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG',\n 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology',\n 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile',\n 'feTurbulence', 'filter', 'foreignObject', 'g', 'image', 'line', 'linearGradient',\n 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline',\n 'radialGradient', 'rect', 'set', 'stop', 'switch', 'symbol', 'textPath',\n 'tspan', 'use', 'view'\n]);\n\nconst MATH_TAGS = new Set([\n 'math', 'maction', 'maligngroup', 'malignmark', 'menclose', 'merror',\n 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mlongdiv', 'mmultiscripts',\n 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mscarries',\n 'mscarry', 'msgroup', 'mstack', 'mspace', 'msqrt', 'msrow', 'mstyle', 'msub',\n 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover',\n 'semantics', 'annotation', 'annotation-xml'\n]);\n\nconst isNS = (el: Element) => el.namespaceURI === SVG_NS || el.namespaceURI === MATH_NS;\n\n// ---- exported for unit testing ----\n\nexport function createNode(this: Interpreter, name: string): Node {\n const doc = this.root?.ownerDocument || document;\n if (name === 'text') return doc.createTextNode('');\n if (MATH_TAGS.has(name)) return doc.createElementNS(MATH_NS, name);\n if (SVG_TAGS.has(name)) return doc.createElementNS(SVG_NS, name);\n return doc.createElement(name);\n};\n\nexport const CONTENT_FLAG = Symbol('hasContent');\n\nexport function setProp(node: Node, key: string, value: any): (() => void) | undefined {\n const el = node as HTMLElement;\n\n // 0. children\n if (key === 'children') {\n (node as any)[CONTENT_FLAG] = value != null;\n if (value == null) return;\n node.textContent = value;\n return;\n }\n\n // 1. 事件\n if (key.startsWith('on')) {\n const evtName = key.slice(2);\n node.addEventListener(evtName, value);\n return () => node.removeEventListener(evtName, value);\n }\n\n // 2. class\n if (key.startsWith('.')) {\n el.classList.toggle(key.slice(1), !!value);\n return;\n }\n\n if (key.startsWith('#')) {\n if (value) el.id = key.slice(1);\n else el.removeAttribute('id');\n return;\n }\n\n if (key === 'class') {\n if (value == null) {\n el.className = '';\n } else if (typeof value === 'object' && !Array.isArray(value)) {\n if (isNS(el)) {\n const names = Object.entries(value as Record<string, any>)\n .filter(([, v]) => !!v)\n .map(([k]) => k)\n .join(' ');\n el.setAttribute('class', names);\n } else {\n for (const k in value) {\n el.classList.toggle(k, !!(value as Record<string, any>)[k]);\n }\n }\n } else {\n const str = typeof value === 'boolean' ? (value ? 'true' : '') : String(value);\n if (isNS(el)) {\n el.setAttribute('class', str);\n } else {\n el.className = str;\n }\n }\n return;\n }\n\n // 3. style\n if (key === 'style') {\n if (value == null) {\n el.style.cssText = '';\n } else {\n el.style.cssText = String(value);\n }\n return;\n }\n\n // 4. html\n if (key === 'html') {\n (node as any)[CONTENT_FLAG] = value != null;\n if (value == null) return;\n (node as Element).innerHTML = String(value);\n return;\n }\n\n // 5. 布尔属性\n if (BOOLEAN_ATTRS.has(key)) {\n if (value === false || value === null || value === undefined) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, '');\n }\n return;\n }\n\n // 6. input/textarea/select value & checked\n if ((key === 'value' || key === 'checked') && VALUE_PROP_TAGS.has(el.tagName)) {\n (el as any)[key] = value;\n return;\n }\n\n // 7. SVG/MathML 元素\n if (isNS(el)) {\n if (value == null) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, String(value));\n }\n return;\n }\n\n // 8. data-* / aria-*\n if (key.startsWith('data-') || key.startsWith('aria-')) {\n if (value == null) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, String(value));\n }\n return;\n }\n\n // 9. 其余属性\n if (value == null) {\n el.removeAttribute(key);\n } else if (key in el) {\n (el as any)[key] = value;\n } else {\n el.setAttribute(key, String(value));\n }\n};\n\nexport function insertAfter(parent: Node, node: Node, prev: Node | null) {\n if (!prev) parent.insertBefore(node, parent.firstChild);\n else parent.insertBefore(node, prev.nextSibling);\n};\n\nexport function createAnchor(name: string) { \n const doc = this.root?.ownerDocument || document;\n return doc.createComment(name); \n}\n\nexport function remove(node: Node) { (node as Element).remove(); };\n\nexport function firstChild(node: Node) {return node.firstChild};\n\nexport function nextSib(node: Node) {return node.nextSibling;}\n\nexport function beforeIndent(node: Node): boolean | void {\n if ((node as any)[CONTENT_FLAG]) {\n const tag = (node as Element).tagName?.toLowerCase();\n const hasText = (node as HTMLElement).textContent != null;\n console.warn(`<${tag}> has ${hasText ? 'text' : 'html'} content and child elements — children ignored`);\n return false;\n }\n};\n\nexport const render = customRender({\n createNode,\n setProp,\n insertAfter,\n createAnchor,\n remove,\n firstChild,\n nextSib,\n beforeIndent\n});\n","import { customRender, Interpreter, Store } from 'bobe';\nimport {\n setProp as browserSetProp,\n createNode as browserCreateNode,\n remove,\n firstChild,\n nextSib,\n CONTENT_FLAG\n} from './render';\n\n// ====== TreeCursor ======\n\n/**\n * SSR DOM 认领游标。\n *\n * 工作方式:\n * - 维护一个 `parent` 指针,始终指向\"当前容器\"。\n * - `findUnclaimed` 只在 `parent.firstChild` 中平铺搜索(只搜一层,不递归)。\n * - 认领过的节点放入 `claimed` WeakSet,同一次遍历不会重复认领。\n *\n * 典型调用(以 hydrate 测试为例):\n * container.innerHTML = ssrHtml; // <div id=\"app1\"><div>SSR...</div></div>\n * hydrate(Ctor, container);\n *\n * hydrate 内部:\n * cursor = new TreeCursor(rootEl.parentNode); // 光标起点 = container,即 <div id=\"app1\">\n * createNode('div') → findUnclaimed 搜 <div id=\"app1\"> 的直接子级 → 找到 rootEl → 认领 ✅\n * beforeIndent → enterChildren(rootEl) // 光标进入 rootEl\n * createNode('nav') → findUnclaimed 搜 rootEl 的直接子级 → 找到 SSR <nav> → 认领 ✅\n *\n * 关键约束:游标只在当前层级搜索。这就是为什么光标起点必须在 container 层——让 App 的\n * 外层 div 在 container 的子级中被认领,而不是在 <body> 层误将 #app 当 div 认领走。\n */\nclass TreeCursor {\n /** 当前搜索容器——findUnclaimed 在此节点的 firstChild 链上搜索 */\n private parent: Node;\n /** 已认领节点集合,防止 DOM 重排导致误认领 */\n private claimed = new WeakSet<Node>();\n /** 当前层级最后一个被认领的节点,搜索从 nextSibling 起跳,跳过已遍历节点 */\n private current: Node | null = null;\n\n constructor(container: Node) {\n this.parent = container;\n }\n\n /** 进入子节点:后续 findUnclaimed 搜 node 的直接子级 */\n enterChildren(node: Node) {\n this.parent = node;\n this.current = null;\n }\n\n /** 直接设置游标父级(用于 tp 等需要跳转到非树位置的场景) */\n setParent(node: Node) {\n this.parent = node;\n this.current = null;\n }\n\n /** 设置当前指针,后续 findUnclaimed 从 node.nextSibling 开始 */\n setCurrent(node: Node) {\n this.current = node;\n }\n\n /** 退出当前节点,回到父级,恢复游标位置 */\n leaveToParent(node: Node) {\n if (node === this.parent && this.parent.parentNode) {\n this.parent = this.parent.parentNode;\n this.current = node;\n }\n }\n\n /** 在 this.parent 的 firstChild 链上查找第一个满足条件的节点 */\n private findUnclaimed(predicate: (node: Node) => boolean): Node | null {\n // 指针起跳 + WeakSet 兜底:指针失效(DOM 重排)时 wrapped 扫描,WeakSet 防重认\n let node = this.current?.nextSibling || this.parent.firstChild;\n while (node) {\n if (!this.claimed.has(node) && predicate(node)) {\n this.claimed.add(node);\n this.current = node;\n return node;\n }\n node = node.nextSibling;\n }\n return null;\n }\n\n /** 认领一个未使用的元素节点(按 tagName 匹配) */\n tryClaimElement(tagName: string): Element | null {\n return this.findUnclaimed(\n (node) => node.nodeType === 1 && (node as Element).tagName.toLowerCase() === tagName\n ) as Element | null;\n }\n\n /** 认领一个未使用的注释节点(按注释内容匹配) */\n tryClaimComment(name: string): Comment | null {\n return this.findUnclaimed(\n (node) => node.nodeType === 8 && (node as Comment).data === name\n ) as Comment | null;\n }\n\n /** 认领一个未使用的文本节点(非空文本) */\n tryClaimText(): Text | null {\n return this.findUnclaimed(\n (node) => node.nodeType === 3 && !!(node.textContent?.trim())\n ) as Text | null;\n }\n}\n\n// ====== 回调 ======\n\nexport const hydrate = (ComponentClass: typeof Store, rootEl: Element) => {\n const cursor = new TreeCursor(rootEl);\n // 首屏 render 期间(含 flushMicroEffectManual 中的 for/if effect 首次执行)为 true\n // 后续响应式更新为 false,createNode/createAnchor 直接创建新节点\n let isFirstRender = true;\n\n // 首屏时 text/html 的 DOM 内容已由 SSR 生成,跳过 innerHTML/textContent 赋值避免重绘\n // 但仍需设 CONTENT_FLAG 保证 beforeIndent 冲突检测正常\n function setProp (node: Node, key: string, value: any) {\n if (isFirstRender && (key === 'children' || key === 'html')) {\n (node as any)[CONTENT_FLAG] = value != null;\n return;\n }\n return browserSetProp.call(this,node, key, value);\n };\n\n function createNode (this: Interpreter, name: string): Node {\n const doc = this.root?.ownerDocument || document;\n if (isFirstRender) {\n const claimed = name === 'text'\n ? cursor.tryClaimText()\n : cursor.tryClaimElement(name);\n if (claimed) return claimed;\n }\n return name === 'text'\n ? doc.createTextNode('')\n : browserCreateNode.call(this, name);\n };\n\n function createAnchor (name: string): Comment {\n const doc = this.root?.ownerDocument || document;\n if (isFirstRender) {\n const claimed = cursor.tryClaimComment(name);\n if (claimed) return claimed;\n }\n return doc.createComment(name);\n };\n\n function insertAfter(parent: Node, node: Node, prev: Node | null) {\n if (node === parent) return;\n const expectedNext = prev ? prev.nextSibling : parent.firstChild;\n if (node === expectedNext) return;\n parent.insertBefore(node, expectedNext);\n };\n\n function beforeIndent(node: Node): boolean | void {\n if ((node as any)[CONTENT_FLAG]) {\n const tag = (node as Element).tagName?.toLowerCase();\n const hasText = (node as HTMLElement).textContent != null;\n console.warn(\n `<${tag}> has ${hasText ? 'text' : 'html'} content and child elements — children ignored`\n );\n return false;\n }\n if (isFirstRender) cursor.enterChildren(node);\n };\n\n function leaveNode (node: Node) {\n if (isFirstRender) cursor.leaveToParent(node);\n };\n\n // tp 节点进入 indent 时,将游标切入目标 DOM,使其子节点在正确位置认领\n function beforeLogicIndent (node: any) {\n if (isFirstRender && node.tpData) {\n const targetDom = node.tpData.node;\n if (targetDom) cursor.enterChildren(targetDom);\n }\n };\n\n function leaveLogicNode (node: any, _isDedent: boolean) {\n // tp 节点离开时,通过 realAfter 锚点找到模板父级 DOM 恢复游标\n if (isFirstRender && node.tpData) {\n const parentDom = node.realAfter?.parentNode;\n if (parentDom) {\n cursor.setParent(parentDom);\n // 后续认领从 tp-after 锚点之后开始\n if (node.realAfter) cursor.setCurrent(node.realAfter);\n }\n return;\n }\n if (isFirstRender) cursor.leaveToParent(node);\n };\n\n const render = customRender({\n createNode,\n setProp,\n insertAfter,\n createAnchor,\n remove,\n firstChild,\n nextSib,\n beforeIndent,\n beforeLogicIndent,\n leaveNode,\n leaveLogicNode,\n // program() 遍历完模板后、flushMicroEffectManual 首次执行 effect 前切回首屏标志\n // 后续 for/if effect 中的 createNode 走浏览器新建路径,不再尝试从 SSR DOM 认领\n onBeforeFlush: () => {\n isFirstRender = false;\n }\n });\n\n return render(ComponentClass, rootEl);\n};\n"],"names":["BOOLEAN_ATTRS","Set","VALUE_PROP_TAGS","SVG_NS","MATH_NS","SVG_TAGS","MATH_TAGS","isNS","el","namespaceURI","createNode","name","doc","root","ownerDocument","document","createTextNode","has","createElementNS","createElement","CONTENT_FLAG","Symbol","setProp","node","key","value","textContent","startsWith","evtName","slice","addEventListener","removeEventListener","classList","toggle","id","removeAttribute","className","Array","isArray","names","Object","entries","filter","v","map","k","join","setAttribute","str","String","style","cssText","innerHTML","undefined","tagName","insertAfter","parent","prev","insertBefore","firstChild","nextSibling","createAnchor","createComment","remove","nextSib","beforeIndent","tag","toLowerCase","hasText","console","warn","render","customRender","TreeCursor","claimed","WeakSet","current","constructor","container","enterChildren","setParent","setCurrent","leaveToParent","parentNode","findUnclaimed","predicate","add","tryClaimElement","nodeType","tryClaimComment","data","tryClaimText","trim","hydrate","ComponentClass","rootEl","cursor","isFirstRender","browserSetProp","call","browserCreateNode","expectedNext","leaveNode","beforeLogicIndent","tpData","targetDom","leaveLogicNode","_isDedent","parentDom","realAfter","onBeforeFlush"],"mappings":"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"}
1
+ {"version":3,"file":"bobe-dom.cjs","sources":["../src/render.ts","../src/render-hydrate.ts"],"sourcesContent":["import { customRender, Interpreter } from 'bobe';\n\nexport const BOOLEAN_ATTRS = new Set([\n 'disabled', 'readonly', 'checked', 'selected', 'hidden',\n 'multiple', 'required', 'autofocus', 'autoplay', 'controls',\n 'loop', 'muted', 'defer', 'async', 'reversed', 'open',\n 'itemscope', 'ismap', 'nohref', 'noshade', 'nowrap', 'compact', 'default'\n]);\n\nconst VALUE_PROP_TAGS = new Set(['INPUT', 'TEXTAREA', 'SELECT']);\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst MATH_NS = 'http://www.w3.org/1998/Math/MathML';\n\nconst SVG_TAGS = new Set([\n 'svg', 'animate', 'animateMotion', 'animateTransform', 'circle', 'clipPath',\n 'defs', 'desc', 'ellipse', 'feBlend', 'feColorMatrix', 'feComponentTransfer',\n 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap',\n 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG',\n 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology',\n 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile',\n 'feTurbulence', 'filter', 'foreignObject', 'g', 'image', 'line', 'linearGradient',\n 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline',\n 'radialGradient', 'rect', 'set', 'stop', 'switch', 'symbol', 'textPath',\n 'tspan', 'use', 'view'\n]);\n\nconst MATH_TAGS = new Set([\n 'math', 'maction', 'maligngroup', 'malignmark', 'menclose', 'merror',\n 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mlongdiv', 'mmultiscripts',\n 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mscarries',\n 'mscarry', 'msgroup', 'mstack', 'mspace', 'msqrt', 'msrow', 'mstyle', 'msub',\n 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover',\n 'semantics', 'annotation', 'annotation-xml'\n]);\n\nconst isNS = (el: Element) => el.namespaceURI === SVG_NS || el.namespaceURI === MATH_NS;\n\n// ---- exported for unit testing ----\n\nexport function createNode(this: Interpreter, name: string): Node {\n const doc = this.root?.ownerDocument || document;\n if (name === 'text') return doc.createTextNode('');\n if (MATH_TAGS.has(name)) return doc.createElementNS(MATH_NS, name);\n if (SVG_TAGS.has(name)) return doc.createElementNS(SVG_NS, name);\n return doc.createElement(name);\n};\n\nexport const CONTENT_FLAG = Symbol('hasContent');\n\nexport function setProp(node: Node, key: string, value: any): (() => void) | undefined {\n const el = node as HTMLElement;\n\n // 0. children\n if (key === 'children') {\n (node as any)[CONTENT_FLAG] = value != null;\n if (value == null) return;\n node.textContent = value;\n return;\n }\n\n // 1. 事件\n if (key.startsWith('on')) {\n const evtName = key.slice(2);\n node.addEventListener(evtName, value);\n return () => node.removeEventListener(evtName, value);\n }\n\n // 2. class\n if (key.startsWith('.')) {\n el.classList.toggle(key.slice(1), !!value);\n return;\n }\n\n if (key.startsWith('#')) {\n if (value) el.id = key.slice(1);\n else el.removeAttribute('id');\n return;\n }\n\n if (key === 'class') {\n if (value == null) {\n el.className = '';\n } else if (typeof value === 'object' && !Array.isArray(value)) {\n if (isNS(el)) {\n const names = Object.entries(value as Record<string, any>)\n .filter(([, v]) => !!v)\n .map(([k]) => k)\n .join(' ');\n el.setAttribute('class', names);\n } else {\n for (const k in value) {\n el.classList.toggle(k, !!(value as Record<string, any>)[k]);\n }\n }\n } else {\n const str = typeof value === 'boolean' ? (value ? 'true' : '') : String(value);\n if (isNS(el)) {\n el.setAttribute('class', str);\n } else {\n el.className = str;\n }\n }\n return;\n }\n\n // 3. style\n if (key === 'style') {\n if (value == null) {\n el.style.cssText = '';\n } else {\n el.style.cssText = String(value);\n }\n return;\n }\n\n // 4. html\n if (key === 'html') {\n (node as any)[CONTENT_FLAG] = value != null;\n if (value == null) return;\n (node as Element).innerHTML = String(value);\n return;\n }\n\n // 5. 布尔属性\n if (BOOLEAN_ATTRS.has(key)) {\n if (value === false || value === null || value === undefined) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, '');\n }\n return;\n }\n\n // 6. input/textarea/select value & checked\n if ((key === 'value' || key === 'checked') && VALUE_PROP_TAGS.has(el.tagName)) {\n (el as any)[key] = value;\n return;\n }\n\n // 7. SVG/MathML 元素\n if (isNS(el)) {\n if (value == null) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, String(value));\n }\n return;\n }\n\n // 8. data-* / aria-*\n if (key.startsWith('data-') || key.startsWith('aria-')) {\n if (value == null) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, String(value));\n }\n return;\n }\n\n // 9. 其余属性\n if (value == null) {\n el.removeAttribute(key);\n } else if (key in el) {\n (el as any)[key] = value;\n } else {\n el.setAttribute(key, String(value));\n }\n};\n\nexport function insertAfter(parent: Node, node: Node, prev: Node | null) {\n if (!prev) parent.insertBefore(node, parent.firstChild);\n else parent.insertBefore(node, prev.nextSibling);\n};\n\nexport function createAnchor(this: Interpreter, name: string) { \n const doc = this.root?.ownerDocument || document;\n return doc.createComment(name); \n}\n\nexport function remove(node: Node) { (node as Element).remove(); };\n\nexport function firstChild(node: Node) {return node.firstChild};\n\nexport function nextSib(node: Node) {return node.nextSibling;}\n\nexport function beforeIndent(node: Node): boolean | void {\n if ((node as any)[CONTENT_FLAG]) {\n const tag = (node as Element).tagName?.toLowerCase();\n const hasText = (node as HTMLElement).textContent != null;\n console.warn(`<${tag}> has ${hasText ? 'text' : 'html'} content and child elements — children ignored`);\n return false;\n }\n};\n\nexport const render = customRender({\n createNode,\n setProp,\n insertAfter,\n createAnchor,\n remove,\n firstChild,\n nextSib,\n beforeIndent\n});\n","import { customRender, Interpreter, Store } from 'bobe';\nimport {\n setProp as browserSetProp,\n createNode as browserCreateNode,\n remove,\n firstChild,\n nextSib,\n CONTENT_FLAG\n} from './render';\n\n// ====== TreeCursor ======\n\n/**\n * SSR DOM 认领游标。\n *\n * 工作方式:\n * - 维护一个 `parent` 指针,始终指向\"当前容器\"。\n * - `findUnclaimed` 只在 `parent.firstChild` 中平铺搜索(只搜一层,不递归)。\n * - 认领过的节点放入 `claimed` WeakSet,同一次遍历不会重复认领。\n *\n * 典型调用(以 hydrate 测试为例):\n * container.innerHTML = ssrHtml; // <div id=\"app1\"><div>SSR...</div></div>\n * hydrate(Ctor, container);\n *\n * hydrate 内部:\n * cursor = new TreeCursor(rootEl.parentNode); // 光标起点 = container,即 <div id=\"app1\">\n * createNode('div') → findUnclaimed 搜 <div id=\"app1\"> 的直接子级 → 找到 rootEl → 认领 ✅\n * beforeIndent → enterChildren(rootEl) // 光标进入 rootEl\n * createNode('nav') → findUnclaimed 搜 rootEl 的直接子级 → 找到 SSR <nav> → 认领 ✅\n *\n * 关键约束:游标只在当前层级搜索。这就是为什么光标起点必须在 container 层——让 App 的\n * 外层 div 在 container 的子级中被认领,而不是在 <body> 层误将 #app 当 div 认领走。\n */\nclass TreeCursor {\n /** 当前搜索容器——findUnclaimed 在此节点的 firstChild 链上搜索 */\n private parent: Node;\n /** 已认领节点集合,防止 DOM 重排导致误认领 */\n private claimed = new WeakSet<Node>();\n /** 当前层级最后一个被认领的节点,搜索从 nextSibling 起跳,跳过已遍历节点 */\n private current: Node | null = null;\n\n constructor(container: Node) {\n this.parent = container;\n }\n\n /** 进入子节点:后续 findUnclaimed 搜 node 的直接子级 */\n enterChildren(node: Node) {\n this.parent = node;\n this.current = null;\n }\n\n /** 直接设置游标父级(用于 tp 等需要跳转到非树位置的场景) */\n setParent(node: Node) {\n this.parent = node;\n this.current = null;\n }\n\n /** 设置当前指针,后续 findUnclaimed 从 node.nextSibling 开始 */\n setCurrent(node: Node) {\n this.current = node;\n }\n\n /** 退出当前节点,回到父级,恢复游标位置 */\n leaveToParent(node: Node) {\n if (node === this.parent && this.parent.parentNode) {\n this.parent = this.parent.parentNode;\n this.current = node;\n }\n }\n\n /** 在 this.parent 的 firstChild 链上查找第一个满足条件的节点 */\n private findUnclaimed(predicate: (node: Node) => boolean): Node | null {\n // 指针起跳 + WeakSet 兜底:指针失效(DOM 重排)时 wrapped 扫描,WeakSet 防重认\n let node = this.current?.nextSibling || this.parent.firstChild;\n while (node) {\n if (!this.claimed.has(node) && predicate(node)) {\n this.claimed.add(node);\n this.current = node;\n return node;\n }\n node = node.nextSibling;\n }\n return null;\n }\n\n /** 认领一个未使用的元素节点(按 tagName 匹配) */\n tryClaimElement(tagName: string): Element | null {\n return this.findUnclaimed(\n (node) => node.nodeType === 1 && (node as Element).tagName.toLowerCase() === tagName\n ) as Element | null;\n }\n\n /** 认领一个未使用的注释节点(按注释内容匹配) */\n tryClaimComment(name: string): Comment | null {\n return this.findUnclaimed(\n (node) => node.nodeType === 8 && (node as Comment).data === name\n ) as Comment | null;\n }\n\n /** 认领一个未使用的文本节点(非空文本) */\n tryClaimText(): Text | null {\n return this.findUnclaimed(\n (node) => node.nodeType === 3 && !!(node.textContent?.trim())\n ) as Text | null;\n }\n}\n\n// ====== 回调 ======\n\nexport const hydrate = (ComponentClass: typeof Store, rootEl: Element) => {\n const cursor = new TreeCursor(rootEl);\n // 首屏 render 期间(含 flushMicroEffectManual 中的 for/if effect 首次执行)为 true\n // 后续响应式更新为 false,createNode/createAnchor 直接创建新节点\n let isFirstRender = true;\n\n // 首屏时 text/html 的 DOM 内容已由 SSR 生成,跳过 innerHTML/textContent 赋值避免重绘\n // 但仍需设 CONTENT_FLAG 保证 beforeIndent 冲突检测正常\n function setProp (node: Node, key: string, value: any) {\n if (isFirstRender && (key === 'children' || key === 'html')) {\n (node as any)[CONTENT_FLAG] = value != null;\n return;\n }\n return browserSetProp.call(this,node, key, value);\n };\n\n function createNode (this: Interpreter, name: string): Node {\n const doc = this.root?.ownerDocument || document;\n if (isFirstRender) {\n const claimed = name === 'text'\n ? cursor.tryClaimText()\n : cursor.tryClaimElement(name);\n if (claimed) return claimed;\n }\n return name === 'text'\n ? doc.createTextNode('')\n : browserCreateNode.call(this, name);\n };\n\n function createAnchor (name: string): Comment {\n const doc = this.root?.ownerDocument || document;\n if (isFirstRender) {\n const claimed = cursor.tryClaimComment(name);\n if (claimed) return claimed;\n }\n return doc.createComment(name);\n };\n\n function insertAfter(parent: Node, node: Node, prev: Node | null) {\n if (node === parent) return;\n const expectedNext = prev ? prev.nextSibling : parent.firstChild;\n if (node === expectedNext) return;\n parent.insertBefore(node, expectedNext);\n };\n\n function beforeIndent(node: Node): boolean | void {\n if ((node as any)[CONTENT_FLAG]) {\n const tag = (node as Element).tagName?.toLowerCase();\n const hasText = (node as HTMLElement).textContent != null;\n console.warn(\n `<${tag}> has ${hasText ? 'text' : 'html'} content and child elements — children ignored`\n );\n return false;\n }\n if (isFirstRender) cursor.enterChildren(node);\n };\n\n function leaveNode (node: Node) {\n if (isFirstRender) cursor.leaveToParent(node);\n };\n\n // tp 节点进入 indent 时,将游标切入目标 DOM,使其子节点在正确位置认领\n function beforeLogicIndent (node: any) {\n if (isFirstRender && node.tpData) {\n const targetDom = node.tpData.node;\n if (targetDom) cursor.enterChildren(targetDom);\n }\n };\n\n function leaveLogicNode (node: any, _isDedent: boolean) {\n // tp 节点离开时,通过 realAfter 锚点找到模板父级 DOM 恢复游标\n if (isFirstRender && node.tpData) {\n const parentDom = node.realAfter?.parentNode;\n if (parentDom) {\n cursor.setParent(parentDom);\n // 后续认领从 tp-after 锚点之后开始\n if (node.realAfter) cursor.setCurrent(node.realAfter);\n }\n return;\n }\n if (isFirstRender) cursor.leaveToParent(node);\n };\n\n const render = customRender({\n createNode,\n setProp,\n insertAfter,\n createAnchor,\n remove,\n firstChild,\n nextSib,\n beforeIndent,\n beforeLogicIndent,\n leaveNode,\n leaveLogicNode,\n // program() 遍历完模板后、flushMicroEffectManual 首次执行 effect 前切回首屏标志\n // 后续 for/if effect 中的 createNode 走浏览器新建路径,不再尝试从 SSR DOM 认领\n onBeforeFlush: () => {\n isFirstRender = false;\n }\n });\n\n return render(ComponentClass, rootEl);\n};\n"],"names":["BOOLEAN_ATTRS","Set","VALUE_PROP_TAGS","SVG_NS","MATH_NS","SVG_TAGS","MATH_TAGS","isNS","el","namespaceURI","createNode","name","doc","root","ownerDocument","document","createTextNode","has","createElementNS","createElement","CONTENT_FLAG","Symbol","setProp","node","key","value","textContent","startsWith","evtName","slice","addEventListener","removeEventListener","classList","toggle","id","removeAttribute","className","Array","isArray","names","Object","entries","filter","v","map","k","join","setAttribute","str","String","style","cssText","innerHTML","undefined","tagName","insertAfter","parent","prev","insertBefore","firstChild","nextSibling","createAnchor","createComment","remove","nextSib","beforeIndent","tag","toLowerCase","hasText","console","warn","render","customRender","TreeCursor","claimed","WeakSet","current","constructor","container","enterChildren","setParent","setCurrent","leaveToParent","parentNode","findUnclaimed","predicate","add","tryClaimElement","nodeType","tryClaimComment","data","tryClaimText","trim","hydrate","ComponentClass","rootEl","cursor","isFirstRender","browserSetProp","call","browserCreateNode","expectedNext","leaveNode","beforeLogicIndent","tpData","targetDom","leaveLogicNode","_isDedent","parentDom","realAfter","onBeforeFlush"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"bobe-dom.esm.js","sources":["../src/render.ts","../src/render-hydrate.ts"],"sourcesContent":["import { customRender, Interpreter } from 'bobe';\n\nexport const BOOLEAN_ATTRS = new Set([\n 'disabled', 'readonly', 'checked', 'selected', 'hidden',\n 'multiple', 'required', 'autofocus', 'autoplay', 'controls',\n 'loop', 'muted', 'defer', 'async', 'reversed', 'open',\n 'itemscope', 'ismap', 'nohref', 'noshade', 'nowrap', 'compact', 'default'\n]);\n\nconst VALUE_PROP_TAGS = new Set(['INPUT', 'TEXTAREA', 'SELECT']);\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst MATH_NS = 'http://www.w3.org/1998/Math/MathML';\n\nconst SVG_TAGS = new Set([\n 'svg', 'animate', 'animateMotion', 'animateTransform', 'circle', 'clipPath',\n 'defs', 'desc', 'ellipse', 'feBlend', 'feColorMatrix', 'feComponentTransfer',\n 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap',\n 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG',\n 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology',\n 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile',\n 'feTurbulence', 'filter', 'foreignObject', 'g', 'image', 'line', 'linearGradient',\n 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline',\n 'radialGradient', 'rect', 'set', 'stop', 'switch', 'symbol', 'textPath',\n 'tspan', 'use', 'view'\n]);\n\nconst MATH_TAGS = new Set([\n 'math', 'maction', 'maligngroup', 'malignmark', 'menclose', 'merror',\n 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mlongdiv', 'mmultiscripts',\n 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mscarries',\n 'mscarry', 'msgroup', 'mstack', 'mspace', 'msqrt', 'msrow', 'mstyle', 'msub',\n 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover',\n 'semantics', 'annotation', 'annotation-xml'\n]);\n\nconst isNS = (el: Element) => el.namespaceURI === SVG_NS || el.namespaceURI === MATH_NS;\n\n// ---- exported for unit testing ----\n\nexport function createNode(this: Interpreter, name: string): Node {\n const doc = this.root?.ownerDocument || document;\n if (name === 'text') return doc.createTextNode('');\n if (MATH_TAGS.has(name)) return doc.createElementNS(MATH_NS, name);\n if (SVG_TAGS.has(name)) return doc.createElementNS(SVG_NS, name);\n return doc.createElement(name);\n};\n\nexport const CONTENT_FLAG = Symbol('hasContent');\n\nexport function setProp(node: Node, key: string, value: any): (() => void) | undefined {\n const el = node as HTMLElement;\n\n // 0. children\n if (key === 'children') {\n (node as any)[CONTENT_FLAG] = value != null;\n if (value == null) return;\n node.textContent = value;\n return;\n }\n\n // 1. 事件\n if (key.startsWith('on')) {\n const evtName = key.slice(2);\n node.addEventListener(evtName, value);\n return () => node.removeEventListener(evtName, value);\n }\n\n // 2. class\n if (key.startsWith('.')) {\n el.classList.toggle(key.slice(1), !!value);\n return;\n }\n\n if (key.startsWith('#')) {\n if (value) el.id = key.slice(1);\n else el.removeAttribute('id');\n return;\n }\n\n if (key === 'class') {\n if (value == null) {\n el.className = '';\n } else if (typeof value === 'object' && !Array.isArray(value)) {\n if (isNS(el)) {\n const names = Object.entries(value as Record<string, any>)\n .filter(([, v]) => !!v)\n .map(([k]) => k)\n .join(' ');\n el.setAttribute('class', names);\n } else {\n for (const k in value) {\n el.classList.toggle(k, !!(value as Record<string, any>)[k]);\n }\n }\n } else {\n const str = typeof value === 'boolean' ? (value ? 'true' : '') : String(value);\n if (isNS(el)) {\n el.setAttribute('class', str);\n } else {\n el.className = str;\n }\n }\n return;\n }\n\n // 3. style\n if (key === 'style') {\n if (value == null) {\n el.style.cssText = '';\n } else {\n el.style.cssText = String(value);\n }\n return;\n }\n\n // 4. html\n if (key === 'html') {\n (node as any)[CONTENT_FLAG] = value != null;\n if (value == null) return;\n (node as Element).innerHTML = String(value);\n return;\n }\n\n // 5. 布尔属性\n if (BOOLEAN_ATTRS.has(key)) {\n if (value === false || value === null || value === undefined) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, '');\n }\n return;\n }\n\n // 6. input/textarea/select value & checked\n if ((key === 'value' || key === 'checked') && VALUE_PROP_TAGS.has(el.tagName)) {\n (el as any)[key] = value;\n return;\n }\n\n // 7. SVG/MathML 元素\n if (isNS(el)) {\n if (value == null) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, String(value));\n }\n return;\n }\n\n // 8. data-* / aria-*\n if (key.startsWith('data-') || key.startsWith('aria-')) {\n if (value == null) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, String(value));\n }\n return;\n }\n\n // 9. 其余属性\n if (value == null) {\n el.removeAttribute(key);\n } else if (key in el) {\n (el as any)[key] = value;\n } else {\n el.setAttribute(key, String(value));\n }\n};\n\nexport function insertAfter(parent: Node, node: Node, prev: Node | null) {\n if (!prev) parent.insertBefore(node, parent.firstChild);\n else parent.insertBefore(node, prev.nextSibling);\n};\n\nexport function createAnchor(name: string) { \n const doc = this.root?.ownerDocument || document;\n return doc.createComment(name); \n}\n\nexport function remove(node: Node) { (node as Element).remove(); };\n\nexport function firstChild(node: Node) {return node.firstChild};\n\nexport function nextSib(node: Node) {return node.nextSibling;}\n\nexport function beforeIndent(node: Node): boolean | void {\n if ((node as any)[CONTENT_FLAG]) {\n const tag = (node as Element).tagName?.toLowerCase();\n const hasText = (node as HTMLElement).textContent != null;\n console.warn(`<${tag}> has ${hasText ? 'text' : 'html'} content and child elements — children ignored`);\n return false;\n }\n};\n\nexport const render = customRender({\n createNode,\n setProp,\n insertAfter,\n createAnchor,\n remove,\n firstChild,\n nextSib,\n beforeIndent\n});\n","import { customRender, Interpreter, Store } from 'bobe';\nimport {\n setProp as browserSetProp,\n createNode as browserCreateNode,\n remove,\n firstChild,\n nextSib,\n CONTENT_FLAG\n} from './render';\n\n// ====== TreeCursor ======\n\n/**\n * SSR DOM 认领游标。\n *\n * 工作方式:\n * - 维护一个 `parent` 指针,始终指向\"当前容器\"。\n * - `findUnclaimed` 只在 `parent.firstChild` 中平铺搜索(只搜一层,不递归)。\n * - 认领过的节点放入 `claimed` WeakSet,同一次遍历不会重复认领。\n *\n * 典型调用(以 hydrate 测试为例):\n * container.innerHTML = ssrHtml; // <div id=\"app1\"><div>SSR...</div></div>\n * hydrate(Ctor, container);\n *\n * hydrate 内部:\n * cursor = new TreeCursor(rootEl.parentNode); // 光标起点 = container,即 <div id=\"app1\">\n * createNode('div') → findUnclaimed 搜 <div id=\"app1\"> 的直接子级 → 找到 rootEl → 认领 ✅\n * beforeIndent → enterChildren(rootEl) // 光标进入 rootEl\n * createNode('nav') → findUnclaimed 搜 rootEl 的直接子级 → 找到 SSR <nav> → 认领 ✅\n *\n * 关键约束:游标只在当前层级搜索。这就是为什么光标起点必须在 container 层——让 App 的\n * 外层 div 在 container 的子级中被认领,而不是在 <body> 层误将 #app 当 div 认领走。\n */\nclass TreeCursor {\n /** 当前搜索容器——findUnclaimed 在此节点的 firstChild 链上搜索 */\n private parent: Node;\n /** 已认领节点集合,防止 DOM 重排导致误认领 */\n private claimed = new WeakSet<Node>();\n /** 当前层级最后一个被认领的节点,搜索从 nextSibling 起跳,跳过已遍历节点 */\n private current: Node | null = null;\n\n constructor(container: Node) {\n this.parent = container;\n }\n\n /** 进入子节点:后续 findUnclaimed 搜 node 的直接子级 */\n enterChildren(node: Node) {\n this.parent = node;\n this.current = null;\n }\n\n /** 直接设置游标父级(用于 tp 等需要跳转到非树位置的场景) */\n setParent(node: Node) {\n this.parent = node;\n this.current = null;\n }\n\n /** 设置当前指针,后续 findUnclaimed 从 node.nextSibling 开始 */\n setCurrent(node: Node) {\n this.current = node;\n }\n\n /** 退出当前节点,回到父级,恢复游标位置 */\n leaveToParent(node: Node) {\n if (node === this.parent && this.parent.parentNode) {\n this.parent = this.parent.parentNode;\n this.current = node;\n }\n }\n\n /** 在 this.parent 的 firstChild 链上查找第一个满足条件的节点 */\n private findUnclaimed(predicate: (node: Node) => boolean): Node | null {\n // 指针起跳 + WeakSet 兜底:指针失效(DOM 重排)时 wrapped 扫描,WeakSet 防重认\n let node = this.current?.nextSibling || this.parent.firstChild;\n while (node) {\n if (!this.claimed.has(node) && predicate(node)) {\n this.claimed.add(node);\n this.current = node;\n return node;\n }\n node = node.nextSibling;\n }\n return null;\n }\n\n /** 认领一个未使用的元素节点(按 tagName 匹配) */\n tryClaimElement(tagName: string): Element | null {\n return this.findUnclaimed(\n (node) => node.nodeType === 1 && (node as Element).tagName.toLowerCase() === tagName\n ) as Element | null;\n }\n\n /** 认领一个未使用的注释节点(按注释内容匹配) */\n tryClaimComment(name: string): Comment | null {\n return this.findUnclaimed(\n (node) => node.nodeType === 8 && (node as Comment).data === name\n ) as Comment | null;\n }\n\n /** 认领一个未使用的文本节点(非空文本) */\n tryClaimText(): Text | null {\n return this.findUnclaimed(\n (node) => node.nodeType === 3 && !!(node.textContent?.trim())\n ) as Text | null;\n }\n}\n\n// ====== 回调 ======\n\nexport const hydrate = (ComponentClass: typeof Store, rootEl: Element) => {\n const cursor = new TreeCursor(rootEl);\n // 首屏 render 期间(含 flushMicroEffectManual 中的 for/if effect 首次执行)为 true\n // 后续响应式更新为 false,createNode/createAnchor 直接创建新节点\n let isFirstRender = true;\n\n // 首屏时 text/html 的 DOM 内容已由 SSR 生成,跳过 innerHTML/textContent 赋值避免重绘\n // 但仍需设 CONTENT_FLAG 保证 beforeIndent 冲突检测正常\n function setProp (node: Node, key: string, value: any) {\n if (isFirstRender && (key === 'children' || key === 'html')) {\n (node as any)[CONTENT_FLAG] = value != null;\n return;\n }\n return browserSetProp.call(this,node, key, value);\n };\n\n function createNode (this: Interpreter, name: string): Node {\n const doc = this.root?.ownerDocument || document;\n if (isFirstRender) {\n const claimed = name === 'text'\n ? cursor.tryClaimText()\n : cursor.tryClaimElement(name);\n if (claimed) return claimed;\n }\n return name === 'text'\n ? doc.createTextNode('')\n : browserCreateNode.call(this, name);\n };\n\n function createAnchor (name: string): Comment {\n const doc = this.root?.ownerDocument || document;\n if (isFirstRender) {\n const claimed = cursor.tryClaimComment(name);\n if (claimed) return claimed;\n }\n return doc.createComment(name);\n };\n\n function insertAfter(parent: Node, node: Node, prev: Node | null) {\n if (node === parent) return;\n const expectedNext = prev ? prev.nextSibling : parent.firstChild;\n if (node === expectedNext) return;\n parent.insertBefore(node, expectedNext);\n };\n\n function beforeIndent(node: Node): boolean | void {\n if ((node as any)[CONTENT_FLAG]) {\n const tag = (node as Element).tagName?.toLowerCase();\n const hasText = (node as HTMLElement).textContent != null;\n console.warn(\n `<${tag}> has ${hasText ? 'text' : 'html'} content and child elements — children ignored`\n );\n return false;\n }\n if (isFirstRender) cursor.enterChildren(node);\n };\n\n function leaveNode (node: Node) {\n if (isFirstRender) cursor.leaveToParent(node);\n };\n\n // tp 节点进入 indent 时,将游标切入目标 DOM,使其子节点在正确位置认领\n function beforeLogicIndent (node: any) {\n if (isFirstRender && node.tpData) {\n const targetDom = node.tpData.node;\n if (targetDom) cursor.enterChildren(targetDom);\n }\n };\n\n function leaveLogicNode (node: any, _isDedent: boolean) {\n // tp 节点离开时,通过 realAfter 锚点找到模板父级 DOM 恢复游标\n if (isFirstRender && node.tpData) {\n const parentDom = node.realAfter?.parentNode;\n if (parentDom) {\n cursor.setParent(parentDom);\n // 后续认领从 tp-after 锚点之后开始\n if (node.realAfter) cursor.setCurrent(node.realAfter);\n }\n return;\n }\n if (isFirstRender) cursor.leaveToParent(node);\n };\n\n const render = customRender({\n createNode,\n setProp,\n insertAfter,\n createAnchor,\n remove,\n firstChild,\n nextSib,\n beforeIndent,\n beforeLogicIndent,\n leaveNode,\n leaveLogicNode,\n // program() 遍历完模板后、flushMicroEffectManual 首次执行 effect 前切回首屏标志\n // 后续 for/if effect 中的 createNode 走浏览器新建路径,不再尝试从 SSR DOM 认领\n onBeforeFlush: () => {\n isFirstRender = false;\n }\n });\n\n return render(ComponentClass, rootEl);\n};\n"],"names":["BOOLEAN_ATTRS","Set","VALUE_PROP_TAGS","SVG_NS","MATH_NS","SVG_TAGS","MATH_TAGS","isNS","el","namespaceURI","createNode","name","doc","root","ownerDocument","document","createTextNode","has","createElementNS","createElement","CONTENT_FLAG","Symbol","setProp","node","key","value","textContent","startsWith","evtName","slice","addEventListener","removeEventListener","classList","toggle","id","removeAttribute","className","Array","isArray","names","Object","entries","filter","v","map","k","join","setAttribute","str","String","style","cssText","innerHTML","undefined","tagName","insertAfter","parent","prev","insertBefore","firstChild","nextSibling","createAnchor","createComment","remove","nextSib","beforeIndent","tag","toLowerCase","hasText","console","warn","render","customRender","TreeCursor","claimed","WeakSet","current","constructor","container","enterChildren","setParent","setCurrent","leaveToParent","parentNode","findUnclaimed","predicate","add","tryClaimElement","nodeType","tryClaimComment","data","tryClaimText","trim","hydrate","ComponentClass","rootEl","cursor","isFirstRender","browserSetProp","call","browserCreateNode","expectedNext","leaveNode","beforeLogicIndent","tpData","targetDom","leaveLogicNode","_isDedent","parentDom","realAfter","onBeforeFlush"],"mappings":"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"}
1
+ {"version":3,"file":"bobe-dom.esm.js","sources":["../src/render.ts","../src/render-hydrate.ts"],"sourcesContent":["import { customRender, Interpreter } from 'bobe';\n\nexport const BOOLEAN_ATTRS = new Set([\n 'disabled', 'readonly', 'checked', 'selected', 'hidden',\n 'multiple', 'required', 'autofocus', 'autoplay', 'controls',\n 'loop', 'muted', 'defer', 'async', 'reversed', 'open',\n 'itemscope', 'ismap', 'nohref', 'noshade', 'nowrap', 'compact', 'default'\n]);\n\nconst VALUE_PROP_TAGS = new Set(['INPUT', 'TEXTAREA', 'SELECT']);\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst MATH_NS = 'http://www.w3.org/1998/Math/MathML';\n\nconst SVG_TAGS = new Set([\n 'svg', 'animate', 'animateMotion', 'animateTransform', 'circle', 'clipPath',\n 'defs', 'desc', 'ellipse', 'feBlend', 'feColorMatrix', 'feComponentTransfer',\n 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap',\n 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG',\n 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology',\n 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile',\n 'feTurbulence', 'filter', 'foreignObject', 'g', 'image', 'line', 'linearGradient',\n 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline',\n 'radialGradient', 'rect', 'set', 'stop', 'switch', 'symbol', 'textPath',\n 'tspan', 'use', 'view'\n]);\n\nconst MATH_TAGS = new Set([\n 'math', 'maction', 'maligngroup', 'malignmark', 'menclose', 'merror',\n 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mlongdiv', 'mmultiscripts',\n 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mscarries',\n 'mscarry', 'msgroup', 'mstack', 'mspace', 'msqrt', 'msrow', 'mstyle', 'msub',\n 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover',\n 'semantics', 'annotation', 'annotation-xml'\n]);\n\nconst isNS = (el: Element) => el.namespaceURI === SVG_NS || el.namespaceURI === MATH_NS;\n\n// ---- exported for unit testing ----\n\nexport function createNode(this: Interpreter, name: string): Node {\n const doc = this.root?.ownerDocument || document;\n if (name === 'text') return doc.createTextNode('');\n if (MATH_TAGS.has(name)) return doc.createElementNS(MATH_NS, name);\n if (SVG_TAGS.has(name)) return doc.createElementNS(SVG_NS, name);\n return doc.createElement(name);\n};\n\nexport const CONTENT_FLAG = Symbol('hasContent');\n\nexport function setProp(node: Node, key: string, value: any): (() => void) | undefined {\n const el = node as HTMLElement;\n\n // 0. children\n if (key === 'children') {\n (node as any)[CONTENT_FLAG] = value != null;\n if (value == null) return;\n node.textContent = value;\n return;\n }\n\n // 1. 事件\n if (key.startsWith('on')) {\n const evtName = key.slice(2);\n node.addEventListener(evtName, value);\n return () => node.removeEventListener(evtName, value);\n }\n\n // 2. class\n if (key.startsWith('.')) {\n el.classList.toggle(key.slice(1), !!value);\n return;\n }\n\n if (key.startsWith('#')) {\n if (value) el.id = key.slice(1);\n else el.removeAttribute('id');\n return;\n }\n\n if (key === 'class') {\n if (value == null) {\n el.className = '';\n } else if (typeof value === 'object' && !Array.isArray(value)) {\n if (isNS(el)) {\n const names = Object.entries(value as Record<string, any>)\n .filter(([, v]) => !!v)\n .map(([k]) => k)\n .join(' ');\n el.setAttribute('class', names);\n } else {\n for (const k in value) {\n el.classList.toggle(k, !!(value as Record<string, any>)[k]);\n }\n }\n } else {\n const str = typeof value === 'boolean' ? (value ? 'true' : '') : String(value);\n if (isNS(el)) {\n el.setAttribute('class', str);\n } else {\n el.className = str;\n }\n }\n return;\n }\n\n // 3. style\n if (key === 'style') {\n if (value == null) {\n el.style.cssText = '';\n } else {\n el.style.cssText = String(value);\n }\n return;\n }\n\n // 4. html\n if (key === 'html') {\n (node as any)[CONTENT_FLAG] = value != null;\n if (value == null) return;\n (node as Element).innerHTML = String(value);\n return;\n }\n\n // 5. 布尔属性\n if (BOOLEAN_ATTRS.has(key)) {\n if (value === false || value === null || value === undefined) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, '');\n }\n return;\n }\n\n // 6. input/textarea/select value & checked\n if ((key === 'value' || key === 'checked') && VALUE_PROP_TAGS.has(el.tagName)) {\n (el as any)[key] = value;\n return;\n }\n\n // 7. SVG/MathML 元素\n if (isNS(el)) {\n if (value == null) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, String(value));\n }\n return;\n }\n\n // 8. data-* / aria-*\n if (key.startsWith('data-') || key.startsWith('aria-')) {\n if (value == null) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, String(value));\n }\n return;\n }\n\n // 9. 其余属性\n if (value == null) {\n el.removeAttribute(key);\n } else if (key in el) {\n (el as any)[key] = value;\n } else {\n el.setAttribute(key, String(value));\n }\n};\n\nexport function insertAfter(parent: Node, node: Node, prev: Node | null) {\n if (!prev) parent.insertBefore(node, parent.firstChild);\n else parent.insertBefore(node, prev.nextSibling);\n};\n\nexport function createAnchor(this: Interpreter, name: string) { \n const doc = this.root?.ownerDocument || document;\n return doc.createComment(name); \n}\n\nexport function remove(node: Node) { (node as Element).remove(); };\n\nexport function firstChild(node: Node) {return node.firstChild};\n\nexport function nextSib(node: Node) {return node.nextSibling;}\n\nexport function beforeIndent(node: Node): boolean | void {\n if ((node as any)[CONTENT_FLAG]) {\n const tag = (node as Element).tagName?.toLowerCase();\n const hasText = (node as HTMLElement).textContent != null;\n console.warn(`<${tag}> has ${hasText ? 'text' : 'html'} content and child elements — children ignored`);\n return false;\n }\n};\n\nexport const render = customRender({\n createNode,\n setProp,\n insertAfter,\n createAnchor,\n remove,\n firstChild,\n nextSib,\n beforeIndent\n});\n","import { customRender, Interpreter, Store } from 'bobe';\nimport {\n setProp as browserSetProp,\n createNode as browserCreateNode,\n remove,\n firstChild,\n nextSib,\n CONTENT_FLAG\n} from './render';\n\n// ====== TreeCursor ======\n\n/**\n * SSR DOM 认领游标。\n *\n * 工作方式:\n * - 维护一个 `parent` 指针,始终指向\"当前容器\"。\n * - `findUnclaimed` 只在 `parent.firstChild` 中平铺搜索(只搜一层,不递归)。\n * - 认领过的节点放入 `claimed` WeakSet,同一次遍历不会重复认领。\n *\n * 典型调用(以 hydrate 测试为例):\n * container.innerHTML = ssrHtml; // <div id=\"app1\"><div>SSR...</div></div>\n * hydrate(Ctor, container);\n *\n * hydrate 内部:\n * cursor = new TreeCursor(rootEl.parentNode); // 光标起点 = container,即 <div id=\"app1\">\n * createNode('div') → findUnclaimed 搜 <div id=\"app1\"> 的直接子级 → 找到 rootEl → 认领 ✅\n * beforeIndent → enterChildren(rootEl) // 光标进入 rootEl\n * createNode('nav') → findUnclaimed 搜 rootEl 的直接子级 → 找到 SSR <nav> → 认领 ✅\n *\n * 关键约束:游标只在当前层级搜索。这就是为什么光标起点必须在 container 层——让 App 的\n * 外层 div 在 container 的子级中被认领,而不是在 <body> 层误将 #app 当 div 认领走。\n */\nclass TreeCursor {\n /** 当前搜索容器——findUnclaimed 在此节点的 firstChild 链上搜索 */\n private parent: Node;\n /** 已认领节点集合,防止 DOM 重排导致误认领 */\n private claimed = new WeakSet<Node>();\n /** 当前层级最后一个被认领的节点,搜索从 nextSibling 起跳,跳过已遍历节点 */\n private current: Node | null = null;\n\n constructor(container: Node) {\n this.parent = container;\n }\n\n /** 进入子节点:后续 findUnclaimed 搜 node 的直接子级 */\n enterChildren(node: Node) {\n this.parent = node;\n this.current = null;\n }\n\n /** 直接设置游标父级(用于 tp 等需要跳转到非树位置的场景) */\n setParent(node: Node) {\n this.parent = node;\n this.current = null;\n }\n\n /** 设置当前指针,后续 findUnclaimed 从 node.nextSibling 开始 */\n setCurrent(node: Node) {\n this.current = node;\n }\n\n /** 退出当前节点,回到父级,恢复游标位置 */\n leaveToParent(node: Node) {\n if (node === this.parent && this.parent.parentNode) {\n this.parent = this.parent.parentNode;\n this.current = node;\n }\n }\n\n /** 在 this.parent 的 firstChild 链上查找第一个满足条件的节点 */\n private findUnclaimed(predicate: (node: Node) => boolean): Node | null {\n // 指针起跳 + WeakSet 兜底:指针失效(DOM 重排)时 wrapped 扫描,WeakSet 防重认\n let node = this.current?.nextSibling || this.parent.firstChild;\n while (node) {\n if (!this.claimed.has(node) && predicate(node)) {\n this.claimed.add(node);\n this.current = node;\n return node;\n }\n node = node.nextSibling;\n }\n return null;\n }\n\n /** 认领一个未使用的元素节点(按 tagName 匹配) */\n tryClaimElement(tagName: string): Element | null {\n return this.findUnclaimed(\n (node) => node.nodeType === 1 && (node as Element).tagName.toLowerCase() === tagName\n ) as Element | null;\n }\n\n /** 认领一个未使用的注释节点(按注释内容匹配) */\n tryClaimComment(name: string): Comment | null {\n return this.findUnclaimed(\n (node) => node.nodeType === 8 && (node as Comment).data === name\n ) as Comment | null;\n }\n\n /** 认领一个未使用的文本节点(非空文本) */\n tryClaimText(): Text | null {\n return this.findUnclaimed(\n (node) => node.nodeType === 3 && !!(node.textContent?.trim())\n ) as Text | null;\n }\n}\n\n// ====== 回调 ======\n\nexport const hydrate = (ComponentClass: typeof Store, rootEl: Element) => {\n const cursor = new TreeCursor(rootEl);\n // 首屏 render 期间(含 flushMicroEffectManual 中的 for/if effect 首次执行)为 true\n // 后续响应式更新为 false,createNode/createAnchor 直接创建新节点\n let isFirstRender = true;\n\n // 首屏时 text/html 的 DOM 内容已由 SSR 生成,跳过 innerHTML/textContent 赋值避免重绘\n // 但仍需设 CONTENT_FLAG 保证 beforeIndent 冲突检测正常\n function setProp (node: Node, key: string, value: any) {\n if (isFirstRender && (key === 'children' || key === 'html')) {\n (node as any)[CONTENT_FLAG] = value != null;\n return;\n }\n return browserSetProp.call(this,node, key, value);\n };\n\n function createNode (this: Interpreter, name: string): Node {\n const doc = this.root?.ownerDocument || document;\n if (isFirstRender) {\n const claimed = name === 'text'\n ? cursor.tryClaimText()\n : cursor.tryClaimElement(name);\n if (claimed) return claimed;\n }\n return name === 'text'\n ? doc.createTextNode('')\n : browserCreateNode.call(this, name);\n };\n\n function createAnchor (name: string): Comment {\n const doc = this.root?.ownerDocument || document;\n if (isFirstRender) {\n const claimed = cursor.tryClaimComment(name);\n if (claimed) return claimed;\n }\n return doc.createComment(name);\n };\n\n function insertAfter(parent: Node, node: Node, prev: Node | null) {\n if (node === parent) return;\n const expectedNext = prev ? prev.nextSibling : parent.firstChild;\n if (node === expectedNext) return;\n parent.insertBefore(node, expectedNext);\n };\n\n function beforeIndent(node: Node): boolean | void {\n if ((node as any)[CONTENT_FLAG]) {\n const tag = (node as Element).tagName?.toLowerCase();\n const hasText = (node as HTMLElement).textContent != null;\n console.warn(\n `<${tag}> has ${hasText ? 'text' : 'html'} content and child elements — children ignored`\n );\n return false;\n }\n if (isFirstRender) cursor.enterChildren(node);\n };\n\n function leaveNode (node: Node) {\n if (isFirstRender) cursor.leaveToParent(node);\n };\n\n // tp 节点进入 indent 时,将游标切入目标 DOM,使其子节点在正确位置认领\n function beforeLogicIndent (node: any) {\n if (isFirstRender && node.tpData) {\n const targetDom = node.tpData.node;\n if (targetDom) cursor.enterChildren(targetDom);\n }\n };\n\n function leaveLogicNode (node: any, _isDedent: boolean) {\n // tp 节点离开时,通过 realAfter 锚点找到模板父级 DOM 恢复游标\n if (isFirstRender && node.tpData) {\n const parentDom = node.realAfter?.parentNode;\n if (parentDom) {\n cursor.setParent(parentDom);\n // 后续认领从 tp-after 锚点之后开始\n if (node.realAfter) cursor.setCurrent(node.realAfter);\n }\n return;\n }\n if (isFirstRender) cursor.leaveToParent(node);\n };\n\n const render = customRender({\n createNode,\n setProp,\n insertAfter,\n createAnchor,\n remove,\n firstChild,\n nextSib,\n beforeIndent,\n beforeLogicIndent,\n leaveNode,\n leaveLogicNode,\n // program() 遍历完模板后、flushMicroEffectManual 首次执行 effect 前切回首屏标志\n // 后续 for/if effect 中的 createNode 走浏览器新建路径,不再尝试从 SSR DOM 认领\n onBeforeFlush: () => {\n isFirstRender = false;\n }\n });\n\n return render(ComponentClass, rootEl);\n};\n"],"names":["BOOLEAN_ATTRS","Set","VALUE_PROP_TAGS","SVG_NS","MATH_NS","SVG_TAGS","MATH_TAGS","isNS","el","namespaceURI","createNode","name","doc","root","ownerDocument","document","createTextNode","has","createElementNS","createElement","CONTENT_FLAG","Symbol","setProp","node","key","value","textContent","startsWith","evtName","slice","addEventListener","removeEventListener","classList","toggle","id","removeAttribute","className","Array","isArray","names","Object","entries","filter","v","map","k","join","setAttribute","str","String","style","cssText","innerHTML","undefined","tagName","insertAfter","parent","prev","insertBefore","firstChild","nextSibling","createAnchor","createComment","remove","nextSib","beforeIndent","tag","toLowerCase","hasText","console","warn","render","customRender","TreeCursor","claimed","WeakSet","current","constructor","container","enterChildren","setParent","setCurrent","leaveToParent","parentNode","findUnclaimed","predicate","add","tryClaimElement","nodeType","tryClaimComment","data","tryClaimText","trim","hydrate","ComponentClass","rootEl","cursor","isFirstRender","browserSetProp","call","browserCreateNode","expectedNext","leaveNode","beforeLogicIndent","tpData","targetDom","leaveLogicNode","_isDedent","parentDom","realAfter","onBeforeFlush"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -6,13 +6,15 @@ declare function createNode(this: Interpreter, name: string): Node;
6
6
  declare const CONTENT_FLAG: unique symbol;
7
7
  declare function setProp(node: Node, key: string, value: any): (() => void) | undefined;
8
8
  declare function insertAfter(parent: Node, node: Node, prev: Node | null): void;
9
- declare function createAnchor(name: string): any;
9
+ declare function createAnchor(this: Interpreter, name: string): any;
10
10
  declare function remove(node: Node): void;
11
11
  declare function firstChild(node: Node): ChildNode;
12
12
  declare function nextSib(node: Node): ChildNode;
13
13
  declare function beforeIndent(node: Node): boolean | void;
14
14
  declare const render: {
15
- <T extends typeof bobe.Store>(Ctor: T, root: any): [bobe.LogicNode & {
15
+ <T extends typeof bobe.Store>(Ctor: T, root: any, options?: {
16
+ props?: Partial<Omit<InstanceType<T>, "ui" | "parent">>;
17
+ }): [bobe.LogicNode & {
16
18
  tokenizer: bobe.Tokenizer;
17
19
  fragmentSnapshot?: ReturnType<bobe.Tokenizer["snapshot"]>;
18
20
  resumeSnapshot?: ReturnType<bobe.Tokenizer["snapshot"]>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../src/render.ts","../src/render-hydrate.ts"],"sourcesContent":["import { customRender, Interpreter } from 'bobe';\n\nexport const BOOLEAN_ATTRS = new Set([\n 'disabled', 'readonly', 'checked', 'selected', 'hidden',\n 'multiple', 'required', 'autofocus', 'autoplay', 'controls',\n 'loop', 'muted', 'defer', 'async', 'reversed', 'open',\n 'itemscope', 'ismap', 'nohref', 'noshade', 'nowrap', 'compact', 'default'\n]);\n\nconst VALUE_PROP_TAGS = new Set(['INPUT', 'TEXTAREA', 'SELECT']);\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst MATH_NS = 'http://www.w3.org/1998/Math/MathML';\n\nconst SVG_TAGS = new Set([\n 'svg', 'animate', 'animateMotion', 'animateTransform', 'circle', 'clipPath',\n 'defs', 'desc', 'ellipse', 'feBlend', 'feColorMatrix', 'feComponentTransfer',\n 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap',\n 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG',\n 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology',\n 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile',\n 'feTurbulence', 'filter', 'foreignObject', 'g', 'image', 'line', 'linearGradient',\n 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline',\n 'radialGradient', 'rect', 'set', 'stop', 'switch', 'symbol', 'textPath',\n 'tspan', 'use', 'view'\n]);\n\nconst MATH_TAGS = new Set([\n 'math', 'maction', 'maligngroup', 'malignmark', 'menclose', 'merror',\n 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mlongdiv', 'mmultiscripts',\n 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mscarries',\n 'mscarry', 'msgroup', 'mstack', 'mspace', 'msqrt', 'msrow', 'mstyle', 'msub',\n 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover',\n 'semantics', 'annotation', 'annotation-xml'\n]);\n\nconst isNS = (el: Element) => el.namespaceURI === SVG_NS || el.namespaceURI === MATH_NS;\n\n// ---- exported for unit testing ----\n\nexport function createNode(this: Interpreter, name: string): Node {\n const doc = this.root?.ownerDocument || document;\n if (name === 'text') return doc.createTextNode('');\n if (MATH_TAGS.has(name)) return doc.createElementNS(MATH_NS, name);\n if (SVG_TAGS.has(name)) return doc.createElementNS(SVG_NS, name);\n return doc.createElement(name);\n};\n\nexport const CONTENT_FLAG = Symbol('hasContent');\n\nexport function setProp(node: Node, key: string, value: any): (() => void) | undefined {\n const el = node as HTMLElement;\n\n // 0. children\n if (key === 'children') {\n (node as any)[CONTENT_FLAG] = value != null;\n if (value == null) return;\n node.textContent = value;\n return;\n }\n\n // 1. 事件\n if (key.startsWith('on')) {\n const evtName = key.slice(2);\n node.addEventListener(evtName, value);\n return () => node.removeEventListener(evtName, value);\n }\n\n // 2. class\n if (key.startsWith('.')) {\n el.classList.toggle(key.slice(1), !!value);\n return;\n }\n\n if (key.startsWith('#')) {\n if (value) el.id = key.slice(1);\n else el.removeAttribute('id');\n return;\n }\n\n if (key === 'class') {\n if (value == null) {\n el.className = '';\n } else if (typeof value === 'object' && !Array.isArray(value)) {\n if (isNS(el)) {\n const names = Object.entries(value as Record<string, any>)\n .filter(([, v]) => !!v)\n .map(([k]) => k)\n .join(' ');\n el.setAttribute('class', names);\n } else {\n for (const k in value) {\n el.classList.toggle(k, !!(value as Record<string, any>)[k]);\n }\n }\n } else {\n const str = typeof value === 'boolean' ? (value ? 'true' : '') : String(value);\n if (isNS(el)) {\n el.setAttribute('class', str);\n } else {\n el.className = str;\n }\n }\n return;\n }\n\n // 3. style\n if (key === 'style') {\n if (value == null) {\n el.style.cssText = '';\n } else {\n el.style.cssText = String(value);\n }\n return;\n }\n\n // 4. html\n if (key === 'html') {\n (node as any)[CONTENT_FLAG] = value != null;\n if (value == null) return;\n (node as Element).innerHTML = String(value);\n return;\n }\n\n // 5. 布尔属性\n if (BOOLEAN_ATTRS.has(key)) {\n if (value === false || value === null || value === undefined) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, '');\n }\n return;\n }\n\n // 6. input/textarea/select value & checked\n if ((key === 'value' || key === 'checked') && VALUE_PROP_TAGS.has(el.tagName)) {\n (el as any)[key] = value;\n return;\n }\n\n // 7. SVG/MathML 元素\n if (isNS(el)) {\n if (value == null) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, String(value));\n }\n return;\n }\n\n // 8. data-* / aria-*\n if (key.startsWith('data-') || key.startsWith('aria-')) {\n if (value == null) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, String(value));\n }\n return;\n }\n\n // 9. 其余属性\n if (value == null) {\n el.removeAttribute(key);\n } else if (key in el) {\n (el as any)[key] = value;\n } else {\n el.setAttribute(key, String(value));\n }\n};\n\nexport function insertAfter(parent: Node, node: Node, prev: Node | null) {\n if (!prev) parent.insertBefore(node, parent.firstChild);\n else parent.insertBefore(node, prev.nextSibling);\n};\n\nexport function createAnchor(name: string) { \n const doc = this.root?.ownerDocument || document;\n return doc.createComment(name); \n}\n\nexport function remove(node: Node) { (node as Element).remove(); };\n\nexport function firstChild(node: Node) {return node.firstChild};\n\nexport function nextSib(node: Node) {return node.nextSibling;}\n\nexport function beforeIndent(node: Node): boolean | void {\n if ((node as any)[CONTENT_FLAG]) {\n const tag = (node as Element).tagName?.toLowerCase();\n const hasText = (node as HTMLElement).textContent != null;\n console.warn(`<${tag}> has ${hasText ? 'text' : 'html'} content and child elements — children ignored`);\n return false;\n }\n};\n\nexport const render = customRender({\n createNode,\n setProp,\n insertAfter,\n createAnchor,\n remove,\n firstChild,\n nextSib,\n beforeIndent\n});\n","import { customRender, Interpreter, Store } from 'bobe';\nimport {\n setProp as browserSetProp,\n createNode as browserCreateNode,\n remove,\n firstChild,\n nextSib,\n CONTENT_FLAG\n} from './render';\n\n// ====== TreeCursor ======\n\n/**\n * SSR DOM 认领游标。\n *\n * 工作方式:\n * - 维护一个 `parent` 指针,始终指向\"当前容器\"。\n * - `findUnclaimed` 只在 `parent.firstChild` 中平铺搜索(只搜一层,不递归)。\n * - 认领过的节点放入 `claimed` WeakSet,同一次遍历不会重复认领。\n *\n * 典型调用(以 hydrate 测试为例):\n * container.innerHTML = ssrHtml; // <div id=\"app1\"><div>SSR...</div></div>\n * hydrate(Ctor, container);\n *\n * hydrate 内部:\n * cursor = new TreeCursor(rootEl.parentNode); // 光标起点 = container,即 <div id=\"app1\">\n * createNode('div') → findUnclaimed 搜 <div id=\"app1\"> 的直接子级 → 找到 rootEl → 认领 ✅\n * beforeIndent → enterChildren(rootEl) // 光标进入 rootEl\n * createNode('nav') → findUnclaimed 搜 rootEl 的直接子级 → 找到 SSR <nav> → 认领 ✅\n *\n * 关键约束:游标只在当前层级搜索。这就是为什么光标起点必须在 container 层——让 App 的\n * 外层 div 在 container 的子级中被认领,而不是在 <body> 层误将 #app 当 div 认领走。\n */\nclass TreeCursor {\n /** 当前搜索容器——findUnclaimed 在此节点的 firstChild 链上搜索 */\n private parent: Node;\n /** 已认领节点集合,防止 DOM 重排导致误认领 */\n private claimed = new WeakSet<Node>();\n /** 当前层级最后一个被认领的节点,搜索从 nextSibling 起跳,跳过已遍历节点 */\n private current: Node | null = null;\n\n constructor(container: Node) {\n this.parent = container;\n }\n\n /** 进入子节点:后续 findUnclaimed 搜 node 的直接子级 */\n enterChildren(node: Node) {\n this.parent = node;\n this.current = null;\n }\n\n /** 直接设置游标父级(用于 tp 等需要跳转到非树位置的场景) */\n setParent(node: Node) {\n this.parent = node;\n this.current = null;\n }\n\n /** 设置当前指针,后续 findUnclaimed 从 node.nextSibling 开始 */\n setCurrent(node: Node) {\n this.current = node;\n }\n\n /** 退出当前节点,回到父级,恢复游标位置 */\n leaveToParent(node: Node) {\n if (node === this.parent && this.parent.parentNode) {\n this.parent = this.parent.parentNode;\n this.current = node;\n }\n }\n\n /** 在 this.parent 的 firstChild 链上查找第一个满足条件的节点 */\n private findUnclaimed(predicate: (node: Node) => boolean): Node | null {\n // 指针起跳 + WeakSet 兜底:指针失效(DOM 重排)时 wrapped 扫描,WeakSet 防重认\n let node = this.current?.nextSibling || this.parent.firstChild;\n while (node) {\n if (!this.claimed.has(node) && predicate(node)) {\n this.claimed.add(node);\n this.current = node;\n return node;\n }\n node = node.nextSibling;\n }\n return null;\n }\n\n /** 认领一个未使用的元素节点(按 tagName 匹配) */\n tryClaimElement(tagName: string): Element | null {\n return this.findUnclaimed(\n (node) => node.nodeType === 1 && (node as Element).tagName.toLowerCase() === tagName\n ) as Element | null;\n }\n\n /** 认领一个未使用的注释节点(按注释内容匹配) */\n tryClaimComment(name: string): Comment | null {\n return this.findUnclaimed(\n (node) => node.nodeType === 8 && (node as Comment).data === name\n ) as Comment | null;\n }\n\n /** 认领一个未使用的文本节点(非空文本) */\n tryClaimText(): Text | null {\n return this.findUnclaimed(\n (node) => node.nodeType === 3 && !!(node.textContent?.trim())\n ) as Text | null;\n }\n}\n\n// ====== 回调 ======\n\nexport const hydrate = (ComponentClass: typeof Store, rootEl: Element) => {\n const cursor = new TreeCursor(rootEl);\n // 首屏 render 期间(含 flushMicroEffectManual 中的 for/if effect 首次执行)为 true\n // 后续响应式更新为 false,createNode/createAnchor 直接创建新节点\n let isFirstRender = true;\n\n // 首屏时 text/html 的 DOM 内容已由 SSR 生成,跳过 innerHTML/textContent 赋值避免重绘\n // 但仍需设 CONTENT_FLAG 保证 beforeIndent 冲突检测正常\n function setProp (node: Node, key: string, value: any) {\n if (isFirstRender && (key === 'children' || key === 'html')) {\n (node as any)[CONTENT_FLAG] = value != null;\n return;\n }\n return browserSetProp.call(this,node, key, value);\n };\n\n function createNode (this: Interpreter, name: string): Node {\n const doc = this.root?.ownerDocument || document;\n if (isFirstRender) {\n const claimed = name === 'text'\n ? cursor.tryClaimText()\n : cursor.tryClaimElement(name);\n if (claimed) return claimed;\n }\n return name === 'text'\n ? doc.createTextNode('')\n : browserCreateNode.call(this, name);\n };\n\n function createAnchor (name: string): Comment {\n const doc = this.root?.ownerDocument || document;\n if (isFirstRender) {\n const claimed = cursor.tryClaimComment(name);\n if (claimed) return claimed;\n }\n return doc.createComment(name);\n };\n\n function insertAfter(parent: Node, node: Node, prev: Node | null) {\n if (node === parent) return;\n const expectedNext = prev ? prev.nextSibling : parent.firstChild;\n if (node === expectedNext) return;\n parent.insertBefore(node, expectedNext);\n };\n\n function beforeIndent(node: Node): boolean | void {\n if ((node as any)[CONTENT_FLAG]) {\n const tag = (node as Element).tagName?.toLowerCase();\n const hasText = (node as HTMLElement).textContent != null;\n console.warn(\n `<${tag}> has ${hasText ? 'text' : 'html'} content and child elements — children ignored`\n );\n return false;\n }\n if (isFirstRender) cursor.enterChildren(node);\n };\n\n function leaveNode (node: Node) {\n if (isFirstRender) cursor.leaveToParent(node);\n };\n\n // tp 节点进入 indent 时,将游标切入目标 DOM,使其子节点在正确位置认领\n function beforeLogicIndent (node: any) {\n if (isFirstRender && node.tpData) {\n const targetDom = node.tpData.node;\n if (targetDom) cursor.enterChildren(targetDom);\n }\n };\n\n function leaveLogicNode (node: any, _isDedent: boolean) {\n // tp 节点离开时,通过 realAfter 锚点找到模板父级 DOM 恢复游标\n if (isFirstRender && node.tpData) {\n const parentDom = node.realAfter?.parentNode;\n if (parentDom) {\n cursor.setParent(parentDom);\n // 后续认领从 tp-after 锚点之后开始\n if (node.realAfter) cursor.setCurrent(node.realAfter);\n }\n return;\n }\n if (isFirstRender) cursor.leaveToParent(node);\n };\n\n const render = customRender({\n createNode,\n setProp,\n insertAfter,\n createAnchor,\n remove,\n firstChild,\n nextSib,\n beforeIndent,\n beforeLogicIndent,\n leaveNode,\n leaveLogicNode,\n // program() 遍历完模板后、flushMicroEffectManual 首次执行 effect 前切回首屏标志\n // 后续 for/if effect 中的 createNode 走浏览器新建路径,不再尝试从 SSR DOM 认领\n onBeforeFlush: () => {\n isFirstRender = false;\n }\n });\n\n return render(ComponentClass, rootEl);\n};\n"],"names":["BOOLEAN_ATTRS","Set","VALUE_PROP_TAGS","SVG_NS","MATH_NS","SVG_TAGS","MATH_TAGS","isNS","el","namespaceURI","createNode","name","doc","root","ownerDocument","document","createTextNode","has","createElementNS","createElement","CONTENT_FLAG","Symbol","setProp","node","key","value","textContent","startsWith","evtName","slice","addEventListener","removeEventListener","classList","toggle","id","removeAttribute","className","Array","isArray","names","Object","entries","filter","v","map","k","join","setAttribute","str","String","style","cssText","innerHTML","undefined","tagName","insertAfter","parent","prev","insertBefore","firstChild","nextSibling","createAnchor","createComment","remove","nextSib","beforeIndent","tag","toLowerCase","hasText","console","warn","render","customRender","TreeCursor","claimed","WeakSet","current","constructor","container","enterChildren","setParent","setCurrent","leaveToParent","parentNode","findUnclaimed","predicate","add","tryClaimElement","nodeType","tryClaimComment","data","tryClaimText","trim","hydrate","ComponentClass","rootEl","cursor","isFirstRender","browserSetProp","call","browserCreateNode","expectedNext","leaveNode","beforeLogicIndent","tpData","targetDom","leaveLogicNode","_isDedent","parentDom","realAfter","onBeforeFlush"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.js","sources":["../src/render.ts","../src/render-hydrate.ts"],"sourcesContent":["import { customRender, Interpreter } from 'bobe';\n\nexport const BOOLEAN_ATTRS = new Set([\n 'disabled', 'readonly', 'checked', 'selected', 'hidden',\n 'multiple', 'required', 'autofocus', 'autoplay', 'controls',\n 'loop', 'muted', 'defer', 'async', 'reversed', 'open',\n 'itemscope', 'ismap', 'nohref', 'noshade', 'nowrap', 'compact', 'default'\n]);\n\nconst VALUE_PROP_TAGS = new Set(['INPUT', 'TEXTAREA', 'SELECT']);\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst MATH_NS = 'http://www.w3.org/1998/Math/MathML';\n\nconst SVG_TAGS = new Set([\n 'svg', 'animate', 'animateMotion', 'animateTransform', 'circle', 'clipPath',\n 'defs', 'desc', 'ellipse', 'feBlend', 'feColorMatrix', 'feComponentTransfer',\n 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap',\n 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG',\n 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology',\n 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile',\n 'feTurbulence', 'filter', 'foreignObject', 'g', 'image', 'line', 'linearGradient',\n 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline',\n 'radialGradient', 'rect', 'set', 'stop', 'switch', 'symbol', 'textPath',\n 'tspan', 'use', 'view'\n]);\n\nconst MATH_TAGS = new Set([\n 'math', 'maction', 'maligngroup', 'malignmark', 'menclose', 'merror',\n 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mlongdiv', 'mmultiscripts',\n 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mscarries',\n 'mscarry', 'msgroup', 'mstack', 'mspace', 'msqrt', 'msrow', 'mstyle', 'msub',\n 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover',\n 'semantics', 'annotation', 'annotation-xml'\n]);\n\nconst isNS = (el: Element) => el.namespaceURI === SVG_NS || el.namespaceURI === MATH_NS;\n\n// ---- exported for unit testing ----\n\nexport function createNode(this: Interpreter, name: string): Node {\n const doc = this.root?.ownerDocument || document;\n if (name === 'text') return doc.createTextNode('');\n if (MATH_TAGS.has(name)) return doc.createElementNS(MATH_NS, name);\n if (SVG_TAGS.has(name)) return doc.createElementNS(SVG_NS, name);\n return doc.createElement(name);\n};\n\nexport const CONTENT_FLAG = Symbol('hasContent');\n\nexport function setProp(node: Node, key: string, value: any): (() => void) | undefined {\n const el = node as HTMLElement;\n\n // 0. children\n if (key === 'children') {\n (node as any)[CONTENT_FLAG] = value != null;\n if (value == null) return;\n node.textContent = value;\n return;\n }\n\n // 1. 事件\n if (key.startsWith('on')) {\n const evtName = key.slice(2);\n node.addEventListener(evtName, value);\n return () => node.removeEventListener(evtName, value);\n }\n\n // 2. class\n if (key.startsWith('.')) {\n el.classList.toggle(key.slice(1), !!value);\n return;\n }\n\n if (key.startsWith('#')) {\n if (value) el.id = key.slice(1);\n else el.removeAttribute('id');\n return;\n }\n\n if (key === 'class') {\n if (value == null) {\n el.className = '';\n } else if (typeof value === 'object' && !Array.isArray(value)) {\n if (isNS(el)) {\n const names = Object.entries(value as Record<string, any>)\n .filter(([, v]) => !!v)\n .map(([k]) => k)\n .join(' ');\n el.setAttribute('class', names);\n } else {\n for (const k in value) {\n el.classList.toggle(k, !!(value as Record<string, any>)[k]);\n }\n }\n } else {\n const str = typeof value === 'boolean' ? (value ? 'true' : '') : String(value);\n if (isNS(el)) {\n el.setAttribute('class', str);\n } else {\n el.className = str;\n }\n }\n return;\n }\n\n // 3. style\n if (key === 'style') {\n if (value == null) {\n el.style.cssText = '';\n } else {\n el.style.cssText = String(value);\n }\n return;\n }\n\n // 4. html\n if (key === 'html') {\n (node as any)[CONTENT_FLAG] = value != null;\n if (value == null) return;\n (node as Element).innerHTML = String(value);\n return;\n }\n\n // 5. 布尔属性\n if (BOOLEAN_ATTRS.has(key)) {\n if (value === false || value === null || value === undefined) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, '');\n }\n return;\n }\n\n // 6. input/textarea/select value & checked\n if ((key === 'value' || key === 'checked') && VALUE_PROP_TAGS.has(el.tagName)) {\n (el as any)[key] = value;\n return;\n }\n\n // 7. SVG/MathML 元素\n if (isNS(el)) {\n if (value == null) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, String(value));\n }\n return;\n }\n\n // 8. data-* / aria-*\n if (key.startsWith('data-') || key.startsWith('aria-')) {\n if (value == null) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, String(value));\n }\n return;\n }\n\n // 9. 其余属性\n if (value == null) {\n el.removeAttribute(key);\n } else if (key in el) {\n (el as any)[key] = value;\n } else {\n el.setAttribute(key, String(value));\n }\n};\n\nexport function insertAfter(parent: Node, node: Node, prev: Node | null) {\n if (!prev) parent.insertBefore(node, parent.firstChild);\n else parent.insertBefore(node, prev.nextSibling);\n};\n\nexport function createAnchor(this: Interpreter, name: string) { \n const doc = this.root?.ownerDocument || document;\n return doc.createComment(name); \n}\n\nexport function remove(node: Node) { (node as Element).remove(); };\n\nexport function firstChild(node: Node) {return node.firstChild};\n\nexport function nextSib(node: Node) {return node.nextSibling;}\n\nexport function beforeIndent(node: Node): boolean | void {\n if ((node as any)[CONTENT_FLAG]) {\n const tag = (node as Element).tagName?.toLowerCase();\n const hasText = (node as HTMLElement).textContent != null;\n console.warn(`<${tag}> has ${hasText ? 'text' : 'html'} content and child elements — children ignored`);\n return false;\n }\n};\n\nexport const render = customRender({\n createNode,\n setProp,\n insertAfter,\n createAnchor,\n remove,\n firstChild,\n nextSib,\n beforeIndent\n});\n","import { customRender, Interpreter, Store } from 'bobe';\nimport {\n setProp as browserSetProp,\n createNode as browserCreateNode,\n remove,\n firstChild,\n nextSib,\n CONTENT_FLAG\n} from './render';\n\n// ====== TreeCursor ======\n\n/**\n * SSR DOM 认领游标。\n *\n * 工作方式:\n * - 维护一个 `parent` 指针,始终指向\"当前容器\"。\n * - `findUnclaimed` 只在 `parent.firstChild` 中平铺搜索(只搜一层,不递归)。\n * - 认领过的节点放入 `claimed` WeakSet,同一次遍历不会重复认领。\n *\n * 典型调用(以 hydrate 测试为例):\n * container.innerHTML = ssrHtml; // <div id=\"app1\"><div>SSR...</div></div>\n * hydrate(Ctor, container);\n *\n * hydrate 内部:\n * cursor = new TreeCursor(rootEl.parentNode); // 光标起点 = container,即 <div id=\"app1\">\n * createNode('div') → findUnclaimed 搜 <div id=\"app1\"> 的直接子级 → 找到 rootEl → 认领 ✅\n * beforeIndent → enterChildren(rootEl) // 光标进入 rootEl\n * createNode('nav') → findUnclaimed 搜 rootEl 的直接子级 → 找到 SSR <nav> → 认领 ✅\n *\n * 关键约束:游标只在当前层级搜索。这就是为什么光标起点必须在 container 层——让 App 的\n * 外层 div 在 container 的子级中被认领,而不是在 <body> 层误将 #app 当 div 认领走。\n */\nclass TreeCursor {\n /** 当前搜索容器——findUnclaimed 在此节点的 firstChild 链上搜索 */\n private parent: Node;\n /** 已认领节点集合,防止 DOM 重排导致误认领 */\n private claimed = new WeakSet<Node>();\n /** 当前层级最后一个被认领的节点,搜索从 nextSibling 起跳,跳过已遍历节点 */\n private current: Node | null = null;\n\n constructor(container: Node) {\n this.parent = container;\n }\n\n /** 进入子节点:后续 findUnclaimed 搜 node 的直接子级 */\n enterChildren(node: Node) {\n this.parent = node;\n this.current = null;\n }\n\n /** 直接设置游标父级(用于 tp 等需要跳转到非树位置的场景) */\n setParent(node: Node) {\n this.parent = node;\n this.current = null;\n }\n\n /** 设置当前指针,后续 findUnclaimed 从 node.nextSibling 开始 */\n setCurrent(node: Node) {\n this.current = node;\n }\n\n /** 退出当前节点,回到父级,恢复游标位置 */\n leaveToParent(node: Node) {\n if (node === this.parent && this.parent.parentNode) {\n this.parent = this.parent.parentNode;\n this.current = node;\n }\n }\n\n /** 在 this.parent 的 firstChild 链上查找第一个满足条件的节点 */\n private findUnclaimed(predicate: (node: Node) => boolean): Node | null {\n // 指针起跳 + WeakSet 兜底:指针失效(DOM 重排)时 wrapped 扫描,WeakSet 防重认\n let node = this.current?.nextSibling || this.parent.firstChild;\n while (node) {\n if (!this.claimed.has(node) && predicate(node)) {\n this.claimed.add(node);\n this.current = node;\n return node;\n }\n node = node.nextSibling;\n }\n return null;\n }\n\n /** 认领一个未使用的元素节点(按 tagName 匹配) */\n tryClaimElement(tagName: string): Element | null {\n return this.findUnclaimed(\n (node) => node.nodeType === 1 && (node as Element).tagName.toLowerCase() === tagName\n ) as Element | null;\n }\n\n /** 认领一个未使用的注释节点(按注释内容匹配) */\n tryClaimComment(name: string): Comment | null {\n return this.findUnclaimed(\n (node) => node.nodeType === 8 && (node as Comment).data === name\n ) as Comment | null;\n }\n\n /** 认领一个未使用的文本节点(非空文本) */\n tryClaimText(): Text | null {\n return this.findUnclaimed(\n (node) => node.nodeType === 3 && !!(node.textContent?.trim())\n ) as Text | null;\n }\n}\n\n// ====== 回调 ======\n\nexport const hydrate = (ComponentClass: typeof Store, rootEl: Element) => {\n const cursor = new TreeCursor(rootEl);\n // 首屏 render 期间(含 flushMicroEffectManual 中的 for/if effect 首次执行)为 true\n // 后续响应式更新为 false,createNode/createAnchor 直接创建新节点\n let isFirstRender = true;\n\n // 首屏时 text/html 的 DOM 内容已由 SSR 生成,跳过 innerHTML/textContent 赋值避免重绘\n // 但仍需设 CONTENT_FLAG 保证 beforeIndent 冲突检测正常\n function setProp (node: Node, key: string, value: any) {\n if (isFirstRender && (key === 'children' || key === 'html')) {\n (node as any)[CONTENT_FLAG] = value != null;\n return;\n }\n return browserSetProp.call(this,node, key, value);\n };\n\n function createNode (this: Interpreter, name: string): Node {\n const doc = this.root?.ownerDocument || document;\n if (isFirstRender) {\n const claimed = name === 'text'\n ? cursor.tryClaimText()\n : cursor.tryClaimElement(name);\n if (claimed) return claimed;\n }\n return name === 'text'\n ? doc.createTextNode('')\n : browserCreateNode.call(this, name);\n };\n\n function createAnchor (name: string): Comment {\n const doc = this.root?.ownerDocument || document;\n if (isFirstRender) {\n const claimed = cursor.tryClaimComment(name);\n if (claimed) return claimed;\n }\n return doc.createComment(name);\n };\n\n function insertAfter(parent: Node, node: Node, prev: Node | null) {\n if (node === parent) return;\n const expectedNext = prev ? prev.nextSibling : parent.firstChild;\n if (node === expectedNext) return;\n parent.insertBefore(node, expectedNext);\n };\n\n function beforeIndent(node: Node): boolean | void {\n if ((node as any)[CONTENT_FLAG]) {\n const tag = (node as Element).tagName?.toLowerCase();\n const hasText = (node as HTMLElement).textContent != null;\n console.warn(\n `<${tag}> has ${hasText ? 'text' : 'html'} content and child elements — children ignored`\n );\n return false;\n }\n if (isFirstRender) cursor.enterChildren(node);\n };\n\n function leaveNode (node: Node) {\n if (isFirstRender) cursor.leaveToParent(node);\n };\n\n // tp 节点进入 indent 时,将游标切入目标 DOM,使其子节点在正确位置认领\n function beforeLogicIndent (node: any) {\n if (isFirstRender && node.tpData) {\n const targetDom = node.tpData.node;\n if (targetDom) cursor.enterChildren(targetDom);\n }\n };\n\n function leaveLogicNode (node: any, _isDedent: boolean) {\n // tp 节点离开时,通过 realAfter 锚点找到模板父级 DOM 恢复游标\n if (isFirstRender && node.tpData) {\n const parentDom = node.realAfter?.parentNode;\n if (parentDom) {\n cursor.setParent(parentDom);\n // 后续认领从 tp-after 锚点之后开始\n if (node.realAfter) cursor.setCurrent(node.realAfter);\n }\n return;\n }\n if (isFirstRender) cursor.leaveToParent(node);\n };\n\n const render = customRender({\n createNode,\n setProp,\n insertAfter,\n createAnchor,\n remove,\n firstChild,\n nextSib,\n beforeIndent,\n beforeLogicIndent,\n leaveNode,\n leaveLogicNode,\n // program() 遍历完模板后、flushMicroEffectManual 首次执行 effect 前切回首屏标志\n // 后续 for/if effect 中的 createNode 走浏览器新建路径,不再尝试从 SSR DOM 认领\n onBeforeFlush: () => {\n isFirstRender = false;\n }\n });\n\n return render(ComponentClass, rootEl);\n};\n"],"names":["BOOLEAN_ATTRS","Set","VALUE_PROP_TAGS","SVG_NS","MATH_NS","SVG_TAGS","MATH_TAGS","isNS","el","namespaceURI","createNode","name","doc","root","ownerDocument","document","createTextNode","has","createElementNS","createElement","CONTENT_FLAG","Symbol","setProp","node","key","value","textContent","startsWith","evtName","slice","addEventListener","removeEventListener","classList","toggle","id","removeAttribute","className","Array","isArray","names","Object","entries","filter","v","map","k","join","setAttribute","str","String","style","cssText","innerHTML","undefined","tagName","insertAfter","parent","prev","insertBefore","firstChild","nextSibling","createAnchor","createComment","remove","nextSib","beforeIndent","tag","toLowerCase","hasText","console","warn","render","customRender","TreeCursor","claimed","WeakSet","current","constructor","container","enterChildren","setParent","setCurrent","leaveToParent","parentNode","findUnclaimed","predicate","add","tryClaimElement","nodeType","tryClaimComment","data","tryClaimText","trim","hydrate","ComponentClass","rootEl","cursor","isFirstRender","browserSetProp","call","browserCreateNode","expectedNext","leaveNode","beforeLogicIndent","tpData","targetDom","leaveLogicNode","_isDedent","parentDom","realAfter","onBeforeFlush"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bobe-dom",
3
- "version": "0.0.72",
3
+ "version": "0.0.73",
4
4
  "type": "module",
5
5
  "main": "dist/bobe-dom.cjs",
6
6
  "module": "dist/bobe-dom.esm.js",
@@ -15,7 +15,7 @@
15
15
  "htmlparser2": "^12.0.0",
16
16
  "iconify-icon": "^3.0.2",
17
17
  "marked": "^18.0.4",
18
- "bobe": "0.0.72"
18
+ "bobe": "0.0.73"
19
19
  },
20
20
  "devDependencies": {
21
21
  "vitest": "^4.1.7"