bobe-dom 0.0.71 → 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.
package/dist/bobe-dom.cjs CHANGED
@@ -9,14 +9,15 @@ const MATH_NS = 'http://www.w3.org/1998/Math/MathML';
9
9
  const SVG_TAGS = new Set(['svg', 'animate', 'animateMotion', 'animateTransform', 'circle', 'clipPath', 'defs', 'desc', 'ellipse', 'feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence', 'filter', 'foreignObject', 'g', 'image', 'line', 'linearGradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'set', 'stop', 'switch', 'symbol', 'textPath', 'tspan', 'use', 'view']);
10
10
  const MATH_TAGS = new Set(['math', 'maction', 'maligngroup', 'malignmark', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mlongdiv', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'mspace', 'msqrt', 'msrow', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover', 'semantics', 'annotation', 'annotation-xml']);
11
11
  const isNS = el => el.namespaceURI === SVG_NS || el.namespaceURI === MATH_NS;
12
- const createNode = name => {
13
- if (name === 'text') return document.createTextNode('');
14
- if (MATH_TAGS.has(name)) return document.createElementNS(MATH_NS, name);
15
- if (SVG_TAGS.has(name)) return document.createElementNS(SVG_NS, name);
16
- return document.createElement(name);
17
- };
12
+ function createNode(name) {
13
+ const doc = this.root?.ownerDocument || document;
14
+ if (name === 'text') return doc.createTextNode('');
15
+ if (MATH_TAGS.has(name)) return doc.createElementNS(MATH_NS, name);
16
+ if (SVG_TAGS.has(name)) return doc.createElementNS(SVG_NS, name);
17
+ return doc.createElement(name);
18
+ }
18
19
  const CONTENT_FLAG = Symbol('hasContent');
19
- const setProp = (node, key, value) => {
20
+ function setProp(node, key, value) {
20
21
  const el = node;
21
22
  if (key === 'children') {
22
23
  node[CONTENT_FLAG] = value != null;
@@ -108,26 +109,31 @@ const setProp = (node, key, value) => {
108
109
  } else {
109
110
  el.setAttribute(key, String(value));
110
111
  }
111
- };
112
- const insertAfter = (parent, node, prev) => {
112
+ }
113
+ function insertAfter(parent, node, prev) {
113
114
  if (!prev) parent.insertBefore(node, parent.firstChild);else parent.insertBefore(node, prev.nextSibling);
114
- };
115
- const createAnchor = name => document.createComment(name);
116
- const remove = node => {
115
+ }
116
+ function createAnchor(name) {
117
+ const doc = this.root?.ownerDocument || document;
118
+ return doc.createComment(name);
119
+ }
120
+ function remove(node) {
117
121
  node.remove();
118
- };
119
- const firstChild = node => node.firstChild;
120
- const nextSib = node => node.nextSibling;
121
- const beforeIndent = node => {
122
+ }
123
+ function firstChild(node) {
124
+ return node.firstChild;
125
+ }
126
+ function nextSib(node) {
127
+ return node.nextSibling;
128
+ }
129
+ function beforeIndent(node) {
122
130
  if (node[CONTENT_FLAG]) {
123
131
  const tag = node.tagName?.toLowerCase();
124
132
  const hasText = node.textContent != null;
125
133
  console.warn(`<${tag}> has ${hasText ? 'text' : 'html'} content and child elements — children ignored`);
126
134
  return false;
127
135
  }
128
- };
129
- const leaveNode = () => {};
130
- const leaveLogicNode = () => {};
136
+ }
131
137
  const render = bobe.customRender({
132
138
  createNode,
133
139
  setProp,
@@ -136,9 +142,7 @@ const render = bobe.customRender({
136
142
  remove,
137
143
  firstChild,
138
144
  nextSib,
139
- beforeIndent,
140
- leaveNode,
141
- leaveLogicNode
145
+ beforeIndent
142
146
  });
143
147
 
144
148
  class TreeCursor {
@@ -189,34 +193,36 @@ class TreeCursor {
189
193
  const hydrate = (ComponentClass, rootEl) => {
190
194
  const cursor = new TreeCursor(rootEl);
191
195
  let isFirstRender = true;
192
- const hydrateSetProp = (node, key, value) => {
196
+ function setProp$1(node, key, value) {
193
197
  if (isFirstRender && (key === 'children' || key === 'html')) {
194
198
  node[CONTENT_FLAG] = value != null;
195
199
  return;
196
200
  }
197
- return setProp(node, key, value);
198
- };
199
- const createNode$1 = name => {
201
+ return setProp.call(this, node, key, value);
202
+ }
203
+ function createNode$1(name) {
204
+ const doc = this.root?.ownerDocument || document;
200
205
  if (isFirstRender) {
201
206
  const claimed = name === 'text' ? cursor.tryClaimText() : cursor.tryClaimElement(name);
202
207
  if (claimed) return claimed;
203
208
  }
204
- return name === 'text' ? document.createTextNode('') : createNode(name);
205
- };
206
- const createAnchor = name => {
209
+ return name === 'text' ? doc.createTextNode('') : createNode.call(this, name);
210
+ }
211
+ function createAnchor(name) {
212
+ const doc = this.root?.ownerDocument || document;
207
213
  if (isFirstRender) {
208
214
  const claimed = cursor.tryClaimComment(name);
209
215
  if (claimed) return claimed;
210
216
  }
211
- return document.createComment(name);
212
- };
213
- const insertAfter = (parent, node, prev) => {
217
+ return doc.createComment(name);
218
+ }
219
+ function insertAfter(parent, node, prev) {
214
220
  if (node === parent) return;
215
221
  const expectedNext = prev ? prev.nextSibling : parent.firstChild;
216
222
  if (node === expectedNext) return;
217
223
  parent.insertBefore(node, expectedNext);
218
- };
219
- const beforeIndent = node => {
224
+ }
225
+ function beforeIndent(node) {
220
226
  if (node[CONTENT_FLAG]) {
221
227
  const tag = node.tagName?.toLowerCase();
222
228
  const hasText = node.textContent != null;
@@ -224,17 +230,17 @@ const hydrate = (ComponentClass, rootEl) => {
224
230
  return false;
225
231
  }
226
232
  if (isFirstRender) cursor.enterChildren(node);
227
- };
228
- const leaveNode = node => {
233
+ }
234
+ function leaveNode(node) {
229
235
  if (isFirstRender) cursor.leaveToParent(node);
230
- };
231
- const beforeLogicIndent = node => {
236
+ }
237
+ function beforeLogicIndent(node) {
232
238
  if (isFirstRender && node.tpData) {
233
239
  const targetDom = node.tpData.node;
234
240
  if (targetDom) cursor.enterChildren(targetDom);
235
241
  }
236
- };
237
- const leaveLogicNode = (node, _isDedent) => {
242
+ }
243
+ function leaveLogicNode(node, _isDedent) {
238
244
  if (isFirstRender && node.tpData) {
239
245
  const parentDom = node.realAfter?.parentNode;
240
246
  if (parentDom) {
@@ -244,10 +250,10 @@ const hydrate = (ComponentClass, rootEl) => {
244
250
  return;
245
251
  }
246
252
  if (isFirstRender) cursor.leaveToParent(node);
247
- };
253
+ }
248
254
  const render = bobe.customRender({
249
255
  createNode: createNode$1,
250
- setProp: hydrateSetProp,
256
+ setProp: setProp$1,
251
257
  insertAfter,
252
258
  createAnchor,
253
259
  remove,
@@ -272,8 +278,6 @@ exports.createNode = createNode;
272
278
  exports.firstChild = firstChild;
273
279
  exports.hydrate = hydrate;
274
280
  exports.insertAfter = insertAfter;
275
- exports.leaveLogicNode = leaveLogicNode;
276
- exports.leaveNode = leaveNode;
277
281
  exports.nextSib = nextSib;
278
282
  exports.remove = remove;
279
283
  exports.render = render;
@@ -1 +1 @@
1
- {"version":3,"file":"bobe-dom.cjs","sources":["../src/render.ts","../src/render-hydrate.ts"],"sourcesContent":["import { customRender } 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 const createNode = (name: string): Node => {\n if (name === 'text') return document.createTextNode('');\n if (MATH_TAGS.has(name)) return document.createElementNS(MATH_NS, name);\n if (SVG_TAGS.has(name)) return document.createElementNS(SVG_NS, name);\n return document.createElement(name);\n};\n\nexport const CONTENT_FLAG = Symbol('hasContent');\n\nexport const 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 const 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 const createAnchor = (name: string) => document.createComment(name);\n\nexport const remove = (node: Node) => { (node as Element).remove(); };\n\nexport const firstChild = (node: Node) => node.firstChild;\n\nexport const nextSib = (node: Node) => node.nextSibling;\n\nexport const 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\n// 浏览器渲染器中 leave 不需要额外操作(DOM 插入已由 insertAfter 完成)\nexport const leaveNode = () => {};\nexport const leaveLogicNode = () => {};\n\nexport const render = customRender({\n createNode,\n setProp,\n insertAfter,\n createAnchor,\n remove,\n firstChild,\n nextSib,\n beforeIndent,\n leaveNode,\n leaveLogicNode\n});\n","import { customRender, Store } from 'bobe';\nimport {\n setProp,\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 const hydrateSetProp = (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 setProp(node, key, value);\n };\n\n const createNode = (name: string): Node => {\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 ? document.createTextNode('')\n : browserCreateNode(name);\n };\n\n const createAnchor = (name: string): Comment => {\n if (isFirstRender) {\n const claimed = cursor.tryClaimComment(name);\n if (claimed) return claimed;\n }\n return document.createComment(name);\n };\n\n const 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 const 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 const leaveNode = (node: Node) => {\n if (isFirstRender) cursor.leaveToParent(node);\n };\n\n // tp 节点进入 indent 时,将游标切入目标 DOM,使其子节点在正确位置认领\n const beforeLogicIndent = (node: any) => {\n if (isFirstRender && node.tpData) {\n const targetDom = node.tpData.node;\n if (targetDom) cursor.enterChildren(targetDom);\n }\n };\n\n const 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: hydrateSetProp,\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","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","leaveNode","leaveLogicNode","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","hydrateSetProp","browserCreateNode","expectedNext","beforeLogicIndent","tpData","targetDom","_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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"}
@@ -7,14 +7,15 @@ const MATH_NS = 'http://www.w3.org/1998/Math/MathML';
7
7
  const SVG_TAGS = new Set(['svg', 'animate', 'animateMotion', 'animateTransform', 'circle', 'clipPath', 'defs', 'desc', 'ellipse', 'feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence', 'filter', 'foreignObject', 'g', 'image', 'line', 'linearGradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'set', 'stop', 'switch', 'symbol', 'textPath', 'tspan', 'use', 'view']);
8
8
  const MATH_TAGS = new Set(['math', 'maction', 'maligngroup', 'malignmark', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mlongdiv', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'mspace', 'msqrt', 'msrow', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover', 'semantics', 'annotation', 'annotation-xml']);
9
9
  const isNS = el => el.namespaceURI === SVG_NS || el.namespaceURI === MATH_NS;
10
- const createNode = name => {
11
- if (name === 'text') return document.createTextNode('');
12
- if (MATH_TAGS.has(name)) return document.createElementNS(MATH_NS, name);
13
- if (SVG_TAGS.has(name)) return document.createElementNS(SVG_NS, name);
14
- return document.createElement(name);
15
- };
10
+ function createNode(name) {
11
+ const doc = this.root?.ownerDocument || document;
12
+ if (name === 'text') return doc.createTextNode('');
13
+ if (MATH_TAGS.has(name)) return doc.createElementNS(MATH_NS, name);
14
+ if (SVG_TAGS.has(name)) return doc.createElementNS(SVG_NS, name);
15
+ return doc.createElement(name);
16
+ }
16
17
  const CONTENT_FLAG = Symbol('hasContent');
17
- const setProp = (node, key, value) => {
18
+ function setProp(node, key, value) {
18
19
  const el = node;
19
20
  if (key === 'children') {
20
21
  node[CONTENT_FLAG] = value != null;
@@ -106,26 +107,31 @@ const setProp = (node, key, value) => {
106
107
  } else {
107
108
  el.setAttribute(key, String(value));
108
109
  }
109
- };
110
- const insertAfter = (parent, node, prev) => {
110
+ }
111
+ function insertAfter(parent, node, prev) {
111
112
  if (!prev) parent.insertBefore(node, parent.firstChild);else parent.insertBefore(node, prev.nextSibling);
112
- };
113
- const createAnchor = name => document.createComment(name);
114
- const remove = node => {
113
+ }
114
+ function createAnchor(name) {
115
+ const doc = this.root?.ownerDocument || document;
116
+ return doc.createComment(name);
117
+ }
118
+ function remove(node) {
115
119
  node.remove();
116
- };
117
- const firstChild = node => node.firstChild;
118
- const nextSib = node => node.nextSibling;
119
- const beforeIndent = node => {
120
+ }
121
+ function firstChild(node) {
122
+ return node.firstChild;
123
+ }
124
+ function nextSib(node) {
125
+ return node.nextSibling;
126
+ }
127
+ function beforeIndent(node) {
120
128
  if (node[CONTENT_FLAG]) {
121
129
  const tag = node.tagName?.toLowerCase();
122
130
  const hasText = node.textContent != null;
123
131
  console.warn(`<${tag}> has ${hasText ? 'text' : 'html'} content and child elements — children ignored`);
124
132
  return false;
125
133
  }
126
- };
127
- const leaveNode = () => {};
128
- const leaveLogicNode = () => {};
134
+ }
129
135
  const render = customRender({
130
136
  createNode,
131
137
  setProp,
@@ -134,9 +140,7 @@ const render = customRender({
134
140
  remove,
135
141
  firstChild,
136
142
  nextSib,
137
- beforeIndent,
138
- leaveNode,
139
- leaveLogicNode
143
+ beforeIndent
140
144
  });
141
145
 
142
146
  class TreeCursor {
@@ -187,34 +191,36 @@ class TreeCursor {
187
191
  const hydrate = (ComponentClass, rootEl) => {
188
192
  const cursor = new TreeCursor(rootEl);
189
193
  let isFirstRender = true;
190
- const hydrateSetProp = (node, key, value) => {
194
+ function setProp$1(node, key, value) {
191
195
  if (isFirstRender && (key === 'children' || key === 'html')) {
192
196
  node[CONTENT_FLAG] = value != null;
193
197
  return;
194
198
  }
195
- return setProp(node, key, value);
196
- };
197
- const createNode$1 = name => {
199
+ return setProp.call(this, node, key, value);
200
+ }
201
+ function createNode$1(name) {
202
+ const doc = this.root?.ownerDocument || document;
198
203
  if (isFirstRender) {
199
204
  const claimed = name === 'text' ? cursor.tryClaimText() : cursor.tryClaimElement(name);
200
205
  if (claimed) return claimed;
201
206
  }
202
- return name === 'text' ? document.createTextNode('') : createNode(name);
203
- };
204
- const createAnchor = name => {
207
+ return name === 'text' ? doc.createTextNode('') : createNode.call(this, name);
208
+ }
209
+ function createAnchor(name) {
210
+ const doc = this.root?.ownerDocument || document;
205
211
  if (isFirstRender) {
206
212
  const claimed = cursor.tryClaimComment(name);
207
213
  if (claimed) return claimed;
208
214
  }
209
- return document.createComment(name);
210
- };
211
- const insertAfter = (parent, node, prev) => {
215
+ return doc.createComment(name);
216
+ }
217
+ function insertAfter(parent, node, prev) {
212
218
  if (node === parent) return;
213
219
  const expectedNext = prev ? prev.nextSibling : parent.firstChild;
214
220
  if (node === expectedNext) return;
215
221
  parent.insertBefore(node, expectedNext);
216
- };
217
- const beforeIndent = node => {
222
+ }
223
+ function beforeIndent(node) {
218
224
  if (node[CONTENT_FLAG]) {
219
225
  const tag = node.tagName?.toLowerCase();
220
226
  const hasText = node.textContent != null;
@@ -222,17 +228,17 @@ const hydrate = (ComponentClass, rootEl) => {
222
228
  return false;
223
229
  }
224
230
  if (isFirstRender) cursor.enterChildren(node);
225
- };
226
- const leaveNode = node => {
231
+ }
232
+ function leaveNode(node) {
227
233
  if (isFirstRender) cursor.leaveToParent(node);
228
- };
229
- const beforeLogicIndent = node => {
234
+ }
235
+ function beforeLogicIndent(node) {
230
236
  if (isFirstRender && node.tpData) {
231
237
  const targetDom = node.tpData.node;
232
238
  if (targetDom) cursor.enterChildren(targetDom);
233
239
  }
234
- };
235
- const leaveLogicNode = (node, _isDedent) => {
240
+ }
241
+ function leaveLogicNode(node, _isDedent) {
236
242
  if (isFirstRender && node.tpData) {
237
243
  const parentDom = node.realAfter?.parentNode;
238
244
  if (parentDom) {
@@ -242,10 +248,10 @@ const hydrate = (ComponentClass, rootEl) => {
242
248
  return;
243
249
  }
244
250
  if (isFirstRender) cursor.leaveToParent(node);
245
- };
251
+ }
246
252
  const render = customRender({
247
253
  createNode: createNode$1,
248
- setProp: hydrateSetProp,
254
+ setProp: setProp$1,
249
255
  insertAfter,
250
256
  createAnchor,
251
257
  remove,
@@ -262,5 +268,5 @@ const hydrate = (ComponentClass, rootEl) => {
262
268
  return render(ComponentClass, rootEl);
263
269
  };
264
270
 
265
- export { BOOLEAN_ATTRS, CONTENT_FLAG, beforeIndent, createAnchor, createNode, firstChild, hydrate, insertAfter, leaveLogicNode, leaveNode, nextSib, remove, render, setProp };
271
+ export { BOOLEAN_ATTRS, CONTENT_FLAG, beforeIndent, createAnchor, createNode, firstChild, hydrate, insertAfter, nextSib, remove, render, setProp };
266
272
  //# sourceMappingURL=bobe-dom.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bobe-dom.esm.js","sources":["../src/render.ts","../src/render-hydrate.ts"],"sourcesContent":["import { customRender } 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 const createNode = (name: string): Node => {\n if (name === 'text') return document.createTextNode('');\n if (MATH_TAGS.has(name)) return document.createElementNS(MATH_NS, name);\n if (SVG_TAGS.has(name)) return document.createElementNS(SVG_NS, name);\n return document.createElement(name);\n};\n\nexport const CONTENT_FLAG = Symbol('hasContent');\n\nexport const 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 const 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 const createAnchor = (name: string) => document.createComment(name);\n\nexport const remove = (node: Node) => { (node as Element).remove(); };\n\nexport const firstChild = (node: Node) => node.firstChild;\n\nexport const nextSib = (node: Node) => node.nextSibling;\n\nexport const 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\n// 浏览器渲染器中 leave 不需要额外操作(DOM 插入已由 insertAfter 完成)\nexport const leaveNode = () => {};\nexport const leaveLogicNode = () => {};\n\nexport const render = customRender({\n createNode,\n setProp,\n insertAfter,\n createAnchor,\n remove,\n firstChild,\n nextSib,\n beforeIndent,\n leaveNode,\n leaveLogicNode\n});\n","import { customRender, Store } from 'bobe';\nimport {\n setProp,\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 const hydrateSetProp = (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 setProp(node, key, value);\n };\n\n const createNode = (name: string): Node => {\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 ? document.createTextNode('')\n : browserCreateNode(name);\n };\n\n const createAnchor = (name: string): Comment => {\n if (isFirstRender) {\n const claimed = cursor.tryClaimComment(name);\n if (claimed) return claimed;\n }\n return document.createComment(name);\n };\n\n const 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 const 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 const leaveNode = (node: Node) => {\n if (isFirstRender) cursor.leaveToParent(node);\n };\n\n // tp 节点进入 indent 时,将游标切入目标 DOM,使其子节点在正确位置认领\n const beforeLogicIndent = (node: any) => {\n if (isFirstRender && node.tpData) {\n const targetDom = node.tpData.node;\n if (targetDom) cursor.enterChildren(targetDom);\n }\n };\n\n const 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: hydrateSetProp,\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","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","leaveNode","leaveLogicNode","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","hydrateSetProp","browserCreateNode","expectedNext","beforeLogicIndent","tpData","targetDom","_isDedent","parentDom","realAfter","onBeforeFlush"],"mappings":";;AAEO,MAAMA,aAAa,GAAG,IAAIC,GAAG,CAAC,CACnC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EACvD,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAC3D,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EACrD,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,CAC1E;AAED,MAAMC,eAAe,GAAG,IAAID,GAAG,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;AAEhE,MAAME,MAAM,GAAG,4BAA4B;AAC3C,MAAMC,OAAO,GAAG,oCAAoC;AAEpD,MAAMC,QAAQ,GAAG,IAAIJ,GAAG,CAAC,CACvB,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,kBAAkB,EAAE,QAAQ,EAAE,UAAU,EAC3E,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,qBAAqB,EAC5E,aAAa,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,mBAAmB,EAC3E,gBAAgB,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAC5E,SAAS,EAAE,gBAAgB,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAChF,UAAU,EAAE,cAAc,EAAE,oBAAoB,EAAE,aAAa,EAAE,QAAQ,EACzE,cAAc,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EACjF,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAC/E,gBAAgB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EACvE,OAAO,EAAE,KAAK,EAAE,MAAM,CACvB,CAAC;AAEF,MAAMK,SAAS,GAAG,IAAIL,GAAG,CAAC,CACxB,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EACpE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAC7E,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAC9E,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAC5E,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAC1E,WAAW,EAAE,YAAY,EAAE,gBAAgB,CAC5C,CAAC;AAEF,MAAMM,IAAI,GAAIC,EAAW,IAAKA,EAAE,CAACC,YAAY,KAAKN,MAAM,IAAIK,EAAE,CAACC,YAAY,KAAKL,OAAO;AAIhF,MAAMM,UAAU,GAAIC,IAAY,IAAW;EAChD,IAAIA,IAAI,KAAK,MAAM,EAAE,OAAOC,QAAQ,CAACC,cAAc,CAAC,EAAE,CAAC;AACvD,EAAA,IAAIP,SAAS,CAACQ,GAAG,CAACH,IAAI,CAAC,EAAE,OAAOC,QAAQ,CAACG,eAAe,CAACX,OAAO,EAAEO,IAAI,CAAC;AACvE,EAAA,IAAIN,QAAQ,CAACS,GAAG,CAACH,IAAI,CAAC,EAAE,OAAOC,QAAQ,CAACG,eAAe,CAACZ,MAAM,EAAEQ,IAAI,CAAC;AACrE,EAAA,OAAOC,QAAQ,CAACI,aAAa,CAACL,IAAI,CAAC;AACrC;MAEaM,YAAY,GAAGC,MAAM,CAAC,YAAY;AAExC,MAAMC,OAAO,GAAGA,CAACC,IAAU,EAAEC,GAAW,EAAEC,KAAU,KAA+B;EACxF,MAAMd,EAAE,GAAGY,IAAmB;EAG9B,IAAIC,GAAG,KAAK,UAAU,EAAE;AACrBD,IAAAA,IAAI,CAASH,YAAY,CAAC,GAAGK,KAAK,IAAI,IAAI;IAC3C,IAAIA,KAAK,IAAI,IAAI,EAAE;IACnBF,IAAI,CAACG,WAAW,GAAGD,KAAK;AACxB,IAAA;AACF,EAAA;AAGA,EAAA,IAAID,GAAG,CAACG,UAAU,CAAC,IAAI,CAAC,EAAE;AACxB,IAAA,MAAMC,OAAO,GAAGJ,GAAG,CAACK,KAAK,CAAC,CAAC,CAAC;AAC5BN,IAAAA,IAAI,CAACO,gBAAgB,CAACF,OAAO,EAAEH,KAAK,CAAC;IACrC,OAAO,MAAMF,IAAI,CAACQ,mBAAmB,CAACH,OAAO,EAAEH,KAAK,CAAC;AACvD,EAAA;AAGA,EAAA,IAAID,GAAG,CAACG,UAAU,CAAC,GAAG,CAAC,EAAE;AACvBhB,IAAAA,EAAE,CAACqB,SAAS,CAACC,MAAM,CAACT,GAAG,CAACK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAACJ,KAAK,CAAC;AAC1C,IAAA;AACF,EAAA;AAEA,EAAA,IAAID,GAAG,CAACG,UAAU,CAAC,GAAG,CAAC,EAAE;AACvB,IAAA,IAAIF,KAAK,EAAEd,EAAE,CAACuB,EAAE,GAAGV,GAAG,CAACK,KAAK,CAAC,CAAC,CAAC,CAAC,KAC3BlB,EAAE,CAACwB,eAAe,CAAC,IAAI,CAAC;AAC7B,IAAA;AACF,EAAA;EAEA,IAAIX,GAAG,KAAK,OAAO,EAAE;IACnB,IAAIC,KAAK,IAAI,IAAI,EAAE;MACjBd,EAAE,CAACyB,SAAS,GAAG,EAAE;AACnB,IAAA,CAAC,MAAM,IAAI,OAAOX,KAAK,KAAK,QAAQ,IAAI,CAACY,KAAK,CAACC,OAAO,CAACb,KAAK,CAAC,EAAE;AAC7D,MAAA,IAAIf,IAAI,CAACC,EAAE,CAAC,EAAE;AACZ,QAAA,MAAM4B,KAAK,GAAGC,MAAM,CAACC,OAAO,CAAChB,KAA4B,CAAC,CACvDiB,MAAM,CAAC,CAAC,GAAGC,CAAC,CAAC,KAAK,CAAC,CAACA,CAAC,CAAC,CACtBC,GAAG,CAAC,CAAC,CAACC,CAAC,CAAC,KAAKA,CAAC,CAAC,CACfC,IAAI,CAAC,GAAG,CAAC;AACZnC,QAAAA,EAAE,CAACoC,YAAY,CAAC,OAAO,EAAER,KAAK,CAAC;AACjC,MAAA,CAAC,MAAM;AACL,QAAA,KAAK,MAAMM,CAAC,IAAIpB,KAAK,EAAE;AACrBd,UAAAA,EAAE,CAACqB,SAAS,CAACC,MAAM,CAACY,CAAC,EAAE,CAAC,CAAEpB,KAAK,CAAyBoB,CAAC,CAAC,CAAC;AAC7D,QAAA;AACF,MAAA;AACF,IAAA,CAAC,MAAM;AACL,MAAA,MAAMG,GAAG,GAAG,OAAOvB,KAAK,KAAK,SAAS,GAAIA,KAAK,GAAG,MAAM,GAAG,EAAE,GAAIwB,MAAM,CAACxB,KAAK,CAAC;AAC9E,MAAA,IAAIf,IAAI,CAACC,EAAE,CAAC,EAAE;AACZA,QAAAA,EAAE,CAACoC,YAAY,CAAC,OAAO,EAAEC,GAAG,CAAC;AAC/B,MAAA,CAAC,MAAM;QACLrC,EAAE,CAACyB,SAAS,GAAGY,GAAG;AACpB,MAAA;AACF,IAAA;AACA,IAAA;AACF,EAAA;EAGA,IAAIxB,GAAG,KAAK,OAAO,EAAE;IACnB,IAAIC,KAAK,IAAI,IAAI,EAAE;AACjBd,MAAAA,EAAE,CAACuC,KAAK,CAACC,OAAO,GAAG,EAAE;AACvB,IAAA,CAAC,MAAM;MACLxC,EAAE,CAACuC,KAAK,CAACC,OAAO,GAAGF,MAAM,CAACxB,KAAK,CAAC;AAClC,IAAA;AACA,IAAA;AACF,EAAA;EAGA,IAAID,GAAG,KAAK,MAAM,EAAE;AACjBD,IAAAA,IAAI,CAASH,YAAY,CAAC,GAAGK,KAAK,IAAI,IAAI;IAC3C,IAAIA,KAAK,IAAI,IAAI,EAAE;AAClBF,IAAAA,IAAI,CAAa6B,SAAS,GAAGH,MAAM,CAACxB,KAAK,CAAC;AAC3C,IAAA;AACF,EAAA;AAGA,EAAA,IAAItB,aAAa,CAACc,GAAG,CAACO,GAAG,CAAC,EAAE;IAC1B,IAAIC,KAAK,KAAK,KAAK,IAAIA,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAK4B,SAAS,EAAE;AAC5D1C,MAAAA,EAAE,CAACwB,eAAe,CAACX,GAAG,CAAC;AACzB,IAAA,CAAC,MAAM;AACLb,MAAAA,EAAE,CAACoC,YAAY,CAACvB,GAAG,EAAE,EAAE,CAAC;AAC1B,IAAA;AACA,IAAA;AACF,EAAA;AAGA,EAAA,IAAI,CAACA,GAAG,KAAK,OAAO,IAAIA,GAAG,KAAK,SAAS,KAAKnB,eAAe,CAACY,GAAG,CAACN,EAAE,CAAC2C,OAAO,CAAC,EAAE;AAC5E3C,IAAAA,EAAE,CAASa,GAAG,CAAC,GAAGC,KAAK;AACxB,IAAA;AACF,EAAA;AAGA,EAAA,IAAIf,IAAI,CAACC,EAAE,CAAC,EAAE;IACZ,IAAIc,KAAK,IAAI,IAAI,EAAE;AACjBd,MAAAA,EAAE,CAACwB,eAAe,CAACX,GAAG,CAAC;AACzB,IAAA,CAAC,MAAM;MACLb,EAAE,CAACoC,YAAY,CAACvB,GAAG,EAAEyB,MAAM,CAACxB,KAAK,CAAC,CAAC;AACrC,IAAA;AACA,IAAA;AACF,EAAA;AAGA,EAAA,IAAID,GAAG,CAACG,UAAU,CAAC,OAAO,CAAC,IAAIH,GAAG,CAACG,UAAU,CAAC,OAAO,CAAC,EAAE;IACtD,IAAIF,KAAK,IAAI,IAAI,EAAE;AACjBd,MAAAA,EAAE,CAACwB,eAAe,CAACX,GAAG,CAAC;AACzB,IAAA,CAAC,MAAM;MACLb,EAAE,CAACoC,YAAY,CAACvB,GAAG,EAAEyB,MAAM,CAACxB,KAAK,CAAC,CAAC;AACrC,IAAA;AACA,IAAA;AACF,EAAA;EAGA,IAAIA,KAAK,IAAI,IAAI,EAAE;AACjBd,IAAAA,EAAE,CAACwB,eAAe,CAACX,GAAG,CAAC;AACzB,EAAA,CAAC,MAAM,IAAIA,GAAG,IAAIb,EAAE,EAAE;AACnBA,IAAAA,EAAE,CAASa,GAAG,CAAC,GAAGC,KAAK;AAC1B,EAAA,CAAC,MAAM;IACLd,EAAE,CAACoC,YAAY,CAACvB,GAAG,EAAEyB,MAAM,CAACxB,KAAK,CAAC,CAAC;AACrC,EAAA;AACF;AAEO,MAAM8B,WAAW,GAAGA,CAACC,MAAY,EAAEjC,IAAU,EAAEkC,IAAiB,KAAK;EAC1E,IAAI,CAACA,IAAI,EAAED,MAAM,CAACE,YAAY,CAACnC,IAAI,EAAEiC,MAAM,CAACG,UAAU,CAAC,CAAC,KACnDH,MAAM,CAACE,YAAY,CAACnC,IAAI,EAAEkC,IAAI,CAACG,WAAW,CAAC;AAClD;AAEO,MAAMC,YAAY,GAAI/C,IAAY,IAAKC,QAAQ,CAAC+C,aAAa,CAAChD,IAAI;AAElE,MAAMiD,MAAM,GAAIxC,IAAU,IAAK;EAAGA,IAAI,CAAawC,MAAM,EAAE;AAAE;MAEvDJ,UAAU,GAAIpC,IAAU,IAAKA,IAAI,CAACoC;MAElCK,OAAO,GAAIzC,IAAU,IAAKA,IAAI,CAACqC;AAErC,MAAMK,YAAY,GAAI1C,IAAU,IAAqB;AAC1D,EAAA,IAAKA,IAAI,CAASH,YAAY,CAAC,EAAE;IAC/B,MAAM8C,GAAG,GAAI3C,IAAI,CAAa+B,OAAO,EAAEa,WAAW,EAAE;AACpD,IAAA,MAAMC,OAAO,GAAI7C,IAAI,CAAiBG,WAAW,IAAI,IAAI;AACzD2C,IAAAA,OAAO,CAACC,IAAI,CAAC,CAAA,CAAA,EAAIJ,GAAG,CAAA,MAAA,EAASE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA,8CAAA,CAAgD,CAAC;AACvG,IAAA,OAAO,KAAK;AACd,EAAA;AACF;MAGaG,SAAS,GAAGA,MAAM,CAAC;MACnBC,cAAc,GAAGA,MAAM,CAAC;AAE9B,MAAMC,MAAM,GAAGC,YAAY,CAAC;EACjC7D,UAAU;EACVS,OAAO;EACPiC,WAAW;EACXM,YAAY;EACZE,MAAM;EACNJ,UAAU;EACVK,OAAO;EACPC,YAAY;EACZM,SAAS;AACTC,EAAAA;AACF,CAAC;;AC7KD,MAAMG,UAAU,CAAC;AAIPC,EAAAA,OAAO,GAAG,IAAIC,OAAO,EAAQ;AAE7BC,EAAAA,OAAO,GAAgB,IAAI;EAEnCC,WAAWA,CAACC,SAAe,EAAE;IAC3B,IAAI,CAACxB,MAAM,GAAGwB,SAAS;AACzB,EAAA;EAGAC,aAAaA,CAAC1D,IAAU,EAAE;IACxB,IAAI,CAACiC,MAAM,GAAGjC,IAAI;IAClB,IAAI,CAACuD,OAAO,GAAG,IAAI;AACrB,EAAA;EAGAI,SAASA,CAAC3D,IAAU,EAAE;IACpB,IAAI,CAACiC,MAAM,GAAGjC,IAAI;IAClB,IAAI,CAACuD,OAAO,GAAG,IAAI;AACrB,EAAA;EAGAK,UAAUA,CAAC5D,IAAU,EAAE;IACrB,IAAI,CAACuD,OAAO,GAAGvD,IAAI;AACrB,EAAA;EAGA6D,aAAaA,CAAC7D,IAAU,EAAE;IACxB,IAAIA,IAAI,KAAK,IAAI,CAACiC,MAAM,IAAI,IAAI,CAACA,MAAM,CAAC6B,UAAU,EAAE;AAClD,MAAA,IAAI,CAAC7B,MAAM,GAAG,IAAI,CAACA,MAAM,CAAC6B,UAAU;MACpC,IAAI,CAACP,OAAO,GAAGvD,IAAI;AACrB,IAAA;AACF,EAAA;EAGQ+D,aAAaA,CAACC,SAAkC,EAAe;AAErE,IAAA,IAAIhE,IAAI,GAAG,IAAI,CAACuD,OAAO,EAAElB,WAAW,IAAI,IAAI,CAACJ,MAAM,CAACG,UAAU;AAC9D,IAAA,OAAOpC,IAAI,EAAE;AACX,MAAA,IAAI,CAAC,IAAI,CAACqD,OAAO,CAAC3D,GAAG,CAACM,IAAI,CAAC,IAAIgE,SAAS,CAAChE,IAAI,CAAC,EAAE;AAC9C,QAAA,IAAI,CAACqD,OAAO,CAACY,GAAG,CAACjE,IAAI,CAAC;QACtB,IAAI,CAACuD,OAAO,GAAGvD,IAAI;AACnB,QAAA,OAAOA,IAAI;AACb,MAAA;MACAA,IAAI,GAAGA,IAAI,CAACqC,WAAW;AACzB,IAAA;AACA,IAAA,OAAO,IAAI;AACb,EAAA;EAGA6B,eAAeA,CAACnC,OAAe,EAAkB;IAC/C,OAAO,IAAI,CAACgC,aAAa,CACtB/D,IAAI,IAAKA,IAAI,CAACmE,QAAQ,KAAK,CAAC,IAAKnE,IAAI,CAAa+B,OAAO,CAACa,WAAW,EAAE,KAAKb,OAC/E,CAAC;AACH,EAAA;EAGAqC,eAAeA,CAAC7E,IAAY,EAAkB;AAC5C,IAAA,OAAO,IAAI,CAACwE,aAAa,CACtB/D,IAAI,IAAKA,IAAI,CAACmE,QAAQ,KAAK,CAAC,IAAKnE,IAAI,CAAaqE,IAAI,KAAK9E,IAC9D,CAAC;AACH,EAAA;AAGA+E,EAAAA,YAAYA,GAAgB;IAC1B,OAAO,IAAI,CAACP,aAAa,CACtB/D,IAAI,IAAKA,IAAI,CAACmE,QAAQ,KAAK,CAAC,IAAI,CAAC,CAAEnE,IAAI,CAACG,WAAW,EAAEoE,IAAI,EAC5D,CAAC;AACH,EAAA;AACF;MAIaC,OAAO,GAAGA,CAACC,cAA4B,EAAEC,MAAe,KAAK;AACxE,EAAA,MAAMC,MAAM,GAAG,IAAIvB,UAAU,CAACsB,MAAM,CAAC;EAGrC,IAAIE,aAAa,GAAG,IAAI;EAIxB,MAAMC,cAAc,GAAGA,CAAC7E,IAAU,EAAEC,GAAW,EAAEC,KAAU,KAAK;IAC9D,IAAI0E,aAAa,KAAK3E,GAAG,KAAK,UAAU,IAAIA,GAAG,KAAK,MAAM,CAAC,EAAE;AAC1DD,MAAAA,IAAI,CAASH,YAAY,CAAC,GAAGK,KAAK,IAAI,IAAI;AAC3C,MAAA;AACF,IAAA;AACA,IAAA,OAAOH,OAAO,CAACC,IAAI,EAAEC,GAAG,EAAEC,KAAK,CAAC;EAClC,CAAC;EAED,MAAMZ,YAAU,GAAIC,IAAY,IAAW;AACzC,IAAA,IAAIqF,aAAa,EAAE;AACjB,MAAA,MAAMvB,OAAO,GAAG9D,IAAI,KAAK,MAAM,GAC3BoF,MAAM,CAACL,YAAY,EAAE,GACrBK,MAAM,CAACT,eAAe,CAAC3E,IAAI,CAAC;MAChC,IAAI8D,OAAO,EAAE,OAAOA,OAAO;AAC7B,IAAA;AACA,IAAA,OAAO9D,IAAI,KAAK,MAAM,GAClBC,QAAQ,CAACC,cAAc,CAAC,EAAE,CAAC,GAC3BqF,UAAiB,CAACvF,IAAI,CAAC;EAC7B,CAAC;EAED,MAAM+C,YAAY,GAAI/C,IAAY,IAAc;AAC9C,IAAA,IAAIqF,aAAa,EAAE;AACjB,MAAA,MAAMvB,OAAO,GAAGsB,MAAM,CAACP,eAAe,CAAC7E,IAAI,CAAC;MAC5C,IAAI8D,OAAO,EAAE,OAAOA,OAAO;AAC7B,IAAA;AACA,IAAA,OAAO7D,QAAQ,CAAC+C,aAAa,CAAChD,IAAI,CAAC;EACrC,CAAC;EAED,MAAMyC,WAAW,GAAGA,CAACC,MAAY,EAAEjC,IAAU,EAAEkC,IAAiB,KAAK;IACnE,IAAIlC,IAAI,KAAKiC,MAAM,EAAE;IACrB,MAAM8C,YAAY,GAAG7C,IAAI,GAAGA,IAAI,CAACG,WAAW,GAAGJ,MAAM,CAACG,UAAU;IAChE,IAAIpC,IAAI,KAAK+E,YAAY,EAAE;AAC3B9C,IAAAA,MAAM,CAACE,YAAY,CAACnC,IAAI,EAAE+E,YAAY,CAAC;EACzC,CAAC;EAED,MAAMrC,YAAY,GAAI1C,IAAU,IAAqB;AACnD,IAAA,IAAKA,IAAI,CAASH,YAAY,CAAC,EAAE;MAC/B,MAAM8C,GAAG,GAAI3C,IAAI,CAAa+B,OAAO,EAAEa,WAAW,EAAE;AACpD,MAAA,MAAMC,OAAO,GAAI7C,IAAI,CAAiBG,WAAW,IAAI,IAAI;AACzD2C,MAAAA,OAAO,CAACC,IAAI,CACV,CAAA,CAAA,EAAIJ,GAAG,CAAA,MAAA,EAASE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA,8CAAA,CAC3C,CAAC;AACD,MAAA,OAAO,KAAK;AACd,IAAA;AACA,IAAA,IAAI+B,aAAa,EAAED,MAAM,CAACjB,aAAa,CAAC1D,IAAI,CAAC;EAC/C,CAAC;EAED,MAAMgD,SAAS,GAAIhD,IAAU,IAAK;AAChC,IAAA,IAAI4E,aAAa,EAAED,MAAM,CAACd,aAAa,CAAC7D,IAAI,CAAC;EAC/C,CAAC;EAGD,MAAMgF,iBAAiB,GAAIhF,IAAS,IAAK;AACvC,IAAA,IAAI4E,aAAa,IAAI5E,IAAI,CAACiF,MAAM,EAAE;AAChC,MAAA,MAAMC,SAAS,GAAGlF,IAAI,CAACiF,MAAM,CAACjF,IAAI;AAClC,MAAA,IAAIkF,SAAS,EAAEP,MAAM,CAACjB,aAAa,CAACwB,SAAS,CAAC;AAChD,IAAA;EACF,CAAC;AAED,EAAA,MAAMjC,cAAc,GAAGA,CAACjD,IAAS,EAAEmF,SAAkB,KAAK;AAExD,IAAA,IAAIP,aAAa,IAAI5E,IAAI,CAACiF,MAAM,EAAE;AAChC,MAAA,MAAMG,SAAS,GAAGpF,IAAI,CAACqF,SAAS,EAAEvB,UAAU;AAC5C,MAAA,IAAIsB,SAAS,EAAE;AACbT,QAAAA,MAAM,CAAChB,SAAS,CAACyB,SAAS,CAAC;QAE3B,IAAIpF,IAAI,CAACqF,SAAS,EAAEV,MAAM,CAACf,UAAU,CAAC5D,IAAI,CAACqF,SAAS,CAAC;AACvD,MAAA;AACA,MAAA;AACF,IAAA;AACA,IAAA,IAAIT,aAAa,EAAED,MAAM,CAACd,aAAa,CAAC7D,IAAI,CAAC;EAC/C,CAAC;EAED,MAAMkD,MAAM,GAAGC,YAAY,CAAC;gBAC1B7D,YAAU;AACVS,IAAAA,OAAO,EAAE8E,cAAc;IACvB7C,WAAW;IACXM,YAAY;IACZE,MAAM;IACNJ,UAAU;IACVK,OAAO;IACPC,YAAY;IACZsC,iBAAiB;IACjBhC,SAAS;IACTC,cAAc;IAGdqC,aAAa,EAAEA,MAAM;AACnBV,MAAAA,aAAa,GAAG,KAAK;AACvB,IAAA;AACF,GAAC,CAAC;AAEF,EAAA,OAAO1B,MAAM,CAACuB,cAAc,EAAEC,MAAM,CAAC;AACvC;;;;"}
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":";;AAEO,MAAMA,aAAa,GAAG,IAAIC,GAAG,CAAC,CACnC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EACvD,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAC3D,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EACrD,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,CAC1E;AAED,MAAMC,eAAe,GAAG,IAAID,GAAG,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;AAEhE,MAAME,MAAM,GAAG,4BAA4B;AAC3C,MAAMC,OAAO,GAAG,oCAAoC;AAEpD,MAAMC,QAAQ,GAAG,IAAIJ,GAAG,CAAC,CACvB,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,kBAAkB,EAAE,QAAQ,EAAE,UAAU,EAC3E,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,qBAAqB,EAC5E,aAAa,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,mBAAmB,EAC3E,gBAAgB,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAC5E,SAAS,EAAE,gBAAgB,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAChF,UAAU,EAAE,cAAc,EAAE,oBAAoB,EAAE,aAAa,EAAE,QAAQ,EACzE,cAAc,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EACjF,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAC/E,gBAAgB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EACvE,OAAO,EAAE,KAAK,EAAE,MAAM,CACvB,CAAC;AAEF,MAAMK,SAAS,GAAG,IAAIL,GAAG,CAAC,CACxB,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EACpE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAC7E,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAC9E,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAC5E,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAC1E,WAAW,EAAE,YAAY,EAAE,gBAAgB,CAC5C,CAAC;AAEF,MAAMM,IAAI,GAAIC,EAAW,IAAKA,EAAE,CAACC,YAAY,KAAKN,MAAM,IAAIK,EAAE,CAACC,YAAY,KAAKL,OAAO;AAIhF,SAASM,UAAUA,CAAoBC,IAAY,EAAS;EACjE,MAAMC,GAAG,GAAG,IAAI,CAACC,IAAI,EAAEC,aAAa,IAAIC,QAAQ;EAChD,IAAIJ,IAAI,KAAK,MAAM,EAAE,OAAOC,GAAG,CAACI,cAAc,CAAC,EAAE,CAAC;AAClD,EAAA,IAAIV,SAAS,CAACW,GAAG,CAACN,IAAI,CAAC,EAAE,OAAOC,GAAG,CAACM,eAAe,CAACd,OAAO,EAAEO,IAAI,CAAC;AAClE,EAAA,IAAIN,QAAQ,CAACY,GAAG,CAACN,IAAI,CAAC,EAAE,OAAOC,GAAG,CAACM,eAAe,CAACf,MAAM,EAAEQ,IAAI,CAAC;AAChE,EAAA,OAAOC,GAAG,CAACO,aAAa,CAACR,IAAI,CAAC;AAChC;MAEaS,YAAY,GAAGC,MAAM,CAAC,YAAY;AAExC,SAASC,OAAOA,CAACC,IAAU,EAAEC,GAAW,EAAEC,KAAU,EAA4B;EACrF,MAAMjB,EAAE,GAAGe,IAAmB;EAG9B,IAAIC,GAAG,KAAK,UAAU,EAAE;AACrBD,IAAAA,IAAI,CAASH,YAAY,CAAC,GAAGK,KAAK,IAAI,IAAI;IAC3C,IAAIA,KAAK,IAAI,IAAI,EAAE;IACnBF,IAAI,CAACG,WAAW,GAAGD,KAAK;AACxB,IAAA;AACF,EAAA;AAGA,EAAA,IAAID,GAAG,CAACG,UAAU,CAAC,IAAI,CAAC,EAAE;AACxB,IAAA,MAAMC,OAAO,GAAGJ,GAAG,CAACK,KAAK,CAAC,CAAC,CAAC;AAC5BN,IAAAA,IAAI,CAACO,gBAAgB,CAACF,OAAO,EAAEH,KAAK,CAAC;IACrC,OAAO,MAAMF,IAAI,CAACQ,mBAAmB,CAACH,OAAO,EAAEH,KAAK,CAAC;AACvD,EAAA;AAGA,EAAA,IAAID,GAAG,CAACG,UAAU,CAAC,GAAG,CAAC,EAAE;AACvBnB,IAAAA,EAAE,CAACwB,SAAS,CAACC,MAAM,CAACT,GAAG,CAACK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAACJ,KAAK,CAAC;AAC1C,IAAA;AACF,EAAA;AAEA,EAAA,IAAID,GAAG,CAACG,UAAU,CAAC,GAAG,CAAC,EAAE;AACvB,IAAA,IAAIF,KAAK,EAAEjB,EAAE,CAAC0B,EAAE,GAAGV,GAAG,CAACK,KAAK,CAAC,CAAC,CAAC,CAAC,KAC3BrB,EAAE,CAAC2B,eAAe,CAAC,IAAI,CAAC;AAC7B,IAAA;AACF,EAAA;EAEA,IAAIX,GAAG,KAAK,OAAO,EAAE;IACnB,IAAIC,KAAK,IAAI,IAAI,EAAE;MACjBjB,EAAE,CAAC4B,SAAS,GAAG,EAAE;AACnB,IAAA,CAAC,MAAM,IAAI,OAAOX,KAAK,KAAK,QAAQ,IAAI,CAACY,KAAK,CAACC,OAAO,CAACb,KAAK,CAAC,EAAE;AAC7D,MAAA,IAAIlB,IAAI,CAACC,EAAE,CAAC,EAAE;AACZ,QAAA,MAAM+B,KAAK,GAAGC,MAAM,CAACC,OAAO,CAAChB,KAA4B,CAAC,CACvDiB,MAAM,CAAC,CAAC,GAAGC,CAAC,CAAC,KAAK,CAAC,CAACA,CAAC,CAAC,CACtBC,GAAG,CAAC,CAAC,CAACC,CAAC,CAAC,KAAKA,CAAC,CAAC,CACfC,IAAI,CAAC,GAAG,CAAC;AACZtC,QAAAA,EAAE,CAACuC,YAAY,CAAC,OAAO,EAAER,KAAK,CAAC;AACjC,MAAA,CAAC,MAAM;AACL,QAAA,KAAK,MAAMM,CAAC,IAAIpB,KAAK,EAAE;AACrBjB,UAAAA,EAAE,CAACwB,SAAS,CAACC,MAAM,CAACY,CAAC,EAAE,CAAC,CAAEpB,KAAK,CAAyBoB,CAAC,CAAC,CAAC;AAC7D,QAAA;AACF,MAAA;AACF,IAAA,CAAC,MAAM;AACL,MAAA,MAAMG,GAAG,GAAG,OAAOvB,KAAK,KAAK,SAAS,GAAIA,KAAK,GAAG,MAAM,GAAG,EAAE,GAAIwB,MAAM,CAACxB,KAAK,CAAC;AAC9E,MAAA,IAAIlB,IAAI,CAACC,EAAE,CAAC,EAAE;AACZA,QAAAA,EAAE,CAACuC,YAAY,CAAC,OAAO,EAAEC,GAAG,CAAC;AAC/B,MAAA,CAAC,MAAM;QACLxC,EAAE,CAAC4B,SAAS,GAAGY,GAAG;AACpB,MAAA;AACF,IAAA;AACA,IAAA;AACF,EAAA;EAGA,IAAIxB,GAAG,KAAK,OAAO,EAAE;IACnB,IAAIC,KAAK,IAAI,IAAI,EAAE;AACjBjB,MAAAA,EAAE,CAAC0C,KAAK,CAACC,OAAO,GAAG,EAAE;AACvB,IAAA,CAAC,MAAM;MACL3C,EAAE,CAAC0C,KAAK,CAACC,OAAO,GAAGF,MAAM,CAACxB,KAAK,CAAC;AAClC,IAAA;AACA,IAAA;AACF,EAAA;EAGA,IAAID,GAAG,KAAK,MAAM,EAAE;AACjBD,IAAAA,IAAI,CAASH,YAAY,CAAC,GAAGK,KAAK,IAAI,IAAI;IAC3C,IAAIA,KAAK,IAAI,IAAI,EAAE;AAClBF,IAAAA,IAAI,CAAa6B,SAAS,GAAGH,MAAM,CAACxB,KAAK,CAAC;AAC3C,IAAA;AACF,EAAA;AAGA,EAAA,IAAIzB,aAAa,CAACiB,GAAG,CAACO,GAAG,CAAC,EAAE;IAC1B,IAAIC,KAAK,KAAK,KAAK,IAAIA,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAK4B,SAAS,EAAE;AAC5D7C,MAAAA,EAAE,CAAC2B,eAAe,CAACX,GAAG,CAAC;AACzB,IAAA,CAAC,MAAM;AACLhB,MAAAA,EAAE,CAACuC,YAAY,CAACvB,GAAG,EAAE,EAAE,CAAC;AAC1B,IAAA;AACA,IAAA;AACF,EAAA;AAGA,EAAA,IAAI,CAACA,GAAG,KAAK,OAAO,IAAIA,GAAG,KAAK,SAAS,KAAKtB,eAAe,CAACe,GAAG,CAACT,EAAE,CAAC8C,OAAO,CAAC,EAAE;AAC5E9C,IAAAA,EAAE,CAASgB,GAAG,CAAC,GAAGC,KAAK;AACxB,IAAA;AACF,EAAA;AAGA,EAAA,IAAIlB,IAAI,CAACC,EAAE,CAAC,EAAE;IACZ,IAAIiB,KAAK,IAAI,IAAI,EAAE;AACjBjB,MAAAA,EAAE,CAAC2B,eAAe,CAACX,GAAG,CAAC;AACzB,IAAA,CAAC,MAAM;MACLhB,EAAE,CAACuC,YAAY,CAACvB,GAAG,EAAEyB,MAAM,CAACxB,KAAK,CAAC,CAAC;AACrC,IAAA;AACA,IAAA;AACF,EAAA;AAGA,EAAA,IAAID,GAAG,CAACG,UAAU,CAAC,OAAO,CAAC,IAAIH,GAAG,CAACG,UAAU,CAAC,OAAO,CAAC,EAAE;IACtD,IAAIF,KAAK,IAAI,IAAI,EAAE;AACjBjB,MAAAA,EAAE,CAAC2B,eAAe,CAACX,GAAG,CAAC;AACzB,IAAA,CAAC,MAAM;MACLhB,EAAE,CAACuC,YAAY,CAACvB,GAAG,EAAEyB,MAAM,CAACxB,KAAK,CAAC,CAAC;AACrC,IAAA;AACA,IAAA;AACF,EAAA;EAGA,IAAIA,KAAK,IAAI,IAAI,EAAE;AACjBjB,IAAAA,EAAE,CAAC2B,eAAe,CAACX,GAAG,CAAC;AACzB,EAAA,CAAC,MAAM,IAAIA,GAAG,IAAIhB,EAAE,EAAE;AACnBA,IAAAA,EAAE,CAASgB,GAAG,CAAC,GAAGC,KAAK;AAC1B,EAAA,CAAC,MAAM;IACLjB,EAAE,CAACuC,YAAY,CAACvB,GAAG,EAAEyB,MAAM,CAACxB,KAAK,CAAC,CAAC;AACrC,EAAA;AACF;AAEO,SAAS8B,WAAWA,CAACC,MAAY,EAAEjC,IAAU,EAAEkC,IAAiB,EAAE;EACvE,IAAI,CAACA,IAAI,EAAED,MAAM,CAACE,YAAY,CAACnC,IAAI,EAAEiC,MAAM,CAACG,UAAU,CAAC,CAAC,KACnDH,MAAM,CAACE,YAAY,CAACnC,IAAI,EAAEkC,IAAI,CAACG,WAAW,CAAC;AAClD;AAEO,SAASC,YAAYA,CAAoBlD,IAAY,EAAE;EAC5D,MAAMC,GAAG,GAAG,IAAI,CAACC,IAAI,EAAEC,aAAa,IAAIC,QAAQ;AAChD,EAAA,OAAOH,GAAG,CAACkD,aAAa,CAACnD,IAAI,CAAC;AAChC;AAEO,SAASoD,MAAMA,CAACxC,IAAU,EAAE;EAAGA,IAAI,CAAawC,MAAM,EAAE;AAAE;AAE1D,SAASJ,UAAUA,CAACpC,IAAU,EAAE;EAAC,OAAOA,IAAI,CAACoC,UAAU;AAAA;AAEvD,SAASK,OAAOA,CAACzC,IAAU,EAAE;EAAC,OAAOA,IAAI,CAACqC,WAAW;AAAC;AAEtD,SAASK,YAAYA,CAAC1C,IAAU,EAAmB;AACxD,EAAA,IAAKA,IAAI,CAASH,YAAY,CAAC,EAAE;IAC/B,MAAM8C,GAAG,GAAI3C,IAAI,CAAa+B,OAAO,EAAEa,WAAW,EAAE;AACpD,IAAA,MAAMC,OAAO,GAAI7C,IAAI,CAAiBG,WAAW,IAAI,IAAI;AACzD2C,IAAAA,OAAO,CAACC,IAAI,CAAC,CAAA,CAAA,EAAIJ,GAAG,CAAA,MAAA,EAASE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA,8CAAA,CAAgD,CAAC;AACvG,IAAA,OAAO,KAAK;AACd,EAAA;AACF;AAEO,MAAMG,MAAM,GAAGC,YAAY,CAAC;EACjC9D,UAAU;EACVY,OAAO;EACPiC,WAAW;EACXM,YAAY;EACZE,MAAM;EACNJ,UAAU;EACVK,OAAO;AACPC,EAAAA;AACF,CAAC;;AC3KD,MAAMQ,UAAU,CAAC;AAIPC,EAAAA,OAAO,GAAG,IAAIC,OAAO,EAAQ;AAE7BC,EAAAA,OAAO,GAAgB,IAAI;EAEnCC,WAAWA,CAACC,SAAe,EAAE;IAC3B,IAAI,CAACtB,MAAM,GAAGsB,SAAS;AACzB,EAAA;EAGAC,aAAaA,CAACxD,IAAU,EAAE;IACxB,IAAI,CAACiC,MAAM,GAAGjC,IAAI;IAClB,IAAI,CAACqD,OAAO,GAAG,IAAI;AACrB,EAAA;EAGAI,SAASA,CAACzD,IAAU,EAAE;IACpB,IAAI,CAACiC,MAAM,GAAGjC,IAAI;IAClB,IAAI,CAACqD,OAAO,GAAG,IAAI;AACrB,EAAA;EAGAK,UAAUA,CAAC1D,IAAU,EAAE;IACrB,IAAI,CAACqD,OAAO,GAAGrD,IAAI;AACrB,EAAA;EAGA2D,aAAaA,CAAC3D,IAAU,EAAE;IACxB,IAAIA,IAAI,KAAK,IAAI,CAACiC,MAAM,IAAI,IAAI,CAACA,MAAM,CAAC2B,UAAU,EAAE;AAClD,MAAA,IAAI,CAAC3B,MAAM,GAAG,IAAI,CAACA,MAAM,CAAC2B,UAAU;MACpC,IAAI,CAACP,OAAO,GAAGrD,IAAI;AACrB,IAAA;AACF,EAAA;EAGQ6D,aAAaA,CAACC,SAAkC,EAAe;AAErE,IAAA,IAAI9D,IAAI,GAAG,IAAI,CAACqD,OAAO,EAAEhB,WAAW,IAAI,IAAI,CAACJ,MAAM,CAACG,UAAU;AAC9D,IAAA,OAAOpC,IAAI,EAAE;AACX,MAAA,IAAI,CAAC,IAAI,CAACmD,OAAO,CAACzD,GAAG,CAACM,IAAI,CAAC,IAAI8D,SAAS,CAAC9D,IAAI,CAAC,EAAE;AAC9C,QAAA,IAAI,CAACmD,OAAO,CAACY,GAAG,CAAC/D,IAAI,CAAC;QACtB,IAAI,CAACqD,OAAO,GAAGrD,IAAI;AACnB,QAAA,OAAOA,IAAI;AACb,MAAA;MACAA,IAAI,GAAGA,IAAI,CAACqC,WAAW;AACzB,IAAA;AACA,IAAA,OAAO,IAAI;AACb,EAAA;EAGA2B,eAAeA,CAACjC,OAAe,EAAkB;IAC/C,OAAO,IAAI,CAAC8B,aAAa,CACtB7D,IAAI,IAAKA,IAAI,CAACiE,QAAQ,KAAK,CAAC,IAAKjE,IAAI,CAAa+B,OAAO,CAACa,WAAW,EAAE,KAAKb,OAC/E,CAAC;AACH,EAAA;EAGAmC,eAAeA,CAAC9E,IAAY,EAAkB;AAC5C,IAAA,OAAO,IAAI,CAACyE,aAAa,CACtB7D,IAAI,IAAKA,IAAI,CAACiE,QAAQ,KAAK,CAAC,IAAKjE,IAAI,CAAamE,IAAI,KAAK/E,IAC9D,CAAC;AACH,EAAA;AAGAgF,EAAAA,YAAYA,GAAgB;IAC1B,OAAO,IAAI,CAACP,aAAa,CACtB7D,IAAI,IAAKA,IAAI,CAACiE,QAAQ,KAAK,CAAC,IAAI,CAAC,CAAEjE,IAAI,CAACG,WAAW,EAAEkE,IAAI,EAC5D,CAAC;AACH,EAAA;AACF;MAIaC,OAAO,GAAGA,CAACC,cAA4B,EAAEC,MAAe,KAAK;AACxE,EAAA,MAAMC,MAAM,GAAG,IAAIvB,UAAU,CAACsB,MAAM,CAAC;EAGrC,IAAIE,aAAa,GAAG,IAAI;AAIxB,EAAA,SAAS3E,SAAOA,CAAEC,IAAU,EAAEC,GAAW,EAAEC,KAAU,EAAE;IACrD,IAAIwE,aAAa,KAAKzE,GAAG,KAAK,UAAU,IAAIA,GAAG,KAAK,MAAM,CAAC,EAAE;AAC1DD,MAAAA,IAAI,CAASH,YAAY,CAAC,GAAGK,KAAK,IAAI,IAAI;AAC3C,MAAA;AACF,IAAA;IACA,OAAOyE,OAAc,CAACC,IAAI,CAAC,IAAI,EAAC5E,IAAI,EAAEC,GAAG,EAAEC,KAAK,CAAC;AACnD,EAAA;EAEA,SAASf,YAAUA,CAAqBC,IAAY,EAAQ;IAC1D,MAAMC,GAAG,GAAG,IAAI,CAACC,IAAI,EAAEC,aAAa,IAAIC,QAAQ;AAChD,IAAA,IAAIkF,aAAa,EAAE;AACjB,MAAA,MAAMvB,OAAO,GAAG/D,IAAI,KAAK,MAAM,GAC3BqF,MAAM,CAACL,YAAY,EAAE,GACrBK,MAAM,CAACT,eAAe,CAAC5E,IAAI,CAAC;MAChC,IAAI+D,OAAO,EAAE,OAAOA,OAAO;AAC7B,IAAA;AACA,IAAA,OAAO/D,IAAI,KAAK,MAAM,GAClBC,GAAG,CAACI,cAAc,CAAC,EAAE,CAAC,GACtBoF,UAAiB,CAACD,IAAI,CAAC,IAAI,EAAExF,IAAI,CAAC;AACxC,EAAA;EAEA,SAASkD,YAAYA,CAAElD,IAAY,EAAW;IAC5C,MAAMC,GAAG,GAAG,IAAI,CAACC,IAAI,EAAEC,aAAa,IAAIC,QAAQ;AAChD,IAAA,IAAIkF,aAAa,EAAE;AACjB,MAAA,MAAMvB,OAAO,GAAGsB,MAAM,CAACP,eAAe,CAAC9E,IAAI,CAAC;MAC5C,IAAI+D,OAAO,EAAE,OAAOA,OAAO;AAC7B,IAAA;AACA,IAAA,OAAO9D,GAAG,CAACkD,aAAa,CAACnD,IAAI,CAAC;AAChC,EAAA;AAEA,EAAA,SAAS4C,WAAWA,CAACC,MAAY,EAAEjC,IAAU,EAAEkC,IAAiB,EAAE;IAChE,IAAIlC,IAAI,KAAKiC,MAAM,EAAE;IACrB,MAAM6C,YAAY,GAAG5C,IAAI,GAAGA,IAAI,CAACG,WAAW,GAAGJ,MAAM,CAACG,UAAU;IAChE,IAAIpC,IAAI,KAAK8E,YAAY,EAAE;AAC3B7C,IAAAA,MAAM,CAACE,YAAY,CAACnC,IAAI,EAAE8E,YAAY,CAAC;AACzC,EAAA;EAEA,SAAUpC,YAAYA,CAAC1C,IAAU,EAAkB;AACjD,IAAA,IAAKA,IAAI,CAASH,YAAY,CAAC,EAAE;MAC/B,MAAM8C,GAAG,GAAI3C,IAAI,CAAa+B,OAAO,EAAEa,WAAW,EAAE;AACpD,MAAA,MAAMC,OAAO,GAAI7C,IAAI,CAAiBG,WAAW,IAAI,IAAI;AACzD2C,MAAAA,OAAO,CAACC,IAAI,CACV,CAAA,CAAA,EAAIJ,GAAG,CAAA,MAAA,EAASE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA,8CAAA,CAC3C,CAAC;AACD,MAAA,OAAO,KAAK;AACd,IAAA;AACA,IAAA,IAAI6B,aAAa,EAAED,MAAM,CAACjB,aAAa,CAACxD,IAAI,CAAC;AAC/C,EAAA;EAEA,SAAS+E,SAASA,CAAE/E,IAAU,EAAE;AAC9B,IAAA,IAAI0E,aAAa,EAAED,MAAM,CAACd,aAAa,CAAC3D,IAAI,CAAC;AAC/C,EAAA;EAGA,SAASgF,iBAAiBA,CAAEhF,IAAS,EAAE;AACrC,IAAA,IAAI0E,aAAa,IAAI1E,IAAI,CAACiF,MAAM,EAAE;AAChC,MAAA,MAAMC,SAAS,GAAGlF,IAAI,CAACiF,MAAM,CAACjF,IAAI;AAClC,MAAA,IAAIkF,SAAS,EAAET,MAAM,CAACjB,aAAa,CAAC0B,SAAS,CAAC;AAChD,IAAA;AACF,EAAA;AAEA,EAAA,SAASC,cAAcA,CAAEnF,IAAS,EAAEoF,SAAkB,EAAE;AAEtD,IAAA,IAAIV,aAAa,IAAI1E,IAAI,CAACiF,MAAM,EAAE;AAChC,MAAA,MAAMI,SAAS,GAAGrF,IAAI,CAACsF,SAAS,EAAE1B,UAAU;AAC5C,MAAA,IAAIyB,SAAS,EAAE;AACbZ,QAAAA,MAAM,CAAChB,SAAS,CAAC4B,SAAS,CAAC;QAE3B,IAAIrF,IAAI,CAACsF,SAAS,EAAEb,MAAM,CAACf,UAAU,CAAC1D,IAAI,CAACsF,SAAS,CAAC;AACvD,MAAA;AACA,MAAA;AACF,IAAA;AACA,IAAA,IAAIZ,aAAa,EAAED,MAAM,CAACd,aAAa,CAAC3D,IAAI,CAAC;AAC/C,EAAA;EAEA,MAAMgD,MAAM,GAAGC,YAAY,CAAC;gBAC1B9D,YAAU;aACVY,SAAO;IACPiC,WAAW;IACXM,YAAY;IACZE,MAAM;IACNJ,UAAU;IACVK,OAAO;IACPC,YAAY;IACZsC,iBAAiB;IACjBD,SAAS;IACTI,cAAc;IAGdI,aAAa,EAAEA,MAAM;AACnBb,MAAAA,aAAa,GAAG,KAAK;AACvB,IAAA;AACF,GAAC,CAAC;AAEF,EAAA,OAAO1B,MAAM,CAACuB,cAAc,EAAEC,MAAM,CAAC;AACvC;;;;"}
package/dist/index.d.ts CHANGED
@@ -1,20 +1,20 @@
1
1
  import * as bobe from 'bobe';
2
- import { Store } from 'bobe';
2
+ import { Interpreter, Store } from 'bobe';
3
3
 
4
4
  declare const BOOLEAN_ATTRS: Set<string>;
5
- declare const createNode: (name: string) => Node;
5
+ declare function createNode(this: Interpreter, name: string): Node;
6
6
  declare const CONTENT_FLAG: unique symbol;
7
- declare const setProp: (node: Node, key: string, value: any) => (() => void) | undefined;
8
- declare const insertAfter: (parent: Node, node: Node, prev: Node | null) => void;
9
- declare const createAnchor: (name: string) => Comment;
10
- declare const remove: (node: Node) => void;
11
- declare const firstChild: (node: Node) => ChildNode;
12
- declare const nextSib: (node: Node) => ChildNode;
13
- declare const beforeIndent: (node: Node) => boolean | void;
14
- declare const leaveNode: () => void;
15
- declare const leaveLogicNode: () => void;
7
+ declare function setProp(node: Node, key: string, value: any): (() => void) | undefined;
8
+ declare function insertAfter(parent: Node, node: Node, prev: Node | null): void;
9
+ declare function createAnchor(this: Interpreter, name: string): any;
10
+ declare function remove(node: Node): void;
11
+ declare function firstChild(node: Node): ChildNode;
12
+ declare function nextSib(node: Node): ChildNode;
13
+ declare function beforeIndent(node: Node): boolean | void;
16
14
  declare const render: {
17
- <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 & {
18
18
  tokenizer: bobe.Tokenizer;
19
19
  fragmentSnapshot?: ReturnType<bobe.Tokenizer["snapshot"]>;
20
20
  resumeSnapshot?: ReturnType<bobe.Tokenizer["snapshot"]>;
@@ -28,4 +28,4 @@ declare const hydrate: (ComponentClass: typeof Store, rootEl: Element) => [bobe.
28
28
  resumeSnapshot?: ReturnType<bobe.Tokenizer["snapshot"]>;
29
29
  }, Store];
30
30
 
31
- export { BOOLEAN_ATTRS, CONTENT_FLAG, beforeIndent, createAnchor, createNode, firstChild, hydrate, insertAfter, leaveLogicNode, leaveNode, nextSib, remove, render, setProp };
31
+ export { BOOLEAN_ATTRS, CONTENT_FLAG, beforeIndent, createAnchor, createNode, firstChild, hydrate, insertAfter, nextSib, remove, render, setProp };
package/dist/index.umd.js CHANGED
@@ -11,14 +11,15 @@
11
11
  const SVG_TAGS = new Set(['svg', 'animate', 'animateMotion', 'animateTransform', 'circle', 'clipPath', 'defs', 'desc', 'ellipse', 'feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence', 'filter', 'foreignObject', 'g', 'image', 'line', 'linearGradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'set', 'stop', 'switch', 'symbol', 'textPath', 'tspan', 'use', 'view']);
12
12
  const MATH_TAGS = new Set(['math', 'maction', 'maligngroup', 'malignmark', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mlongdiv', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'mspace', 'msqrt', 'msrow', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover', 'semantics', 'annotation', 'annotation-xml']);
13
13
  const isNS = el => el.namespaceURI === SVG_NS || el.namespaceURI === MATH_NS;
14
- const createNode = name => {
15
- if (name === 'text') return document.createTextNode('');
16
- if (MATH_TAGS.has(name)) return document.createElementNS(MATH_NS, name);
17
- if (SVG_TAGS.has(name)) return document.createElementNS(SVG_NS, name);
18
- return document.createElement(name);
19
- };
14
+ function createNode(name) {
15
+ const doc = this.root?.ownerDocument || document;
16
+ if (name === 'text') return doc.createTextNode('');
17
+ if (MATH_TAGS.has(name)) return doc.createElementNS(MATH_NS, name);
18
+ if (SVG_TAGS.has(name)) return doc.createElementNS(SVG_NS, name);
19
+ return doc.createElement(name);
20
+ }
20
21
  const CONTENT_FLAG = Symbol('hasContent');
21
- const setProp = (node, key, value) => {
22
+ function setProp(node, key, value) {
22
23
  const el = node;
23
24
  if (key === 'children') {
24
25
  node[CONTENT_FLAG] = value != null;
@@ -110,26 +111,31 @@
110
111
  } else {
111
112
  el.setAttribute(key, String(value));
112
113
  }
113
- };
114
- const insertAfter = (parent, node, prev) => {
114
+ }
115
+ function insertAfter(parent, node, prev) {
115
116
  if (!prev) parent.insertBefore(node, parent.firstChild);else parent.insertBefore(node, prev.nextSibling);
116
- };
117
- const createAnchor = name => document.createComment(name);
118
- const remove = node => {
117
+ }
118
+ function createAnchor(name) {
119
+ const doc = this.root?.ownerDocument || document;
120
+ return doc.createComment(name);
121
+ }
122
+ function remove(node) {
119
123
  node.remove();
120
- };
121
- const firstChild = node => node.firstChild;
122
- const nextSib = node => node.nextSibling;
123
- const beforeIndent = node => {
124
+ }
125
+ function firstChild(node) {
126
+ return node.firstChild;
127
+ }
128
+ function nextSib(node) {
129
+ return node.nextSibling;
130
+ }
131
+ function beforeIndent(node) {
124
132
  if (node[CONTENT_FLAG]) {
125
133
  const tag = node.tagName?.toLowerCase();
126
134
  const hasText = node.textContent != null;
127
135
  console.warn(`<${tag}> has ${hasText ? 'text' : 'html'} content and child elements — children ignored`);
128
136
  return false;
129
137
  }
130
- };
131
- const leaveNode = () => {};
132
- const leaveLogicNode = () => {};
138
+ }
133
139
  const render = bobe.customRender({
134
140
  createNode,
135
141
  setProp,
@@ -138,9 +144,7 @@
138
144
  remove,
139
145
  firstChild,
140
146
  nextSib,
141
- beforeIndent,
142
- leaveNode,
143
- leaveLogicNode
147
+ beforeIndent
144
148
  });
145
149
 
146
150
  class TreeCursor {
@@ -191,34 +195,36 @@
191
195
  const hydrate = (ComponentClass, rootEl) => {
192
196
  const cursor = new TreeCursor(rootEl);
193
197
  let isFirstRender = true;
194
- const hydrateSetProp = (node, key, value) => {
198
+ function setProp$1(node, key, value) {
195
199
  if (isFirstRender && (key === 'children' || key === 'html')) {
196
200
  node[CONTENT_FLAG] = value != null;
197
201
  return;
198
202
  }
199
- return setProp(node, key, value);
200
- };
201
- const createNode$1 = name => {
203
+ return setProp.call(this, node, key, value);
204
+ }
205
+ function createNode$1(name) {
206
+ const doc = this.root?.ownerDocument || document;
202
207
  if (isFirstRender) {
203
208
  const claimed = name === 'text' ? cursor.tryClaimText() : cursor.tryClaimElement(name);
204
209
  if (claimed) return claimed;
205
210
  }
206
- return name === 'text' ? document.createTextNode('') : createNode(name);
207
- };
208
- const createAnchor = name => {
211
+ return name === 'text' ? doc.createTextNode('') : createNode.call(this, name);
212
+ }
213
+ function createAnchor(name) {
214
+ const doc = this.root?.ownerDocument || document;
209
215
  if (isFirstRender) {
210
216
  const claimed = cursor.tryClaimComment(name);
211
217
  if (claimed) return claimed;
212
218
  }
213
- return document.createComment(name);
214
- };
215
- const insertAfter = (parent, node, prev) => {
219
+ return doc.createComment(name);
220
+ }
221
+ function insertAfter(parent, node, prev) {
216
222
  if (node === parent) return;
217
223
  const expectedNext = prev ? prev.nextSibling : parent.firstChild;
218
224
  if (node === expectedNext) return;
219
225
  parent.insertBefore(node, expectedNext);
220
- };
221
- const beforeIndent = node => {
226
+ }
227
+ function beforeIndent(node) {
222
228
  if (node[CONTENT_FLAG]) {
223
229
  const tag = node.tagName?.toLowerCase();
224
230
  const hasText = node.textContent != null;
@@ -226,17 +232,17 @@
226
232
  return false;
227
233
  }
228
234
  if (isFirstRender) cursor.enterChildren(node);
229
- };
230
- const leaveNode = node => {
235
+ }
236
+ function leaveNode(node) {
231
237
  if (isFirstRender) cursor.leaveToParent(node);
232
- };
233
- const beforeLogicIndent = node => {
238
+ }
239
+ function beforeLogicIndent(node) {
234
240
  if (isFirstRender && node.tpData) {
235
241
  const targetDom = node.tpData.node;
236
242
  if (targetDom) cursor.enterChildren(targetDom);
237
243
  }
238
- };
239
- const leaveLogicNode = (node, _isDedent) => {
244
+ }
245
+ function leaveLogicNode(node, _isDedent) {
240
246
  if (isFirstRender && node.tpData) {
241
247
  const parentDom = node.realAfter?.parentNode;
242
248
  if (parentDom) {
@@ -246,10 +252,10 @@
246
252
  return;
247
253
  }
248
254
  if (isFirstRender) cursor.leaveToParent(node);
249
- };
255
+ }
250
256
  const render = bobe.customRender({
251
257
  createNode: createNode$1,
252
- setProp: hydrateSetProp,
258
+ setProp: setProp$1,
253
259
  insertAfter,
254
260
  createAnchor,
255
261
  remove,
@@ -274,8 +280,6 @@
274
280
  exports.firstChild = firstChild;
275
281
  exports.hydrate = hydrate;
276
282
  exports.insertAfter = insertAfter;
277
- exports.leaveLogicNode = leaveLogicNode;
278
- exports.leaveNode = leaveNode;
279
283
  exports.nextSib = nextSib;
280
284
  exports.remove = remove;
281
285
  exports.render = render;
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../src/render.ts","../src/render-hydrate.ts"],"sourcesContent":["import { customRender } 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 const createNode = (name: string): Node => {\n if (name === 'text') return document.createTextNode('');\n if (MATH_TAGS.has(name)) return document.createElementNS(MATH_NS, name);\n if (SVG_TAGS.has(name)) return document.createElementNS(SVG_NS, name);\n return document.createElement(name);\n};\n\nexport const CONTENT_FLAG = Symbol('hasContent');\n\nexport const 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 const 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 const createAnchor = (name: string) => document.createComment(name);\n\nexport const remove = (node: Node) => { (node as Element).remove(); };\n\nexport const firstChild = (node: Node) => node.firstChild;\n\nexport const nextSib = (node: Node) => node.nextSibling;\n\nexport const 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\n// 浏览器渲染器中 leave 不需要额外操作(DOM 插入已由 insertAfter 完成)\nexport const leaveNode = () => {};\nexport const leaveLogicNode = () => {};\n\nexport const render = customRender({\n createNode,\n setProp,\n insertAfter,\n createAnchor,\n remove,\n firstChild,\n nextSib,\n beforeIndent,\n leaveNode,\n leaveLogicNode\n});\n","import { customRender, Store } from 'bobe';\nimport {\n setProp,\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 const hydrateSetProp = (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 setProp(node, key, value);\n };\n\n const createNode = (name: string): Node => {\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 ? document.createTextNode('')\n : browserCreateNode(name);\n };\n\n const createAnchor = (name: string): Comment => {\n if (isFirstRender) {\n const claimed = cursor.tryClaimComment(name);\n if (claimed) return claimed;\n }\n return document.createComment(name);\n };\n\n const 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 const 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 const leaveNode = (node: Node) => {\n if (isFirstRender) cursor.leaveToParent(node);\n };\n\n // tp 节点进入 indent 时,将游标切入目标 DOM,使其子节点在正确位置认领\n const beforeLogicIndent = (node: any) => {\n if (isFirstRender && node.tpData) {\n const targetDom = node.tpData.node;\n if (targetDom) cursor.enterChildren(targetDom);\n }\n };\n\n const 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: hydrateSetProp,\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","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","leaveNode","leaveLogicNode","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","hydrateSetProp","browserCreateNode","expectedNext","beforeLogicIndent","tpData","targetDom","_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.71",
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.71"
18
+ "bobe": "0.0.73"
19
19
  },
20
20
  "devDependencies": {
21
21
  "vitest": "^4.1.7"