bobe-dom 0.0.59 → 0.0.61

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.
@@ -426,8 +426,7 @@ class TreeCursor {
426
426
  }
427
427
  }
428
428
  const hydrate = (ComponentClass, rootEl) => {
429
- const container = rootEl.parentNode;
430
- const cursor = new TreeCursor(container);
429
+ const cursor = new TreeCursor(rootEl);
431
430
  let isFirstRender = true;
432
431
  const hydrateSetProp = (node, key, value) => {
433
432
  if (isFirstRender && (key === 'text' || key === 'html')) {
@@ -486,7 +485,7 @@ const hydrate = (ComponentClass, rootEl) => {
486
485
  isFirstRender = false;
487
486
  }
488
487
  });
489
- return render(ComponentClass, container);
488
+ return render(ComponentClass, rootEl);
490
489
  };
491
490
 
492
491
  exports.BOOLEAN_ATTRS = BOOLEAN_ATTRS$1;
@@ -1 +1 @@
1
- {"version":3,"file":"bobe-dom.cjs.js","sources":["../src/render.ts","../src/global.ts","../src/type.ts","../src/render-html-str.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. text\n if (key === 'text') {\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 === '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 { SSRCtx } from './type';\nexport let ctx: SSRCtx = {\n root: null,\n current: null\n};\n\nexport const cleanCtx = () =>\n Object.keys(ctx).forEach(key => {\n ctx[key] = null;\n });\n","export class SSRNode {\n type: SSRNodeType;\n // 链表\n parent?: SSRNode | null = null;\n firstChild: SSRNode | null = null;\n lastChild: SSRNode | null = null; // O(1) 尾插\n nextSibling: SSRNode | null = null;\n prevSibling: SSRNode | null = null;\n closed: boolean = false;\n startClosed: boolean = false;\n // innerHTML 缓存\n _innerHtml: string | null = null;\n}\n\nexport enum SSRNodeType {\n Element,\n Text,\n Anchor,\n Root\n}\n\nexport class Element extends SSRNode {\n type = SSRNodeType.Element;\n textContent: string | null = null;\n\n attrs: Record<string, string> = {};\n constructor(\n /** 标签名 */\n public value: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\n\nexport class Text extends SSRNode {\n type = SSRNodeType.Text;\n constructor(\n /** 文本内容 */\n public textContent: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\n\nexport class Anchor extends SSRNode {\n type = SSRNodeType.Anchor;\n constructor(\n /** 注释内容 */\n public value: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\nexport class Root extends SSRNode {\n type = SSRNodeType.Root;\n constructor(\n /** 输出 HTML */\n public value: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\n\nexport type SSRCtx = {\n /** 根节点 */\n root: Root;\n /** 当前节点 */\n current: SSRNode;\n};\n","import { customRender, Store, LogicNode } from 'bobe';\nimport { cleanCtx, ctx } from './global';\nimport { Root, Element, Text, Anchor, SSRNode, SSRNodeType } from './type';\n\nconst VOID_TAGS = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr'\n]);\n\nconst BOOLEAN_ATTRS = new Set([\n 'disabled',\n 'readonly',\n 'checked',\n 'selected',\n 'hidden',\n 'multiple',\n 'required',\n 'autofocus',\n 'autoplay',\n 'controls',\n 'loop',\n 'muted',\n 'defer',\n 'async',\n 'reversed',\n 'open',\n 'itemscope',\n 'ismap',\n 'nohref',\n 'noshade',\n 'nowrap',\n 'compact',\n 'default'\n]);\n\nconst ATTR_RE = /[&\"<>]/g;\nconst TEXT_RE = /[&<>]/g;\nconst ATTR_MAP: Record<string, string> = {\n '&': '&amp;',\n '\"': '&quot;',\n '<': '&lt;',\n '>': '&gt;'\n};\nconst TEXT_MAP: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;'\n};\n\nconst escapeAttr = (str: string) => {\n const s = String(str);\n return ATTR_RE.test(s) ? s.replace(ATTR_RE, m => ATTR_MAP[m]) : s;\n};\n\nconst escapeText = (str: string) => {\n const s = String(str);\n return TEXT_RE.test(s) ? s.replace(TEXT_RE, m => TEXT_MAP[m]) : s;\n};\n\nconst createNode = (name: string) => {\n if (name === 'text') {\n return new Text('');\n }\n ctx.root.value += `<${name}`;\n return new Element(name);\n};\n\nconst setProp = (node: Text | Element, key: string, value: any) => {\n if (node.startClosed) return;\n if (key.startsWith('on') || key === 'ref') return;\n\n // 0. text\n if (key === 'text') {\n if (value == null) return;\n node.textContent = value;\n return;\n }\n\n // 1. html\n if (key === 'html') {\n if (value == null) return;\n node._innerHtml = String(value);\n return;\n }\n\n // 2. class — 对齐 Browser:支持对象/字符串/null\n if (key === 'class') {\n if (value == null) return;\n let classStr: string;\n if (typeof value === 'object' && !Array.isArray(value)) {\n classStr = Object.entries(value as Record<string, any>)\n .filter(([, v]) => !!v)\n .map(([k]) => k)\n .join(' ');\n } else {\n classStr = typeof value === 'boolean' ? (value ? 'true' : '') : String(value);\n }\n if (classStr) ctx.root.value += ` class=\"${escapeAttr(classStr)}\"`;\n return;\n }\n\n // 3. style — 对齐 Browser\n if (key === 'style') {\n if (value == null) return;\n ctx.root.value += ` style=\"${escapeAttr(String(value))}\"`;\n return;\n }\n\n // 4. 布尔属性\n if (BOOLEAN_ATTRS.has(key)) {\n if (value !== false && value !== null && value !== undefined) {\n ctx.root.value += ` ${key}`;\n }\n return;\n }\n\n // 5. data-* / aria-* — 对齐 Browser:null 时不输出\n if (key.startsWith('data-') || key.startsWith('aria-')) {\n if (value == null) return;\n ctx.root.value += ` ${key}=\"${escapeAttr(value)}\"`;\n return;\n }\n\n // 6. 其余属性 — 对齐 Browser:null 时不输出\n if (value == null) return;\n ctx.root.value += ` ${key}=\"${escapeAttr(value)}\"`;\n};\n\nconst appendInnerContent = (node: Element) => {\n if (node._innerHtml != null) {\n ctx.root.value += node._innerHtml;\n return true;\n }\n if (node.textContent != null) {\n ctx.root.value += escapeText(node.textContent);\n return true;\n }\n return false;\n};\n\nconst beforeIndent = (node: Text | Element): boolean => {\n if (node instanceof Text) return true;\n\n const hasText = node.textContent != null;\n const hasHtml = node._innerHtml != null;\n\n // 不能包含内容的元素\n if (VOID_TAGS.has(node.value)) {\n ctx.root.value += `/>`;\n console.warn(`<${node.value}> can't have children`);\n node.startClosed = true;\n node.closed = true;\n return false;\n }\n\n if (hasText || hasHtml) {\n console.warn(`<${node.value}> has ${hasHtml ? 'html' : 'text'} content and child elements — children ignored`);\n ctx.root.value += `>`;\n // 容器元素有 text/html 内容且检测到子节点冲突,立即闭合;与 leaveNode 叶元素路径互斥\n appendInnerContent(node);\n ctx.root.value += `</${node.value}>`;\n node.startClosed = true;\n node.closed = true;\n return false;\n }\n\n ctx.root.value += `>`;\n node.startClosed = true;\n return true;\n};\n\nconst leaveLogicNode = (node: LogicNode) => {\n const realAfter = node.realAfter as Anchor;\n ctx.root.value += `<!--${realAfter.value}-->`;\n};\nconst leaveNode = (node: Text | Element, isDedent: boolean) => {\n /**\n * indent 提前 closed 就退出,这两种都是有缩进的\n * 1. 元素属于 VOID_TAGS\n * 2. 元素 text/html 属性与 children 冲突,采用 text/html\n */\n if (node.closed) return;\n if (node instanceof Text) {\n ctx.root.value += escapeText(node.textContent);\n } else {\n // 如果现在是 \"<div>\" 状态,添加 />\n if (node.startClosed) {\n // 什么都不做,正常永远都不会进入,因为 beforeIndent 会直接加 /> 设置 closed = true\n if (VOID_TAGS.has(node.value)) {\n } else {\n ctx.root.value += `</${node.value}>`;\n }\n }\n // 无 startClosed, 叶子节点\n else {\n // 直接自闭合\n if (VOID_TAGS.has(node.value)) {\n ctx.root.value += ` />`;\n }\n // 先加入 '>' 再看有内容加内容,最后反 Tag 闭合\n else {\n ctx.root.value += `>`;\n // 叶元素,无子节点;与 beforeIndent 中的 appendInnerContent 互斥\n appendInnerContent(node);\n ctx.root.value += `</${node.value}>`;\n }\n }\n }\n};\n\nconst insertAfter = (parent: SSRNode, node: SSRNode, prev: SSRNode | null) => {\n const next = prev ? prev.nextSibling : parent.firstChild;\n node.nextSibling = next;\n node.prevSibling = prev;\n\n if (prev) {\n prev.nextSibling = node;\n } else {\n parent.firstChild = node;\n }\n if (next) {\n next.prevSibling = node;\n } else {\n parent.lastChild = node;\n }\n node.parent = parent;\n};\n\nconst createAnchor = (name: string, isBefore?: boolean) => {\n if (isBefore) {\n ctx.root.value += `<!--${name}-->`;\n }\n return new Anchor(name);\n};\n\nconst remove = (node: SSRNode) => {\n const { parent, prevSibling, nextSibling } = node;\n if (prevSibling) {\n prevSibling.nextSibling = nextSibling;\n }\n if (nextSibling) {\n nextSibling.prevSibling = prevSibling;\n }\n if (parent) {\n if (parent.firstChild === node) {\n parent.firstChild = nextSibling;\n }\n if (parent.lastChild === node) {\n parent.lastChild = prevSibling;\n }\n }\n};\n\nconst firstChild = (node: SSRNode) => node.firstChild;\n\nconst nextSib = (node: SSRNode) => node.nextSibling;\n\nexport const renderHtmlStr = (ComponentClass: typeof Store) => {\n cleanCtx();\n const root = new Root('');\n ctx.root = ctx.current = root;\n const render = customRender({\n createNode,\n setProp,\n insertAfter,\n createAnchor,\n remove,\n firstChild,\n nextSib,\n beforeIndent,\n leaveNode,\n leaveLogicNode,\n noopEffect: true\n });\n render(ComponentClass, root);\n return {\n html: ctx.root.value\n };\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\nclass TreeCursor {\n private parent: Node;\n private claimed = new WeakSet<Node>();\n\n constructor(container: Node) {\n this.parent = container;\n }\n\n enterChildren(node: Node) {\n this.parent = node;\n }\n\n leaveToParent(node: Node) {\n if (node === this.parent && this.parent.parentNode) {\n this.parent = this.parent.parentNode;\n }\n }\n\n private findUnclaimed(predicate: (node: Node) => boolean): Node | null {\n let node = this.parent.firstChild;\n while (node) {\n if (!this.claimed.has(node) && predicate(node)) {\n this.claimed.add(node);\n return node;\n }\n node = node.nextSibling;\n }\n return null;\n }\n\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 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 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 container = rootEl.parentNode!;\n const cursor = new TreeCursor(container);\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 === 'text' || 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 const leaveLogicNode = (node: Node) => {\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 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, container);\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","className","Array","isArray","names","Object","entries","filter","v","map","k","join","setAttribute","classList","toggle","str","String","style","cssText","innerHTML","undefined","removeAttribute","tagName","insertAfter","parent","prev","insertBefore","firstChild","nextSibling","createAnchor","createComment","remove","nextSib","beforeIndent","tag","toLowerCase","hasText","console","warn","leaveNode","leaveLogicNode","render","customRender","ctx","root","current","cleanCtx","keys","forEach","SSRNode","lastChild","prevSibling","closed","startClosed","_innerHtml","SSRNodeType","Element","type","attrs","constructor","Text","Anchor","Root","VOID_TAGS","ATTR_RE","TEXT_RE","ATTR_MAP","TEXT_MAP","escapeAttr","s","test","replace","m","escapeText","classStr","appendInnerContent","hasHtml","realAfter","isDedent","next","isBefore","renderHtmlStr","ComponentClass","noopEffect","html","TreeCursor","claimed","WeakSet","container","enterChildren","leaveToParent","parentNode","findUnclaimed","predicate","add","tryClaimElement","nodeType","tryClaimComment","data","tryClaimText","trim","hydrate","rootEl","cursor","isFirstRender","hydrateSetProp","browserCreateNode","expectedNext","onBeforeFlush"],"mappings":"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"}
1
+ {"version":3,"file":"bobe-dom.cjs.js","sources":["../src/render.ts","../src/global.ts","../src/type.ts","../src/render-html-str.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. text\n if (key === 'text') {\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 === '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 { SSRCtx } from './type';\nexport let ctx: SSRCtx = {\n root: null,\n current: null\n};\n\nexport const cleanCtx = () =>\n Object.keys(ctx).forEach(key => {\n ctx[key] = null;\n });\n","export class SSRNode {\n type: SSRNodeType;\n // 链表\n parent?: SSRNode | null = null;\n firstChild: SSRNode | null = null;\n lastChild: SSRNode | null = null; // O(1) 尾插\n nextSibling: SSRNode | null = null;\n prevSibling: SSRNode | null = null;\n closed: boolean = false;\n startClosed: boolean = false;\n // innerHTML 缓存\n _innerHtml: string | null = null;\n}\n\nexport enum SSRNodeType {\n Element,\n Text,\n Anchor,\n Root\n}\n\nexport class Element extends SSRNode {\n type = SSRNodeType.Element;\n textContent: string | null = null;\n\n attrs: Record<string, string> = {};\n constructor(\n /** 标签名 */\n public value: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\n\nexport class Text extends SSRNode {\n type = SSRNodeType.Text;\n constructor(\n /** 文本内容 */\n public textContent: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\n\nexport class Anchor extends SSRNode {\n type = SSRNodeType.Anchor;\n constructor(\n /** 注释内容 */\n public value: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\nexport class Root extends SSRNode {\n type = SSRNodeType.Root;\n constructor(\n /** 输出 HTML */\n public value: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\n\nexport type SSRCtx = {\n /** 根节点 */\n root: Root;\n /** 当前节点 */\n current: SSRNode;\n};\n","import { customRender, Store, LogicNode } from 'bobe';\nimport { cleanCtx, ctx } from './global';\nimport { Root, Element, Text, Anchor, SSRNode, SSRNodeType } from './type';\n\nconst VOID_TAGS = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr'\n]);\n\nconst BOOLEAN_ATTRS = new Set([\n 'disabled',\n 'readonly',\n 'checked',\n 'selected',\n 'hidden',\n 'multiple',\n 'required',\n 'autofocus',\n 'autoplay',\n 'controls',\n 'loop',\n 'muted',\n 'defer',\n 'async',\n 'reversed',\n 'open',\n 'itemscope',\n 'ismap',\n 'nohref',\n 'noshade',\n 'nowrap',\n 'compact',\n 'default'\n]);\n\nconst ATTR_RE = /[&\"<>]/g;\nconst TEXT_RE = /[&<>]/g;\nconst ATTR_MAP: Record<string, string> = {\n '&': '&amp;',\n '\"': '&quot;',\n '<': '&lt;',\n '>': '&gt;'\n};\nconst TEXT_MAP: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;'\n};\n\nconst escapeAttr = (str: string) => {\n const s = String(str);\n return ATTR_RE.test(s) ? s.replace(ATTR_RE, m => ATTR_MAP[m]) : s;\n};\n\nconst escapeText = (str: string) => {\n const s = String(str);\n return TEXT_RE.test(s) ? s.replace(TEXT_RE, m => TEXT_MAP[m]) : s;\n};\n\nconst createNode = (name: string) => {\n if (name === 'text') {\n return new Text('');\n }\n ctx.root.value += `<${name}`;\n return new Element(name);\n};\n\nconst setProp = (node: Text | Element, key: string, value: any) => {\n if (node.startClosed) return;\n if (key.startsWith('on') || key === 'ref') return;\n\n // 0. text\n if (key === 'text') {\n if (value == null) return;\n node.textContent = value;\n return;\n }\n\n // 1. html\n if (key === 'html') {\n if (value == null) return;\n node._innerHtml = String(value);\n return;\n }\n\n // 2. class — 对齐 Browser:支持对象/字符串/null\n if (key === 'class') {\n if (value == null) return;\n let classStr: string;\n if (typeof value === 'object' && !Array.isArray(value)) {\n classStr = Object.entries(value as Record<string, any>)\n .filter(([, v]) => !!v)\n .map(([k]) => k)\n .join(' ');\n } else {\n classStr = typeof value === 'boolean' ? (value ? 'true' : '') : String(value);\n }\n if (classStr) ctx.root.value += ` class=\"${escapeAttr(classStr)}\"`;\n return;\n }\n\n // 3. style — 对齐 Browser\n if (key === 'style') {\n if (value == null) return;\n ctx.root.value += ` style=\"${escapeAttr(String(value))}\"`;\n return;\n }\n\n // 4. 布尔属性\n if (BOOLEAN_ATTRS.has(key)) {\n if (value !== false && value !== null && value !== undefined) {\n ctx.root.value += ` ${key}`;\n }\n return;\n }\n\n // 5. data-* / aria-* — 对齐 Browser:null 时不输出\n if (key.startsWith('data-') || key.startsWith('aria-')) {\n if (value == null) return;\n ctx.root.value += ` ${key}=\"${escapeAttr(value)}\"`;\n return;\n }\n\n // 6. 其余属性 — 对齐 Browser:null 时不输出\n if (value == null) return;\n ctx.root.value += ` ${key}=\"${escapeAttr(value)}\"`;\n};\n\nconst appendInnerContent = (node: Element) => {\n if (node._innerHtml != null) {\n ctx.root.value += node._innerHtml;\n return true;\n }\n if (node.textContent != null) {\n ctx.root.value += escapeText(node.textContent);\n return true;\n }\n return false;\n};\n\nconst beforeIndent = (node: Text | Element): boolean => {\n if (node instanceof Text) return true;\n\n const hasText = node.textContent != null;\n const hasHtml = node._innerHtml != null;\n\n // 不能包含内容的元素\n if (VOID_TAGS.has(node.value)) {\n ctx.root.value += `/>`;\n console.warn(`<${node.value}> can't have children`);\n node.startClosed = true;\n node.closed = true;\n return false;\n }\n\n if (hasText || hasHtml) {\n console.warn(`<${node.value}> has ${hasHtml ? 'html' : 'text'} content and child elements — children ignored`);\n ctx.root.value += `>`;\n // 容器元素有 text/html 内容且检测到子节点冲突,立即闭合;与 leaveNode 叶元素路径互斥\n appendInnerContent(node);\n ctx.root.value += `</${node.value}>`;\n node.startClosed = true;\n node.closed = true;\n return false;\n }\n\n ctx.root.value += `>`;\n node.startClosed = true;\n return true;\n};\n\nconst leaveLogicNode = (node: LogicNode) => {\n const realAfter = node.realAfter as Anchor;\n ctx.root.value += `<!--${realAfter.value}-->`;\n};\nconst leaveNode = (node: Text | Element, isDedent: boolean) => {\n /**\n * indent 提前 closed 就退出,这两种都是有缩进的\n * 1. 元素属于 VOID_TAGS\n * 2. 元素 text/html 属性与 children 冲突,采用 text/html\n */\n if (node.closed) return;\n if (node instanceof Text) {\n ctx.root.value += escapeText(node.textContent);\n } else {\n // 如果现在是 \"<div>\" 状态,添加 />\n if (node.startClosed) {\n // 什么都不做,正常永远都不会进入,因为 beforeIndent 会直接加 /> 设置 closed = true\n if (VOID_TAGS.has(node.value)) {\n } else {\n ctx.root.value += `</${node.value}>`;\n }\n }\n // 无 startClosed, 叶子节点\n else {\n // 直接自闭合\n if (VOID_TAGS.has(node.value)) {\n ctx.root.value += ` />`;\n }\n // 先加入 '>' 再看有内容加内容,最后反 Tag 闭合\n else {\n ctx.root.value += `>`;\n // 叶元素,无子节点;与 beforeIndent 中的 appendInnerContent 互斥\n appendInnerContent(node);\n ctx.root.value += `</${node.value}>`;\n }\n }\n }\n};\n\nconst insertAfter = (parent: SSRNode, node: SSRNode, prev: SSRNode | null) => {\n const next = prev ? prev.nextSibling : parent.firstChild;\n node.nextSibling = next;\n node.prevSibling = prev;\n\n if (prev) {\n prev.nextSibling = node;\n } else {\n parent.firstChild = node;\n }\n if (next) {\n next.prevSibling = node;\n } else {\n parent.lastChild = node;\n }\n node.parent = parent;\n};\n\nconst createAnchor = (name: string, isBefore?: boolean) => {\n if (isBefore) {\n ctx.root.value += `<!--${name}-->`;\n }\n return new Anchor(name);\n};\n\nconst remove = (node: SSRNode) => {\n const { parent, prevSibling, nextSibling } = node;\n if (prevSibling) {\n prevSibling.nextSibling = nextSibling;\n }\n if (nextSibling) {\n nextSibling.prevSibling = prevSibling;\n }\n if (parent) {\n if (parent.firstChild === node) {\n parent.firstChild = nextSibling;\n }\n if (parent.lastChild === node) {\n parent.lastChild = prevSibling;\n }\n }\n};\n\nconst firstChild = (node: SSRNode) => node.firstChild;\n\nconst nextSib = (node: SSRNode) => node.nextSibling;\n\nexport const renderHtmlStr = (ComponentClass: typeof Store) => {\n cleanCtx();\n const root = new Root('');\n ctx.root = ctx.current = root;\n const render = customRender({\n createNode,\n setProp,\n insertAfter,\n createAnchor,\n remove,\n firstChild,\n nextSib,\n beforeIndent,\n leaveNode,\n leaveLogicNode,\n noopEffect: true\n });\n render(ComponentClass, root);\n return {\n html: ctx.root.value\n };\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 /** 已认领节点集合,避免同一次遍历中重复认领 */\n private claimed = new WeakSet<Node>();\n\n constructor(container: Node) {\n this.parent = container;\n }\n\n /** 进入子节点:后续 findUnclaimed 搜 node 的直接子级 */\n enterChildren(node: Node) {\n this.parent = node;\n }\n\n /** 退出当前节点,回到父级 */\n leaveToParent(node: Node) {\n if (node === this.parent && this.parent.parentNode) {\n this.parent = this.parent.parentNode;\n }\n }\n\n /** 在 this.parent 的 firstChild 链上查找第一个满足条件且未被认领的节点 */\n private findUnclaimed(predicate: (node: Node) => boolean): Node | null {\n let node = this.parent.firstChild;\n while (node) {\n if (!this.claimed.has(node) && predicate(node)) {\n this.claimed.add(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 === 'text' || 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 const leaveLogicNode = (node: Node) => {\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 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","className","Array","isArray","names","Object","entries","filter","v","map","k","join","setAttribute","classList","toggle","str","String","style","cssText","innerHTML","undefined","removeAttribute","tagName","insertAfter","parent","prev","insertBefore","firstChild","nextSibling","createAnchor","createComment","remove","nextSib","beforeIndent","tag","toLowerCase","hasText","console","warn","leaveNode","leaveLogicNode","render","customRender","ctx","root","current","cleanCtx","keys","forEach","SSRNode","lastChild","prevSibling","closed","startClosed","_innerHtml","SSRNodeType","Element","type","attrs","constructor","Text","Anchor","Root","VOID_TAGS","ATTR_RE","TEXT_RE","ATTR_MAP","TEXT_MAP","escapeAttr","s","test","replace","m","escapeText","classStr","appendInnerContent","hasHtml","realAfter","isDedent","next","isBefore","renderHtmlStr","ComponentClass","noopEffect","html","TreeCursor","claimed","WeakSet","container","enterChildren","leaveToParent","parentNode","findUnclaimed","predicate","add","tryClaimElement","nodeType","tryClaimComment","data","tryClaimText","trim","hydrate","rootEl","cursor","isFirstRender","hydrateSetProp","browserCreateNode","expectedNext","onBeforeFlush"],"mappings":"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"}
@@ -424,8 +424,7 @@ class TreeCursor {
424
424
  }
425
425
  }
426
426
  const hydrate = (ComponentClass, rootEl) => {
427
- const container = rootEl.parentNode;
428
- const cursor = new TreeCursor(container);
427
+ const cursor = new TreeCursor(rootEl);
429
428
  let isFirstRender = true;
430
429
  const hydrateSetProp = (node, key, value) => {
431
430
  if (isFirstRender && (key === 'text' || key === 'html')) {
@@ -484,7 +483,7 @@ const hydrate = (ComponentClass, rootEl) => {
484
483
  isFirstRender = false;
485
484
  }
486
485
  });
487
- return render(ComponentClass, container);
486
+ return render(ComponentClass, rootEl);
488
487
  };
489
488
 
490
489
  export { BOOLEAN_ATTRS$1 as BOOLEAN_ATTRS, CONTENT_FLAG, beforeIndent$1 as beforeIndent, createAnchor$1 as createAnchor, createNode$1 as createNode, firstChild$1 as firstChild, hydrate, insertAfter$1 as insertAfter, leaveLogicNode$1 as leaveLogicNode, leaveNode$1 as leaveNode, nextSib$1 as nextSib, remove$1 as remove, render, renderHtmlStr, setProp$1 as setProp };
@@ -1 +1 @@
1
- {"version":3,"file":"bobe-dom.esm.js","sources":["../src/render.ts","../src/global.ts","../src/type.ts","../src/render-html-str.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. text\n if (key === 'text') {\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 === '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 { SSRCtx } from './type';\nexport let ctx: SSRCtx = {\n root: null,\n current: null\n};\n\nexport const cleanCtx = () =>\n Object.keys(ctx).forEach(key => {\n ctx[key] = null;\n });\n","export class SSRNode {\n type: SSRNodeType;\n // 链表\n parent?: SSRNode | null = null;\n firstChild: SSRNode | null = null;\n lastChild: SSRNode | null = null; // O(1) 尾插\n nextSibling: SSRNode | null = null;\n prevSibling: SSRNode | null = null;\n closed: boolean = false;\n startClosed: boolean = false;\n // innerHTML 缓存\n _innerHtml: string | null = null;\n}\n\nexport enum SSRNodeType {\n Element,\n Text,\n Anchor,\n Root\n}\n\nexport class Element extends SSRNode {\n type = SSRNodeType.Element;\n textContent: string | null = null;\n\n attrs: Record<string, string> = {};\n constructor(\n /** 标签名 */\n public value: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\n\nexport class Text extends SSRNode {\n type = SSRNodeType.Text;\n constructor(\n /** 文本内容 */\n public textContent: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\n\nexport class Anchor extends SSRNode {\n type = SSRNodeType.Anchor;\n constructor(\n /** 注释内容 */\n public value: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\nexport class Root extends SSRNode {\n type = SSRNodeType.Root;\n constructor(\n /** 输出 HTML */\n public value: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\n\nexport type SSRCtx = {\n /** 根节点 */\n root: Root;\n /** 当前节点 */\n current: SSRNode;\n};\n","import { customRender, Store, LogicNode } from 'bobe';\nimport { cleanCtx, ctx } from './global';\nimport { Root, Element, Text, Anchor, SSRNode, SSRNodeType } from './type';\n\nconst VOID_TAGS = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr'\n]);\n\nconst BOOLEAN_ATTRS = new Set([\n 'disabled',\n 'readonly',\n 'checked',\n 'selected',\n 'hidden',\n 'multiple',\n 'required',\n 'autofocus',\n 'autoplay',\n 'controls',\n 'loop',\n 'muted',\n 'defer',\n 'async',\n 'reversed',\n 'open',\n 'itemscope',\n 'ismap',\n 'nohref',\n 'noshade',\n 'nowrap',\n 'compact',\n 'default'\n]);\n\nconst ATTR_RE = /[&\"<>]/g;\nconst TEXT_RE = /[&<>]/g;\nconst ATTR_MAP: Record<string, string> = {\n '&': '&amp;',\n '\"': '&quot;',\n '<': '&lt;',\n '>': '&gt;'\n};\nconst TEXT_MAP: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;'\n};\n\nconst escapeAttr = (str: string) => {\n const s = String(str);\n return ATTR_RE.test(s) ? s.replace(ATTR_RE, m => ATTR_MAP[m]) : s;\n};\n\nconst escapeText = (str: string) => {\n const s = String(str);\n return TEXT_RE.test(s) ? s.replace(TEXT_RE, m => TEXT_MAP[m]) : s;\n};\n\nconst createNode = (name: string) => {\n if (name === 'text') {\n return new Text('');\n }\n ctx.root.value += `<${name}`;\n return new Element(name);\n};\n\nconst setProp = (node: Text | Element, key: string, value: any) => {\n if (node.startClosed) return;\n if (key.startsWith('on') || key === 'ref') return;\n\n // 0. text\n if (key === 'text') {\n if (value == null) return;\n node.textContent = value;\n return;\n }\n\n // 1. html\n if (key === 'html') {\n if (value == null) return;\n node._innerHtml = String(value);\n return;\n }\n\n // 2. class — 对齐 Browser:支持对象/字符串/null\n if (key === 'class') {\n if (value == null) return;\n let classStr: string;\n if (typeof value === 'object' && !Array.isArray(value)) {\n classStr = Object.entries(value as Record<string, any>)\n .filter(([, v]) => !!v)\n .map(([k]) => k)\n .join(' ');\n } else {\n classStr = typeof value === 'boolean' ? (value ? 'true' : '') : String(value);\n }\n if (classStr) ctx.root.value += ` class=\"${escapeAttr(classStr)}\"`;\n return;\n }\n\n // 3. style — 对齐 Browser\n if (key === 'style') {\n if (value == null) return;\n ctx.root.value += ` style=\"${escapeAttr(String(value))}\"`;\n return;\n }\n\n // 4. 布尔属性\n if (BOOLEAN_ATTRS.has(key)) {\n if (value !== false && value !== null && value !== undefined) {\n ctx.root.value += ` ${key}`;\n }\n return;\n }\n\n // 5. data-* / aria-* — 对齐 Browser:null 时不输出\n if (key.startsWith('data-') || key.startsWith('aria-')) {\n if (value == null) return;\n ctx.root.value += ` ${key}=\"${escapeAttr(value)}\"`;\n return;\n }\n\n // 6. 其余属性 — 对齐 Browser:null 时不输出\n if (value == null) return;\n ctx.root.value += ` ${key}=\"${escapeAttr(value)}\"`;\n};\n\nconst appendInnerContent = (node: Element) => {\n if (node._innerHtml != null) {\n ctx.root.value += node._innerHtml;\n return true;\n }\n if (node.textContent != null) {\n ctx.root.value += escapeText(node.textContent);\n return true;\n }\n return false;\n};\n\nconst beforeIndent = (node: Text | Element): boolean => {\n if (node instanceof Text) return true;\n\n const hasText = node.textContent != null;\n const hasHtml = node._innerHtml != null;\n\n // 不能包含内容的元素\n if (VOID_TAGS.has(node.value)) {\n ctx.root.value += `/>`;\n console.warn(`<${node.value}> can't have children`);\n node.startClosed = true;\n node.closed = true;\n return false;\n }\n\n if (hasText || hasHtml) {\n console.warn(`<${node.value}> has ${hasHtml ? 'html' : 'text'} content and child elements — children ignored`);\n ctx.root.value += `>`;\n // 容器元素有 text/html 内容且检测到子节点冲突,立即闭合;与 leaveNode 叶元素路径互斥\n appendInnerContent(node);\n ctx.root.value += `</${node.value}>`;\n node.startClosed = true;\n node.closed = true;\n return false;\n }\n\n ctx.root.value += `>`;\n node.startClosed = true;\n return true;\n};\n\nconst leaveLogicNode = (node: LogicNode) => {\n const realAfter = node.realAfter as Anchor;\n ctx.root.value += `<!--${realAfter.value}-->`;\n};\nconst leaveNode = (node: Text | Element, isDedent: boolean) => {\n /**\n * indent 提前 closed 就退出,这两种都是有缩进的\n * 1. 元素属于 VOID_TAGS\n * 2. 元素 text/html 属性与 children 冲突,采用 text/html\n */\n if (node.closed) return;\n if (node instanceof Text) {\n ctx.root.value += escapeText(node.textContent);\n } else {\n // 如果现在是 \"<div>\" 状态,添加 />\n if (node.startClosed) {\n // 什么都不做,正常永远都不会进入,因为 beforeIndent 会直接加 /> 设置 closed = true\n if (VOID_TAGS.has(node.value)) {\n } else {\n ctx.root.value += `</${node.value}>`;\n }\n }\n // 无 startClosed, 叶子节点\n else {\n // 直接自闭合\n if (VOID_TAGS.has(node.value)) {\n ctx.root.value += ` />`;\n }\n // 先加入 '>' 再看有内容加内容,最后反 Tag 闭合\n else {\n ctx.root.value += `>`;\n // 叶元素,无子节点;与 beforeIndent 中的 appendInnerContent 互斥\n appendInnerContent(node);\n ctx.root.value += `</${node.value}>`;\n }\n }\n }\n};\n\nconst insertAfter = (parent: SSRNode, node: SSRNode, prev: SSRNode | null) => {\n const next = prev ? prev.nextSibling : parent.firstChild;\n node.nextSibling = next;\n node.prevSibling = prev;\n\n if (prev) {\n prev.nextSibling = node;\n } else {\n parent.firstChild = node;\n }\n if (next) {\n next.prevSibling = node;\n } else {\n parent.lastChild = node;\n }\n node.parent = parent;\n};\n\nconst createAnchor = (name: string, isBefore?: boolean) => {\n if (isBefore) {\n ctx.root.value += `<!--${name}-->`;\n }\n return new Anchor(name);\n};\n\nconst remove = (node: SSRNode) => {\n const { parent, prevSibling, nextSibling } = node;\n if (prevSibling) {\n prevSibling.nextSibling = nextSibling;\n }\n if (nextSibling) {\n nextSibling.prevSibling = prevSibling;\n }\n if (parent) {\n if (parent.firstChild === node) {\n parent.firstChild = nextSibling;\n }\n if (parent.lastChild === node) {\n parent.lastChild = prevSibling;\n }\n }\n};\n\nconst firstChild = (node: SSRNode) => node.firstChild;\n\nconst nextSib = (node: SSRNode) => node.nextSibling;\n\nexport const renderHtmlStr = (ComponentClass: typeof Store) => {\n cleanCtx();\n const root = new Root('');\n ctx.root = ctx.current = root;\n const render = customRender({\n createNode,\n setProp,\n insertAfter,\n createAnchor,\n remove,\n firstChild,\n nextSib,\n beforeIndent,\n leaveNode,\n leaveLogicNode,\n noopEffect: true\n });\n render(ComponentClass, root);\n return {\n html: ctx.root.value\n };\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\nclass TreeCursor {\n private parent: Node;\n private claimed = new WeakSet<Node>();\n\n constructor(container: Node) {\n this.parent = container;\n }\n\n enterChildren(node: Node) {\n this.parent = node;\n }\n\n leaveToParent(node: Node) {\n if (node === this.parent && this.parent.parentNode) {\n this.parent = this.parent.parentNode;\n }\n }\n\n private findUnclaimed(predicate: (node: Node) => boolean): Node | null {\n let node = this.parent.firstChild;\n while (node) {\n if (!this.claimed.has(node) && predicate(node)) {\n this.claimed.add(node);\n return node;\n }\n node = node.nextSibling;\n }\n return null;\n }\n\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 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 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 container = rootEl.parentNode!;\n const cursor = new TreeCursor(container);\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 === 'text' || 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 const leaveLogicNode = (node: Node) => {\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 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, container);\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","className","Array","isArray","names","Object","entries","filter","v","map","k","join","setAttribute","classList","toggle","str","String","style","cssText","innerHTML","undefined","removeAttribute","tagName","insertAfter","parent","prev","insertBefore","firstChild","nextSibling","createAnchor","createComment","remove","nextSib","beforeIndent","tag","toLowerCase","hasText","console","warn","leaveNode","leaveLogicNode","render","customRender","ctx","root","current","cleanCtx","keys","forEach","SSRNode","lastChild","prevSibling","closed","startClosed","_innerHtml","SSRNodeType","Element","type","attrs","constructor","Text","Anchor","Root","VOID_TAGS","ATTR_RE","TEXT_RE","ATTR_MAP","TEXT_MAP","escapeAttr","s","test","replace","m","escapeText","classStr","appendInnerContent","hasHtml","realAfter","isDedent","next","isBefore","renderHtmlStr","ComponentClass","noopEffect","html","TreeCursor","claimed","WeakSet","container","enterChildren","leaveToParent","parentNode","findUnclaimed","predicate","add","tryClaimElement","nodeType","tryClaimComment","data","tryClaimText","trim","hydrate","rootEl","cursor","isFirstRender","hydrateSetProp","browserCreateNode","expectedNext","onBeforeFlush"],"mappings":"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"}
1
+ {"version":3,"file":"bobe-dom.esm.js","sources":["../src/render.ts","../src/global.ts","../src/type.ts","../src/render-html-str.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. text\n if (key === 'text') {\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 === '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 { SSRCtx } from './type';\nexport let ctx: SSRCtx = {\n root: null,\n current: null\n};\n\nexport const cleanCtx = () =>\n Object.keys(ctx).forEach(key => {\n ctx[key] = null;\n });\n","export class SSRNode {\n type: SSRNodeType;\n // 链表\n parent?: SSRNode | null = null;\n firstChild: SSRNode | null = null;\n lastChild: SSRNode | null = null; // O(1) 尾插\n nextSibling: SSRNode | null = null;\n prevSibling: SSRNode | null = null;\n closed: boolean = false;\n startClosed: boolean = false;\n // innerHTML 缓存\n _innerHtml: string | null = null;\n}\n\nexport enum SSRNodeType {\n Element,\n Text,\n Anchor,\n Root\n}\n\nexport class Element extends SSRNode {\n type = SSRNodeType.Element;\n textContent: string | null = null;\n\n attrs: Record<string, string> = {};\n constructor(\n /** 标签名 */\n public value: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\n\nexport class Text extends SSRNode {\n type = SSRNodeType.Text;\n constructor(\n /** 文本内容 */\n public textContent: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\n\nexport class Anchor extends SSRNode {\n type = SSRNodeType.Anchor;\n constructor(\n /** 注释内容 */\n public value: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\nexport class Root extends SSRNode {\n type = SSRNodeType.Root;\n constructor(\n /** 输出 HTML */\n public value: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\n\nexport type SSRCtx = {\n /** 根节点 */\n root: Root;\n /** 当前节点 */\n current: SSRNode;\n};\n","import { customRender, Store, LogicNode } from 'bobe';\nimport { cleanCtx, ctx } from './global';\nimport { Root, Element, Text, Anchor, SSRNode, SSRNodeType } from './type';\n\nconst VOID_TAGS = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr'\n]);\n\nconst BOOLEAN_ATTRS = new Set([\n 'disabled',\n 'readonly',\n 'checked',\n 'selected',\n 'hidden',\n 'multiple',\n 'required',\n 'autofocus',\n 'autoplay',\n 'controls',\n 'loop',\n 'muted',\n 'defer',\n 'async',\n 'reversed',\n 'open',\n 'itemscope',\n 'ismap',\n 'nohref',\n 'noshade',\n 'nowrap',\n 'compact',\n 'default'\n]);\n\nconst ATTR_RE = /[&\"<>]/g;\nconst TEXT_RE = /[&<>]/g;\nconst ATTR_MAP: Record<string, string> = {\n '&': '&amp;',\n '\"': '&quot;',\n '<': '&lt;',\n '>': '&gt;'\n};\nconst TEXT_MAP: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;'\n};\n\nconst escapeAttr = (str: string) => {\n const s = String(str);\n return ATTR_RE.test(s) ? s.replace(ATTR_RE, m => ATTR_MAP[m]) : s;\n};\n\nconst escapeText = (str: string) => {\n const s = String(str);\n return TEXT_RE.test(s) ? s.replace(TEXT_RE, m => TEXT_MAP[m]) : s;\n};\n\nconst createNode = (name: string) => {\n if (name === 'text') {\n return new Text('');\n }\n ctx.root.value += `<${name}`;\n return new Element(name);\n};\n\nconst setProp = (node: Text | Element, key: string, value: any) => {\n if (node.startClosed) return;\n if (key.startsWith('on') || key === 'ref') return;\n\n // 0. text\n if (key === 'text') {\n if (value == null) return;\n node.textContent = value;\n return;\n }\n\n // 1. html\n if (key === 'html') {\n if (value == null) return;\n node._innerHtml = String(value);\n return;\n }\n\n // 2. class — 对齐 Browser:支持对象/字符串/null\n if (key === 'class') {\n if (value == null) return;\n let classStr: string;\n if (typeof value === 'object' && !Array.isArray(value)) {\n classStr = Object.entries(value as Record<string, any>)\n .filter(([, v]) => !!v)\n .map(([k]) => k)\n .join(' ');\n } else {\n classStr = typeof value === 'boolean' ? (value ? 'true' : '') : String(value);\n }\n if (classStr) ctx.root.value += ` class=\"${escapeAttr(classStr)}\"`;\n return;\n }\n\n // 3. style — 对齐 Browser\n if (key === 'style') {\n if (value == null) return;\n ctx.root.value += ` style=\"${escapeAttr(String(value))}\"`;\n return;\n }\n\n // 4. 布尔属性\n if (BOOLEAN_ATTRS.has(key)) {\n if (value !== false && value !== null && value !== undefined) {\n ctx.root.value += ` ${key}`;\n }\n return;\n }\n\n // 5. data-* / aria-* — 对齐 Browser:null 时不输出\n if (key.startsWith('data-') || key.startsWith('aria-')) {\n if (value == null) return;\n ctx.root.value += ` ${key}=\"${escapeAttr(value)}\"`;\n return;\n }\n\n // 6. 其余属性 — 对齐 Browser:null 时不输出\n if (value == null) return;\n ctx.root.value += ` ${key}=\"${escapeAttr(value)}\"`;\n};\n\nconst appendInnerContent = (node: Element) => {\n if (node._innerHtml != null) {\n ctx.root.value += node._innerHtml;\n return true;\n }\n if (node.textContent != null) {\n ctx.root.value += escapeText(node.textContent);\n return true;\n }\n return false;\n};\n\nconst beforeIndent = (node: Text | Element): boolean => {\n if (node instanceof Text) return true;\n\n const hasText = node.textContent != null;\n const hasHtml = node._innerHtml != null;\n\n // 不能包含内容的元素\n if (VOID_TAGS.has(node.value)) {\n ctx.root.value += `/>`;\n console.warn(`<${node.value}> can't have children`);\n node.startClosed = true;\n node.closed = true;\n return false;\n }\n\n if (hasText || hasHtml) {\n console.warn(`<${node.value}> has ${hasHtml ? 'html' : 'text'} content and child elements — children ignored`);\n ctx.root.value += `>`;\n // 容器元素有 text/html 内容且检测到子节点冲突,立即闭合;与 leaveNode 叶元素路径互斥\n appendInnerContent(node);\n ctx.root.value += `</${node.value}>`;\n node.startClosed = true;\n node.closed = true;\n return false;\n }\n\n ctx.root.value += `>`;\n node.startClosed = true;\n return true;\n};\n\nconst leaveLogicNode = (node: LogicNode) => {\n const realAfter = node.realAfter as Anchor;\n ctx.root.value += `<!--${realAfter.value}-->`;\n};\nconst leaveNode = (node: Text | Element, isDedent: boolean) => {\n /**\n * indent 提前 closed 就退出,这两种都是有缩进的\n * 1. 元素属于 VOID_TAGS\n * 2. 元素 text/html 属性与 children 冲突,采用 text/html\n */\n if (node.closed) return;\n if (node instanceof Text) {\n ctx.root.value += escapeText(node.textContent);\n } else {\n // 如果现在是 \"<div>\" 状态,添加 />\n if (node.startClosed) {\n // 什么都不做,正常永远都不会进入,因为 beforeIndent 会直接加 /> 设置 closed = true\n if (VOID_TAGS.has(node.value)) {\n } else {\n ctx.root.value += `</${node.value}>`;\n }\n }\n // 无 startClosed, 叶子节点\n else {\n // 直接自闭合\n if (VOID_TAGS.has(node.value)) {\n ctx.root.value += ` />`;\n }\n // 先加入 '>' 再看有内容加内容,最后反 Tag 闭合\n else {\n ctx.root.value += `>`;\n // 叶元素,无子节点;与 beforeIndent 中的 appendInnerContent 互斥\n appendInnerContent(node);\n ctx.root.value += `</${node.value}>`;\n }\n }\n }\n};\n\nconst insertAfter = (parent: SSRNode, node: SSRNode, prev: SSRNode | null) => {\n const next = prev ? prev.nextSibling : parent.firstChild;\n node.nextSibling = next;\n node.prevSibling = prev;\n\n if (prev) {\n prev.nextSibling = node;\n } else {\n parent.firstChild = node;\n }\n if (next) {\n next.prevSibling = node;\n } else {\n parent.lastChild = node;\n }\n node.parent = parent;\n};\n\nconst createAnchor = (name: string, isBefore?: boolean) => {\n if (isBefore) {\n ctx.root.value += `<!--${name}-->`;\n }\n return new Anchor(name);\n};\n\nconst remove = (node: SSRNode) => {\n const { parent, prevSibling, nextSibling } = node;\n if (prevSibling) {\n prevSibling.nextSibling = nextSibling;\n }\n if (nextSibling) {\n nextSibling.prevSibling = prevSibling;\n }\n if (parent) {\n if (parent.firstChild === node) {\n parent.firstChild = nextSibling;\n }\n if (parent.lastChild === node) {\n parent.lastChild = prevSibling;\n }\n }\n};\n\nconst firstChild = (node: SSRNode) => node.firstChild;\n\nconst nextSib = (node: SSRNode) => node.nextSibling;\n\nexport const renderHtmlStr = (ComponentClass: typeof Store) => {\n cleanCtx();\n const root = new Root('');\n ctx.root = ctx.current = root;\n const render = customRender({\n createNode,\n setProp,\n insertAfter,\n createAnchor,\n remove,\n firstChild,\n nextSib,\n beforeIndent,\n leaveNode,\n leaveLogicNode,\n noopEffect: true\n });\n render(ComponentClass, root);\n return {\n html: ctx.root.value\n };\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 /** 已认领节点集合,避免同一次遍历中重复认领 */\n private claimed = new WeakSet<Node>();\n\n constructor(container: Node) {\n this.parent = container;\n }\n\n /** 进入子节点:后续 findUnclaimed 搜 node 的直接子级 */\n enterChildren(node: Node) {\n this.parent = node;\n }\n\n /** 退出当前节点,回到父级 */\n leaveToParent(node: Node) {\n if (node === this.parent && this.parent.parentNode) {\n this.parent = this.parent.parentNode;\n }\n }\n\n /** 在 this.parent 的 firstChild 链上查找第一个满足条件且未被认领的节点 */\n private findUnclaimed(predicate: (node: Node) => boolean): Node | null {\n let node = this.parent.firstChild;\n while (node) {\n if (!this.claimed.has(node) && predicate(node)) {\n this.claimed.add(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 === 'text' || 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 const leaveLogicNode = (node: Node) => {\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 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","className","Array","isArray","names","Object","entries","filter","v","map","k","join","setAttribute","classList","toggle","str","String","style","cssText","innerHTML","undefined","removeAttribute","tagName","insertAfter","parent","prev","insertBefore","firstChild","nextSibling","createAnchor","createComment","remove","nextSib","beforeIndent","tag","toLowerCase","hasText","console","warn","leaveNode","leaveLogicNode","render","customRender","ctx","root","current","cleanCtx","keys","forEach","SSRNode","lastChild","prevSibling","closed","startClosed","_innerHtml","SSRNodeType","Element","type","attrs","constructor","Text","Anchor","Root","VOID_TAGS","ATTR_RE","TEXT_RE","ATTR_MAP","TEXT_MAP","escapeAttr","s","test","replace","m","escapeText","classStr","appendInnerContent","hasHtml","realAfter","isDedent","next","isBefore","renderHtmlStr","ComponentClass","noopEffect","html","TreeCursor","claimed","WeakSet","container","enterChildren","leaveToParent","parentNode","findUnclaimed","predicate","add","tryClaimElement","nodeType","tryClaimComment","data","tryClaimText","trim","hydrate","rootEl","cursor","isFirstRender","hydrateSetProp","browserCreateNode","expectedNext","onBeforeFlush"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -13,20 +13,20 @@ declare const nextSib: (node: Node) => ChildNode;
13
13
  declare const beforeIndent: (node: Node) => boolean | void;
14
14
  declare const leaveNode: () => void;
15
15
  declare const leaveLogicNode: () => void;
16
- declare const render: <T>(Ctor: typeof bobe.Store, root: any) => ((bobe.LogicNode & {
16
+ declare const render: <T extends typeof bobe.Store>(Ctor: T, root: any) => readonly [bobe.LogicNode & {
17
17
  tokenizer: bobe.Tokenizer;
18
18
  fragmentSnapshot?: ReturnType<bobe.Tokenizer["snapshot"]>;
19
19
  resumeSnapshot?: ReturnType<bobe.Tokenizer["snapshot"]>;
20
- }) | bobe.Store)[];
20
+ }, InstanceType<T>];
21
21
 
22
22
  declare const renderHtmlStr: (ComponentClass: typeof Store) => {
23
23
  html: string;
24
24
  };
25
25
 
26
- declare const hydrate: (ComponentClass: typeof Store, rootEl: Element) => (Store | (bobe.LogicNode & {
26
+ declare const hydrate: (ComponentClass: typeof Store, rootEl: Element) => readonly [bobe.LogicNode & {
27
27
  tokenizer: bobe.Tokenizer;
28
28
  fragmentSnapshot?: ReturnType<bobe.Tokenizer["snapshot"]>;
29
29
  resumeSnapshot?: ReturnType<bobe.Tokenizer["snapshot"]>;
30
- }))[];
30
+ }, Store];
31
31
 
32
32
  export { BOOLEAN_ATTRS, CONTENT_FLAG, beforeIndent, createAnchor, createNode, firstChild, hydrate, insertAfter, leaveLogicNode, leaveNode, nextSib, remove, render, renderHtmlStr, setProp };
package/dist/index.umd.js CHANGED
@@ -428,8 +428,7 @@
428
428
  }
429
429
  }
430
430
  const hydrate = (ComponentClass, rootEl) => {
431
- const container = rootEl.parentNode;
432
- const cursor = new TreeCursor(container);
431
+ const cursor = new TreeCursor(rootEl);
433
432
  let isFirstRender = true;
434
433
  const hydrateSetProp = (node, key, value) => {
435
434
  if (isFirstRender && (key === 'text' || key === 'html')) {
@@ -488,7 +487,7 @@
488
487
  isFirstRender = false;
489
488
  }
490
489
  });
491
- return render(ComponentClass, container);
490
+ return render(ComponentClass, rootEl);
492
491
  };
493
492
 
494
493
  exports.BOOLEAN_ATTRS = BOOLEAN_ATTRS$1;
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../src/render.ts","../src/global.ts","../src/type.ts","../src/render-html-str.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. text\n if (key === 'text') {\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 === '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 { SSRCtx } from './type';\nexport let ctx: SSRCtx = {\n root: null,\n current: null\n};\n\nexport const cleanCtx = () =>\n Object.keys(ctx).forEach(key => {\n ctx[key] = null;\n });\n","export class SSRNode {\n type: SSRNodeType;\n // 链表\n parent?: SSRNode | null = null;\n firstChild: SSRNode | null = null;\n lastChild: SSRNode | null = null; // O(1) 尾插\n nextSibling: SSRNode | null = null;\n prevSibling: SSRNode | null = null;\n closed: boolean = false;\n startClosed: boolean = false;\n // innerHTML 缓存\n _innerHtml: string | null = null;\n}\n\nexport enum SSRNodeType {\n Element,\n Text,\n Anchor,\n Root\n}\n\nexport class Element extends SSRNode {\n type = SSRNodeType.Element;\n textContent: string | null = null;\n\n attrs: Record<string, string> = {};\n constructor(\n /** 标签名 */\n public value: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\n\nexport class Text extends SSRNode {\n type = SSRNodeType.Text;\n constructor(\n /** 文本内容 */\n public textContent: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\n\nexport class Anchor extends SSRNode {\n type = SSRNodeType.Anchor;\n constructor(\n /** 注释内容 */\n public value: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\nexport class Root extends SSRNode {\n type = SSRNodeType.Root;\n constructor(\n /** 输出 HTML */\n public value: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\n\nexport type SSRCtx = {\n /** 根节点 */\n root: Root;\n /** 当前节点 */\n current: SSRNode;\n};\n","import { customRender, Store, LogicNode } from 'bobe';\nimport { cleanCtx, ctx } from './global';\nimport { Root, Element, Text, Anchor, SSRNode, SSRNodeType } from './type';\n\nconst VOID_TAGS = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr'\n]);\n\nconst BOOLEAN_ATTRS = new Set([\n 'disabled',\n 'readonly',\n 'checked',\n 'selected',\n 'hidden',\n 'multiple',\n 'required',\n 'autofocus',\n 'autoplay',\n 'controls',\n 'loop',\n 'muted',\n 'defer',\n 'async',\n 'reversed',\n 'open',\n 'itemscope',\n 'ismap',\n 'nohref',\n 'noshade',\n 'nowrap',\n 'compact',\n 'default'\n]);\n\nconst ATTR_RE = /[&\"<>]/g;\nconst TEXT_RE = /[&<>]/g;\nconst ATTR_MAP: Record<string, string> = {\n '&': '&amp;',\n '\"': '&quot;',\n '<': '&lt;',\n '>': '&gt;'\n};\nconst TEXT_MAP: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;'\n};\n\nconst escapeAttr = (str: string) => {\n const s = String(str);\n return ATTR_RE.test(s) ? s.replace(ATTR_RE, m => ATTR_MAP[m]) : s;\n};\n\nconst escapeText = (str: string) => {\n const s = String(str);\n return TEXT_RE.test(s) ? s.replace(TEXT_RE, m => TEXT_MAP[m]) : s;\n};\n\nconst createNode = (name: string) => {\n if (name === 'text') {\n return new Text('');\n }\n ctx.root.value += `<${name}`;\n return new Element(name);\n};\n\nconst setProp = (node: Text | Element, key: string, value: any) => {\n if (node.startClosed) return;\n if (key.startsWith('on') || key === 'ref') return;\n\n // 0. text\n if (key === 'text') {\n if (value == null) return;\n node.textContent = value;\n return;\n }\n\n // 1. html\n if (key === 'html') {\n if (value == null) return;\n node._innerHtml = String(value);\n return;\n }\n\n // 2. class — 对齐 Browser:支持对象/字符串/null\n if (key === 'class') {\n if (value == null) return;\n let classStr: string;\n if (typeof value === 'object' && !Array.isArray(value)) {\n classStr = Object.entries(value as Record<string, any>)\n .filter(([, v]) => !!v)\n .map(([k]) => k)\n .join(' ');\n } else {\n classStr = typeof value === 'boolean' ? (value ? 'true' : '') : String(value);\n }\n if (classStr) ctx.root.value += ` class=\"${escapeAttr(classStr)}\"`;\n return;\n }\n\n // 3. style — 对齐 Browser\n if (key === 'style') {\n if (value == null) return;\n ctx.root.value += ` style=\"${escapeAttr(String(value))}\"`;\n return;\n }\n\n // 4. 布尔属性\n if (BOOLEAN_ATTRS.has(key)) {\n if (value !== false && value !== null && value !== undefined) {\n ctx.root.value += ` ${key}`;\n }\n return;\n }\n\n // 5. data-* / aria-* — 对齐 Browser:null 时不输出\n if (key.startsWith('data-') || key.startsWith('aria-')) {\n if (value == null) return;\n ctx.root.value += ` ${key}=\"${escapeAttr(value)}\"`;\n return;\n }\n\n // 6. 其余属性 — 对齐 Browser:null 时不输出\n if (value == null) return;\n ctx.root.value += ` ${key}=\"${escapeAttr(value)}\"`;\n};\n\nconst appendInnerContent = (node: Element) => {\n if (node._innerHtml != null) {\n ctx.root.value += node._innerHtml;\n return true;\n }\n if (node.textContent != null) {\n ctx.root.value += escapeText(node.textContent);\n return true;\n }\n return false;\n};\n\nconst beforeIndent = (node: Text | Element): boolean => {\n if (node instanceof Text) return true;\n\n const hasText = node.textContent != null;\n const hasHtml = node._innerHtml != null;\n\n // 不能包含内容的元素\n if (VOID_TAGS.has(node.value)) {\n ctx.root.value += `/>`;\n console.warn(`<${node.value}> can't have children`);\n node.startClosed = true;\n node.closed = true;\n return false;\n }\n\n if (hasText || hasHtml) {\n console.warn(`<${node.value}> has ${hasHtml ? 'html' : 'text'} content and child elements — children ignored`);\n ctx.root.value += `>`;\n // 容器元素有 text/html 内容且检测到子节点冲突,立即闭合;与 leaveNode 叶元素路径互斥\n appendInnerContent(node);\n ctx.root.value += `</${node.value}>`;\n node.startClosed = true;\n node.closed = true;\n return false;\n }\n\n ctx.root.value += `>`;\n node.startClosed = true;\n return true;\n};\n\nconst leaveLogicNode = (node: LogicNode) => {\n const realAfter = node.realAfter as Anchor;\n ctx.root.value += `<!--${realAfter.value}-->`;\n};\nconst leaveNode = (node: Text | Element, isDedent: boolean) => {\n /**\n * indent 提前 closed 就退出,这两种都是有缩进的\n * 1. 元素属于 VOID_TAGS\n * 2. 元素 text/html 属性与 children 冲突,采用 text/html\n */\n if (node.closed) return;\n if (node instanceof Text) {\n ctx.root.value += escapeText(node.textContent);\n } else {\n // 如果现在是 \"<div>\" 状态,添加 />\n if (node.startClosed) {\n // 什么都不做,正常永远都不会进入,因为 beforeIndent 会直接加 /> 设置 closed = true\n if (VOID_TAGS.has(node.value)) {\n } else {\n ctx.root.value += `</${node.value}>`;\n }\n }\n // 无 startClosed, 叶子节点\n else {\n // 直接自闭合\n if (VOID_TAGS.has(node.value)) {\n ctx.root.value += ` />`;\n }\n // 先加入 '>' 再看有内容加内容,最后反 Tag 闭合\n else {\n ctx.root.value += `>`;\n // 叶元素,无子节点;与 beforeIndent 中的 appendInnerContent 互斥\n appendInnerContent(node);\n ctx.root.value += `</${node.value}>`;\n }\n }\n }\n};\n\nconst insertAfter = (parent: SSRNode, node: SSRNode, prev: SSRNode | null) => {\n const next = prev ? prev.nextSibling : parent.firstChild;\n node.nextSibling = next;\n node.prevSibling = prev;\n\n if (prev) {\n prev.nextSibling = node;\n } else {\n parent.firstChild = node;\n }\n if (next) {\n next.prevSibling = node;\n } else {\n parent.lastChild = node;\n }\n node.parent = parent;\n};\n\nconst createAnchor = (name: string, isBefore?: boolean) => {\n if (isBefore) {\n ctx.root.value += `<!--${name}-->`;\n }\n return new Anchor(name);\n};\n\nconst remove = (node: SSRNode) => {\n const { parent, prevSibling, nextSibling } = node;\n if (prevSibling) {\n prevSibling.nextSibling = nextSibling;\n }\n if (nextSibling) {\n nextSibling.prevSibling = prevSibling;\n }\n if (parent) {\n if (parent.firstChild === node) {\n parent.firstChild = nextSibling;\n }\n if (parent.lastChild === node) {\n parent.lastChild = prevSibling;\n }\n }\n};\n\nconst firstChild = (node: SSRNode) => node.firstChild;\n\nconst nextSib = (node: SSRNode) => node.nextSibling;\n\nexport const renderHtmlStr = (ComponentClass: typeof Store) => {\n cleanCtx();\n const root = new Root('');\n ctx.root = ctx.current = root;\n const render = customRender({\n createNode,\n setProp,\n insertAfter,\n createAnchor,\n remove,\n firstChild,\n nextSib,\n beforeIndent,\n leaveNode,\n leaveLogicNode,\n noopEffect: true\n });\n render(ComponentClass, root);\n return {\n html: ctx.root.value\n };\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\nclass TreeCursor {\n private parent: Node;\n private claimed = new WeakSet<Node>();\n\n constructor(container: Node) {\n this.parent = container;\n }\n\n enterChildren(node: Node) {\n this.parent = node;\n }\n\n leaveToParent(node: Node) {\n if (node === this.parent && this.parent.parentNode) {\n this.parent = this.parent.parentNode;\n }\n }\n\n private findUnclaimed(predicate: (node: Node) => boolean): Node | null {\n let node = this.parent.firstChild;\n while (node) {\n if (!this.claimed.has(node) && predicate(node)) {\n this.claimed.add(node);\n return node;\n }\n node = node.nextSibling;\n }\n return null;\n }\n\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 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 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 container = rootEl.parentNode!;\n const cursor = new TreeCursor(container);\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 === 'text' || 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 const leaveLogicNode = (node: Node) => {\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 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, container);\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","className","Array","isArray","names","Object","entries","filter","v","map","k","join","setAttribute","classList","toggle","str","String","style","cssText","innerHTML","undefined","removeAttribute","tagName","insertAfter","parent","prev","insertBefore","firstChild","nextSibling","createAnchor","createComment","remove","nextSib","beforeIndent","tag","toLowerCase","hasText","console","warn","leaveNode","leaveLogicNode","render","customRender","ctx","root","current","cleanCtx","keys","forEach","SSRNode","lastChild","prevSibling","closed","startClosed","_innerHtml","SSRNodeType","Element","type","attrs","constructor","Text","Anchor","Root","VOID_TAGS","ATTR_RE","TEXT_RE","ATTR_MAP","TEXT_MAP","escapeAttr","s","test","replace","m","escapeText","classStr","appendInnerContent","hasHtml","realAfter","isDedent","next","isBefore","renderHtmlStr","ComponentClass","noopEffect","html","TreeCursor","claimed","WeakSet","container","enterChildren","leaveToParent","parentNode","findUnclaimed","predicate","add","tryClaimElement","nodeType","tryClaimComment","data","tryClaimText","trim","hydrate","rootEl","cursor","isFirstRender","hydrateSetProp","browserCreateNode","expectedNext","onBeforeFlush"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.js","sources":["../src/render.ts","../src/global.ts","../src/type.ts","../src/render-html-str.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. text\n if (key === 'text') {\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 === '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 { SSRCtx } from './type';\nexport let ctx: SSRCtx = {\n root: null,\n current: null\n};\n\nexport const cleanCtx = () =>\n Object.keys(ctx).forEach(key => {\n ctx[key] = null;\n });\n","export class SSRNode {\n type: SSRNodeType;\n // 链表\n parent?: SSRNode | null = null;\n firstChild: SSRNode | null = null;\n lastChild: SSRNode | null = null; // O(1) 尾插\n nextSibling: SSRNode | null = null;\n prevSibling: SSRNode | null = null;\n closed: boolean = false;\n startClosed: boolean = false;\n // innerHTML 缓存\n _innerHtml: string | null = null;\n}\n\nexport enum SSRNodeType {\n Element,\n Text,\n Anchor,\n Root\n}\n\nexport class Element extends SSRNode {\n type = SSRNodeType.Element;\n textContent: string | null = null;\n\n attrs: Record<string, string> = {};\n constructor(\n /** 标签名 */\n public value: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\n\nexport class Text extends SSRNode {\n type = SSRNodeType.Text;\n constructor(\n /** 文本内容 */\n public textContent: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\n\nexport class Anchor extends SSRNode {\n type = SSRNodeType.Anchor;\n constructor(\n /** 注释内容 */\n public value: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\nexport class Root extends SSRNode {\n type = SSRNodeType.Root;\n constructor(\n /** 输出 HTML */\n public value: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\n\nexport type SSRCtx = {\n /** 根节点 */\n root: Root;\n /** 当前节点 */\n current: SSRNode;\n};\n","import { customRender, Store, LogicNode } from 'bobe';\nimport { cleanCtx, ctx } from './global';\nimport { Root, Element, Text, Anchor, SSRNode, SSRNodeType } from './type';\n\nconst VOID_TAGS = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr'\n]);\n\nconst BOOLEAN_ATTRS = new Set([\n 'disabled',\n 'readonly',\n 'checked',\n 'selected',\n 'hidden',\n 'multiple',\n 'required',\n 'autofocus',\n 'autoplay',\n 'controls',\n 'loop',\n 'muted',\n 'defer',\n 'async',\n 'reversed',\n 'open',\n 'itemscope',\n 'ismap',\n 'nohref',\n 'noshade',\n 'nowrap',\n 'compact',\n 'default'\n]);\n\nconst ATTR_RE = /[&\"<>]/g;\nconst TEXT_RE = /[&<>]/g;\nconst ATTR_MAP: Record<string, string> = {\n '&': '&amp;',\n '\"': '&quot;',\n '<': '&lt;',\n '>': '&gt;'\n};\nconst TEXT_MAP: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;'\n};\n\nconst escapeAttr = (str: string) => {\n const s = String(str);\n return ATTR_RE.test(s) ? s.replace(ATTR_RE, m => ATTR_MAP[m]) : s;\n};\n\nconst escapeText = (str: string) => {\n const s = String(str);\n return TEXT_RE.test(s) ? s.replace(TEXT_RE, m => TEXT_MAP[m]) : s;\n};\n\nconst createNode = (name: string) => {\n if (name === 'text') {\n return new Text('');\n }\n ctx.root.value += `<${name}`;\n return new Element(name);\n};\n\nconst setProp = (node: Text | Element, key: string, value: any) => {\n if (node.startClosed) return;\n if (key.startsWith('on') || key === 'ref') return;\n\n // 0. text\n if (key === 'text') {\n if (value == null) return;\n node.textContent = value;\n return;\n }\n\n // 1. html\n if (key === 'html') {\n if (value == null) return;\n node._innerHtml = String(value);\n return;\n }\n\n // 2. class — 对齐 Browser:支持对象/字符串/null\n if (key === 'class') {\n if (value == null) return;\n let classStr: string;\n if (typeof value === 'object' && !Array.isArray(value)) {\n classStr = Object.entries(value as Record<string, any>)\n .filter(([, v]) => !!v)\n .map(([k]) => k)\n .join(' ');\n } else {\n classStr = typeof value === 'boolean' ? (value ? 'true' : '') : String(value);\n }\n if (classStr) ctx.root.value += ` class=\"${escapeAttr(classStr)}\"`;\n return;\n }\n\n // 3. style — 对齐 Browser\n if (key === 'style') {\n if (value == null) return;\n ctx.root.value += ` style=\"${escapeAttr(String(value))}\"`;\n return;\n }\n\n // 4. 布尔属性\n if (BOOLEAN_ATTRS.has(key)) {\n if (value !== false && value !== null && value !== undefined) {\n ctx.root.value += ` ${key}`;\n }\n return;\n }\n\n // 5. data-* / aria-* — 对齐 Browser:null 时不输出\n if (key.startsWith('data-') || key.startsWith('aria-')) {\n if (value == null) return;\n ctx.root.value += ` ${key}=\"${escapeAttr(value)}\"`;\n return;\n }\n\n // 6. 其余属性 — 对齐 Browser:null 时不输出\n if (value == null) return;\n ctx.root.value += ` ${key}=\"${escapeAttr(value)}\"`;\n};\n\nconst appendInnerContent = (node: Element) => {\n if (node._innerHtml != null) {\n ctx.root.value += node._innerHtml;\n return true;\n }\n if (node.textContent != null) {\n ctx.root.value += escapeText(node.textContent);\n return true;\n }\n return false;\n};\n\nconst beforeIndent = (node: Text | Element): boolean => {\n if (node instanceof Text) return true;\n\n const hasText = node.textContent != null;\n const hasHtml = node._innerHtml != null;\n\n // 不能包含内容的元素\n if (VOID_TAGS.has(node.value)) {\n ctx.root.value += `/>`;\n console.warn(`<${node.value}> can't have children`);\n node.startClosed = true;\n node.closed = true;\n return false;\n }\n\n if (hasText || hasHtml) {\n console.warn(`<${node.value}> has ${hasHtml ? 'html' : 'text'} content and child elements — children ignored`);\n ctx.root.value += `>`;\n // 容器元素有 text/html 内容且检测到子节点冲突,立即闭合;与 leaveNode 叶元素路径互斥\n appendInnerContent(node);\n ctx.root.value += `</${node.value}>`;\n node.startClosed = true;\n node.closed = true;\n return false;\n }\n\n ctx.root.value += `>`;\n node.startClosed = true;\n return true;\n};\n\nconst leaveLogicNode = (node: LogicNode) => {\n const realAfter = node.realAfter as Anchor;\n ctx.root.value += `<!--${realAfter.value}-->`;\n};\nconst leaveNode = (node: Text | Element, isDedent: boolean) => {\n /**\n * indent 提前 closed 就退出,这两种都是有缩进的\n * 1. 元素属于 VOID_TAGS\n * 2. 元素 text/html 属性与 children 冲突,采用 text/html\n */\n if (node.closed) return;\n if (node instanceof Text) {\n ctx.root.value += escapeText(node.textContent);\n } else {\n // 如果现在是 \"<div>\" 状态,添加 />\n if (node.startClosed) {\n // 什么都不做,正常永远都不会进入,因为 beforeIndent 会直接加 /> 设置 closed = true\n if (VOID_TAGS.has(node.value)) {\n } else {\n ctx.root.value += `</${node.value}>`;\n }\n }\n // 无 startClosed, 叶子节点\n else {\n // 直接自闭合\n if (VOID_TAGS.has(node.value)) {\n ctx.root.value += ` />`;\n }\n // 先加入 '>' 再看有内容加内容,最后反 Tag 闭合\n else {\n ctx.root.value += `>`;\n // 叶元素,无子节点;与 beforeIndent 中的 appendInnerContent 互斥\n appendInnerContent(node);\n ctx.root.value += `</${node.value}>`;\n }\n }\n }\n};\n\nconst insertAfter = (parent: SSRNode, node: SSRNode, prev: SSRNode | null) => {\n const next = prev ? prev.nextSibling : parent.firstChild;\n node.nextSibling = next;\n node.prevSibling = prev;\n\n if (prev) {\n prev.nextSibling = node;\n } else {\n parent.firstChild = node;\n }\n if (next) {\n next.prevSibling = node;\n } else {\n parent.lastChild = node;\n }\n node.parent = parent;\n};\n\nconst createAnchor = (name: string, isBefore?: boolean) => {\n if (isBefore) {\n ctx.root.value += `<!--${name}-->`;\n }\n return new Anchor(name);\n};\n\nconst remove = (node: SSRNode) => {\n const { parent, prevSibling, nextSibling } = node;\n if (prevSibling) {\n prevSibling.nextSibling = nextSibling;\n }\n if (nextSibling) {\n nextSibling.prevSibling = prevSibling;\n }\n if (parent) {\n if (parent.firstChild === node) {\n parent.firstChild = nextSibling;\n }\n if (parent.lastChild === node) {\n parent.lastChild = prevSibling;\n }\n }\n};\n\nconst firstChild = (node: SSRNode) => node.firstChild;\n\nconst nextSib = (node: SSRNode) => node.nextSibling;\n\nexport const renderHtmlStr = (ComponentClass: typeof Store) => {\n cleanCtx();\n const root = new Root('');\n ctx.root = ctx.current = root;\n const render = customRender({\n createNode,\n setProp,\n insertAfter,\n createAnchor,\n remove,\n firstChild,\n nextSib,\n beforeIndent,\n leaveNode,\n leaveLogicNode,\n noopEffect: true\n });\n render(ComponentClass, root);\n return {\n html: ctx.root.value\n };\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 /** 已认领节点集合,避免同一次遍历中重复认领 */\n private claimed = new WeakSet<Node>();\n\n constructor(container: Node) {\n this.parent = container;\n }\n\n /** 进入子节点:后续 findUnclaimed 搜 node 的直接子级 */\n enterChildren(node: Node) {\n this.parent = node;\n }\n\n /** 退出当前节点,回到父级 */\n leaveToParent(node: Node) {\n if (node === this.parent && this.parent.parentNode) {\n this.parent = this.parent.parentNode;\n }\n }\n\n /** 在 this.parent 的 firstChild 链上查找第一个满足条件且未被认领的节点 */\n private findUnclaimed(predicate: (node: Node) => boolean): Node | null {\n let node = this.parent.firstChild;\n while (node) {\n if (!this.claimed.has(node) && predicate(node)) {\n this.claimed.add(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 === 'text' || 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 const leaveLogicNode = (node: Node) => {\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 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","className","Array","isArray","names","Object","entries","filter","v","map","k","join","setAttribute","classList","toggle","str","String","style","cssText","innerHTML","undefined","removeAttribute","tagName","insertAfter","parent","prev","insertBefore","firstChild","nextSibling","createAnchor","createComment","remove","nextSib","beforeIndent","tag","toLowerCase","hasText","console","warn","leaveNode","leaveLogicNode","render","customRender","ctx","root","current","cleanCtx","keys","forEach","SSRNode","lastChild","prevSibling","closed","startClosed","_innerHtml","SSRNodeType","Element","type","attrs","constructor","Text","Anchor","Root","VOID_TAGS","ATTR_RE","TEXT_RE","ATTR_MAP","TEXT_MAP","escapeAttr","s","test","replace","m","escapeText","classStr","appendInnerContent","hasHtml","realAfter","isDedent","next","isBefore","renderHtmlStr","ComponentClass","noopEffect","html","TreeCursor","claimed","WeakSet","container","enterChildren","leaveToParent","parentNode","findUnclaimed","predicate","add","tryClaimElement","nodeType","tryClaimComment","data","tryClaimText","trim","hydrate","rootEl","cursor","isFirstRender","hydrateSetProp","browserCreateNode","expectedNext","onBeforeFlush"],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ 'use strict';
2
+
3
+ var marked = require('marked');
4
+
5
+ function esc(s) {
6
+ return s.replace(/\\/g, '\\\\').replace(/`/g, '\\`').replace(/\$/g, '\\$');
7
+ }
8
+ function gen(html, headers) {
9
+ const code = [`import { bobe } from 'bobe';`, `const mdHtml = \`${esc(html)}\`;`, `export default bobe\``, ` div class="markdown" style="display: flex;"`, ` main class="markdown-main" style="overflow-y: auto;" html=\${mdHtml}`, ` if showAside`, ` div class="markdown-aside" style="display: flex; flex-direction: column; overflow-y: auto;"`, ...headers.map(({
10
+ depth,
11
+ id,
12
+ text
13
+ }) => {
14
+ return ` a href="#${id}" text="${text}" class="markdown-aside-item markdown-aside-depth-${depth}"`;
15
+ }), `\`;`].join('\n');
16
+ return code;
17
+ }
18
+ function markdownPlugin(opt = {}) {
19
+ let headers = [];
20
+ return {
21
+ name: 'bobe-markdown',
22
+ enforce: 'pre',
23
+ configResolved() {
24
+ marked.marked.use({
25
+ gfm: true,
26
+ renderer: {
27
+ heading({
28
+ tokens,
29
+ depth
30
+ }) {
31
+ const text = this.parser.parseInline(tokens);
32
+ const id = text.toLowerCase().replace(/[^\w\u4e00-\u9fff]+/g, '-');
33
+ if (depth <= opt.asideDeep || 3) {
34
+ headers.push({
35
+ depth,
36
+ id,
37
+ text
38
+ });
39
+ }
40
+ return `<h${depth} id="${id}">${text}</h${depth}>`;
41
+ }
42
+ }
43
+ });
44
+ if (opt.marked) marked.marked.use(opt.marked);
45
+ },
46
+ transform(code, id) {
47
+ if (!id.match(/\.mdx?$/)) return;
48
+ headers = [];
49
+ try {
50
+ const html = marked.marked.parse(code);
51
+ return {
52
+ code: gen(html, headers),
53
+ moduleSideEffects: false
54
+ };
55
+ } catch (e) {
56
+ this.error(`[bobe-markdown] 解析失败: ${id}\n${e.message}`);
57
+ }
58
+ }
59
+ };
60
+ }
61
+
62
+ module.exports = markdownPlugin;
63
+ //# sourceMappingURL=markdown.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.cjs.js","sources":["../src/plugins/markdown/index.ts"],"sourcesContent":["import type { Plugin } from 'vite';\nimport type { MarkedExtension } from 'marked';\nimport { marked } from 'marked';\n\nexport interface MarkdownPluginOptions {\n /** 传递给 marked.use() 的扩展配置 */\n marked?: MarkedExtension;\n /** 侧边栏的深度,默认为 3,表示提取 h1 - h3 到侧边栏做导航 */\n asideDeep?: number;\n}\n\n/** 对要嵌入模板字面量的字符串进行转义(` $ \\) */\nfunction esc(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/`/g, '\\\\`').replace(/\\$/g, '\\\\$');\n}\n\n/** 将 HTML 字符串编译为 bobe 组件模块源码 */\nfunction gen(html: string, headers: HeadItem[]): string {\n const code = [\n `import { bobe } from 'bobe';`,\n `const mdHtml = \\`${esc(html)}\\`;`,\n `export default bobe\\``,\n ` div class=\"markdown\" style=\"display: flex;\"`,\n ` main class=\"markdown-main\" style=\"overflow-y: auto;\" html=\\${mdHtml}`,\n ` if showAside`,\n ` div class=\"markdown-aside\" style=\"display: flex; flex-direction: column; overflow-y: auto;\"`,\n ...headers.map(({ depth, id, text }) => {\n return ` a href=\"#${id}\" text=\"${text}\" class=\"markdown-aside-item markdown-aside-depth-${depth}\"`;\n }),\n `\\`;`\n ].join('\\n');\n return code;\n}\n\n/**\n * bobe-markdown Vite 插件。\n *\n * 将 .md / .mdx 文件编译为 bobe 组件:\n * import Readme from './README.md';\n */\n\nexport type HeadItem = {\n depth: number;\n id: string;\n text: string;\n};\nexport default function markdownPlugin(opt: MarkdownPluginOptions = {}): Plugin {\n let headers: HeadItem[] = [];\n return {\n name: 'bobe-markdown',\n enforce: 'pre',\n\n configResolved() {\n marked.use({\n gfm: true, // GitHub Flavored Markdown\n renderer: {\n heading({ tokens, depth }) {\n const text = this.parser.parseInline(tokens);\n const id = text.toLowerCase().replace(/[^\\w\\u4e00-\\u9fff]+/g, '-');\n if(depth <= opt.asideDeep || 3) {\n headers.push({ depth, id, text });\n }\n return `<h${depth} id=\"${id}\">${text}</h${depth}>`;\n }\n }\n });\n if (opt.marked) marked.use(opt.marked);\n },\n\n transform(code, id) {\n if (!id.match(/\\.mdx?$/)) return;\n headers = [];\n try {\n const html = marked.parse(code) as string;\n return { code: gen(html, headers), moduleSideEffects: false };\n } catch (e: any) {\n this.error(`[bobe-markdown] 解析失败: ${id}\\n${e.message}`);\n }\n }\n };\n}\n"],"names":["esc","s","replace","gen","html","headers","code","map","depth","id","text","join","markdownPlugin","opt","name","enforce","configResolved","marked","use","gfm","renderer","heading","tokens","parser","parseInline","toLowerCase","asideDeep","push","transform","match","parse","moduleSideEffects","e","error","message"],"mappings":";;;;AAYA,SAASA,GAAGA,CAACC,CAAS,EAAU;EAC9B,OAAOA,CAAC,CAACC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAACA,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAACA,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;AAC5E;AAGA,SAASC,GAAGA,CAACC,IAAY,EAAEC,OAAmB,EAAU;EACtD,MAAMC,IAAI,GAAG,CACX,CAAA,4BAAA,CAA8B,EAC9B,CAAA,iBAAA,EAAoBN,GAAG,CAACI,IAAI,CAAC,CAAA,GAAA,CAAK,EAClC,CAAA,qBAAA,CAAuB,EACvB,CAAA,6CAAA,CAA+C,EAC/C,CAAA,wEAAA,CAA0E,EAC1E,CAAA,gBAAA,CAAkB,EAClB,CAAA,iGAAA,CAAmG,EACnG,GAAGC,OAAO,CAACE,GAAG,CAAC,CAAC;IAAEC,KAAK;IAAEC,EAAE;AAAEC,IAAAA;AAAK,GAAC,KAAK;AACtC,IAAA,OAAO,oBAAoBD,EAAE,CAAA,QAAA,EAAWC,IAAI,CAAA,kDAAA,EAAqDF,KAAK,CAAA,CAAA,CAAG;EAC3G,CAAC,CAAC,EACF,CAAA,GAAA,CAAK,CACN,CAACG,IAAI,CAAC,IAAI,CAAC;AACZ,EAAA,OAAOL,IAAI;AACb;AAce,SAASM,cAAcA,CAACC,GAA0B,GAAG,EAAE,EAAU;EAC9E,IAAIR,OAAmB,GAAG,EAAE;EAC5B,OAAO;AACLS,IAAAA,IAAI,EAAE,eAAe;AACrBC,IAAAA,OAAO,EAAE,KAAK;AAEdC,IAAAA,cAAcA,GAAG;MACfC,aAAM,CAACC,GAAG,CAAC;AACTC,QAAAA,GAAG,EAAE,IAAI;AACTC,QAAAA,QAAQ,EAAE;AACRC,UAAAA,OAAOA,CAAC;YAAEC,MAAM;AAAEd,YAAAA;AAAM,WAAC,EAAE;YACzB,MAAME,IAAI,GAAG,IAAI,CAACa,MAAM,CAACC,WAAW,CAACF,MAAM,CAAC;AAC5C,YAAA,MAAMb,EAAE,GAAGC,IAAI,CAACe,WAAW,EAAE,CAACvB,OAAO,CAAC,sBAAsB,EAAE,GAAG,CAAC;AAClE,YAAA,IAAGM,KAAK,IAAIK,GAAG,CAACa,SAAS,IAAI,CAAC,EAAE;cAC9BrB,OAAO,CAACsB,IAAI,CAAC;gBAAEnB,KAAK;gBAAEC,EAAE;AAAEC,gBAAAA;AAAK,eAAC,CAAC;AACnC,YAAA;YACA,OAAO,CAAA,EAAA,EAAKF,KAAK,CAAA,KAAA,EAAQC,EAAE,KAAKC,IAAI,CAAA,GAAA,EAAMF,KAAK,CAAA,CAAA,CAAG;AACpD,UAAA;AACF;AACF,OAAC,CAAC;MACF,IAAIK,GAAG,CAACI,MAAM,EAAEA,aAAM,CAACC,GAAG,CAACL,GAAG,CAACI,MAAM,CAAC;IACxC,CAAC;AAEDW,IAAAA,SAASA,CAACtB,IAAI,EAAEG,EAAE,EAAE;AAClB,MAAA,IAAI,CAACA,EAAE,CAACoB,KAAK,CAAC,SAAS,CAAC,EAAE;AAC1BxB,MAAAA,OAAO,GAAG,EAAE;MACZ,IAAI;AACF,QAAA,MAAMD,IAAI,GAAGa,aAAM,CAACa,KAAK,CAACxB,IAAI,CAAW;QACzC,OAAO;AAAEA,UAAAA,IAAI,EAAEH,GAAG,CAACC,IAAI,EAAEC,OAAO,CAAC;AAAE0B,UAAAA,iBAAiB,EAAE;SAAO;MAC/D,CAAC,CAAC,OAAOC,CAAM,EAAE;QACf,IAAI,CAACC,KAAK,CAAC,CAAA,sBAAA,EAAyBxB,EAAE,KAAKuB,CAAC,CAACE,OAAO,CAAA,CAAE,CAAC;AACzD,MAAA;AACF,IAAA;GACD;AACH;;;;"}
@@ -0,0 +1,24 @@
1
+ import { Plugin } from 'vite';
2
+ import { MarkedExtension } from 'marked';
3
+
4
+ interface MarkdownPluginOptions {
5
+ /** 传递给 marked.use() 的扩展配置 */
6
+ marked?: MarkedExtension;
7
+ /** 侧边栏的深度,默认为 3,表示提取 h1 - h3 到侧边栏做导航 */
8
+ asideDeep?: number;
9
+ }
10
+ /**
11
+ * bobe-markdown Vite 插件。
12
+ *
13
+ * 将 .md / .mdx 文件编译为 bobe 组件:
14
+ * import Readme from './README.md';
15
+ */
16
+ type HeadItem = {
17
+ depth: number;
18
+ id: string;
19
+ text: string;
20
+ };
21
+ declare function markdownPlugin(opt?: MarkdownPluginOptions): Plugin;
22
+
23
+ export { markdownPlugin as default };
24
+ export type { HeadItem, MarkdownPluginOptions };
@@ -0,0 +1,61 @@
1
+ import { marked } from 'marked';
2
+
3
+ function esc(s) {
4
+ return s.replace(/\\/g, '\\\\').replace(/`/g, '\\`').replace(/\$/g, '\\$');
5
+ }
6
+ function gen(html, headers) {
7
+ const code = [`import { bobe } from 'bobe';`, `const mdHtml = \`${esc(html)}\`;`, `export default bobe\``, ` div class="markdown" style="display: flex;"`, ` main class="markdown-main" style="overflow-y: auto;" html=\${mdHtml}`, ` if showAside`, ` div class="markdown-aside" style="display: flex; flex-direction: column; overflow-y: auto;"`, ...headers.map(({
8
+ depth,
9
+ id,
10
+ text
11
+ }) => {
12
+ return ` a href="#${id}" text="${text}" class="markdown-aside-item markdown-aside-depth-${depth}"`;
13
+ }), `\`;`].join('\n');
14
+ return code;
15
+ }
16
+ function markdownPlugin(opt = {}) {
17
+ let headers = [];
18
+ return {
19
+ name: 'bobe-markdown',
20
+ enforce: 'pre',
21
+ configResolved() {
22
+ marked.use({
23
+ gfm: true,
24
+ renderer: {
25
+ heading({
26
+ tokens,
27
+ depth
28
+ }) {
29
+ const text = this.parser.parseInline(tokens);
30
+ const id = text.toLowerCase().replace(/[^\w\u4e00-\u9fff]+/g, '-');
31
+ if (depth <= opt.asideDeep || 3) {
32
+ headers.push({
33
+ depth,
34
+ id,
35
+ text
36
+ });
37
+ }
38
+ return `<h${depth} id="${id}">${text}</h${depth}>`;
39
+ }
40
+ }
41
+ });
42
+ if (opt.marked) marked.use(opt.marked);
43
+ },
44
+ transform(code, id) {
45
+ if (!id.match(/\.mdx?$/)) return;
46
+ headers = [];
47
+ try {
48
+ const html = marked.parse(code);
49
+ return {
50
+ code: gen(html, headers),
51
+ moduleSideEffects: false
52
+ };
53
+ } catch (e) {
54
+ this.error(`[bobe-markdown] 解析失败: ${id}\n${e.message}`);
55
+ }
56
+ }
57
+ };
58
+ }
59
+
60
+ export { markdownPlugin as default };
61
+ //# sourceMappingURL=markdown.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.esm.js","sources":["../src/plugins/markdown/index.ts"],"sourcesContent":["import type { Plugin } from 'vite';\nimport type { MarkedExtension } from 'marked';\nimport { marked } from 'marked';\n\nexport interface MarkdownPluginOptions {\n /** 传递给 marked.use() 的扩展配置 */\n marked?: MarkedExtension;\n /** 侧边栏的深度,默认为 3,表示提取 h1 - h3 到侧边栏做导航 */\n asideDeep?: number;\n}\n\n/** 对要嵌入模板字面量的字符串进行转义(` $ \\) */\nfunction esc(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/`/g, '\\\\`').replace(/\\$/g, '\\\\$');\n}\n\n/** 将 HTML 字符串编译为 bobe 组件模块源码 */\nfunction gen(html: string, headers: HeadItem[]): string {\n const code = [\n `import { bobe } from 'bobe';`,\n `const mdHtml = \\`${esc(html)}\\`;`,\n `export default bobe\\``,\n ` div class=\"markdown\" style=\"display: flex;\"`,\n ` main class=\"markdown-main\" style=\"overflow-y: auto;\" html=\\${mdHtml}`,\n ` if showAside`,\n ` div class=\"markdown-aside\" style=\"display: flex; flex-direction: column; overflow-y: auto;\"`,\n ...headers.map(({ depth, id, text }) => {\n return ` a href=\"#${id}\" text=\"${text}\" class=\"markdown-aside-item markdown-aside-depth-${depth}\"`;\n }),\n `\\`;`\n ].join('\\n');\n return code;\n}\n\n/**\n * bobe-markdown Vite 插件。\n *\n * 将 .md / .mdx 文件编译为 bobe 组件:\n * import Readme from './README.md';\n */\n\nexport type HeadItem = {\n depth: number;\n id: string;\n text: string;\n};\nexport default function markdownPlugin(opt: MarkdownPluginOptions = {}): Plugin {\n let headers: HeadItem[] = [];\n return {\n name: 'bobe-markdown',\n enforce: 'pre',\n\n configResolved() {\n marked.use({\n gfm: true, // GitHub Flavored Markdown\n renderer: {\n heading({ tokens, depth }) {\n const text = this.parser.parseInline(tokens);\n const id = text.toLowerCase().replace(/[^\\w\\u4e00-\\u9fff]+/g, '-');\n if(depth <= opt.asideDeep || 3) {\n headers.push({ depth, id, text });\n }\n return `<h${depth} id=\"${id}\">${text}</h${depth}>`;\n }\n }\n });\n if (opt.marked) marked.use(opt.marked);\n },\n\n transform(code, id) {\n if (!id.match(/\\.mdx?$/)) return;\n headers = [];\n try {\n const html = marked.parse(code) as string;\n return { code: gen(html, headers), moduleSideEffects: false };\n } catch (e: any) {\n this.error(`[bobe-markdown] 解析失败: ${id}\\n${e.message}`);\n }\n }\n };\n}\n"],"names":["esc","s","replace","gen","html","headers","code","map","depth","id","text","join","markdownPlugin","opt","name","enforce","configResolved","marked","use","gfm","renderer","heading","tokens","parser","parseInline","toLowerCase","asideDeep","push","transform","match","parse","moduleSideEffects","e","error","message"],"mappings":";;AAYA,SAASA,GAAGA,CAACC,CAAS,EAAU;EAC9B,OAAOA,CAAC,CAACC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAACA,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAACA,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;AAC5E;AAGA,SAASC,GAAGA,CAACC,IAAY,EAAEC,OAAmB,EAAU;EACtD,MAAMC,IAAI,GAAG,CACX,CAAA,4BAAA,CAA8B,EAC9B,CAAA,iBAAA,EAAoBN,GAAG,CAACI,IAAI,CAAC,CAAA,GAAA,CAAK,EAClC,CAAA,qBAAA,CAAuB,EACvB,CAAA,6CAAA,CAA+C,EAC/C,CAAA,wEAAA,CAA0E,EAC1E,CAAA,gBAAA,CAAkB,EAClB,CAAA,iGAAA,CAAmG,EACnG,GAAGC,OAAO,CAACE,GAAG,CAAC,CAAC;IAAEC,KAAK;IAAEC,EAAE;AAAEC,IAAAA;AAAK,GAAC,KAAK;AACtC,IAAA,OAAO,oBAAoBD,EAAE,CAAA,QAAA,EAAWC,IAAI,CAAA,kDAAA,EAAqDF,KAAK,CAAA,CAAA,CAAG;EAC3G,CAAC,CAAC,EACF,CAAA,GAAA,CAAK,CACN,CAACG,IAAI,CAAC,IAAI,CAAC;AACZ,EAAA,OAAOL,IAAI;AACb;AAce,SAASM,cAAcA,CAACC,GAA0B,GAAG,EAAE,EAAU;EAC9E,IAAIR,OAAmB,GAAG,EAAE;EAC5B,OAAO;AACLS,IAAAA,IAAI,EAAE,eAAe;AACrBC,IAAAA,OAAO,EAAE,KAAK;AAEdC,IAAAA,cAAcA,GAAG;MACfC,MAAM,CAACC,GAAG,CAAC;AACTC,QAAAA,GAAG,EAAE,IAAI;AACTC,QAAAA,QAAQ,EAAE;AACRC,UAAAA,OAAOA,CAAC;YAAEC,MAAM;AAAEd,YAAAA;AAAM,WAAC,EAAE;YACzB,MAAME,IAAI,GAAG,IAAI,CAACa,MAAM,CAACC,WAAW,CAACF,MAAM,CAAC;AAC5C,YAAA,MAAMb,EAAE,GAAGC,IAAI,CAACe,WAAW,EAAE,CAACvB,OAAO,CAAC,sBAAsB,EAAE,GAAG,CAAC;AAClE,YAAA,IAAGM,KAAK,IAAIK,GAAG,CAACa,SAAS,IAAI,CAAC,EAAE;cAC9BrB,OAAO,CAACsB,IAAI,CAAC;gBAAEnB,KAAK;gBAAEC,EAAE;AAAEC,gBAAAA;AAAK,eAAC,CAAC;AACnC,YAAA;YACA,OAAO,CAAA,EAAA,EAAKF,KAAK,CAAA,KAAA,EAAQC,EAAE,KAAKC,IAAI,CAAA,GAAA,EAAMF,KAAK,CAAA,CAAA,CAAG;AACpD,UAAA;AACF;AACF,OAAC,CAAC;MACF,IAAIK,GAAG,CAACI,MAAM,EAAEA,MAAM,CAACC,GAAG,CAACL,GAAG,CAACI,MAAM,CAAC;IACxC,CAAC;AAEDW,IAAAA,SAASA,CAACtB,IAAI,EAAEG,EAAE,EAAE;AAClB,MAAA,IAAI,CAACA,EAAE,CAACoB,KAAK,CAAC,SAAS,CAAC,EAAE;AAC1BxB,MAAAA,OAAO,GAAG,EAAE;MACZ,IAAI;AACF,QAAA,MAAMD,IAAI,GAAGa,MAAM,CAACa,KAAK,CAACxB,IAAI,CAAW;QACzC,OAAO;AAAEA,UAAAA,IAAI,EAAEH,GAAG,CAACC,IAAI,EAAEC,OAAO,CAAC;AAAE0B,UAAAA,iBAAiB,EAAE;SAAO;MAC/D,CAAC,CAAC,OAAOC,CAAM,EAAE;QACf,IAAI,CAACC,KAAK,CAAC,CAAA,sBAAA,EAAyBxB,EAAE,KAAKuB,CAAC,CAACE,OAAO,CAAA,CAAE,CAAC;AACzD,MAAA;AACF,IAAA;GACD;AACH;;;;"}
package/package.json CHANGED
@@ -1,17 +1,30 @@
1
1
  {
2
2
  "name": "bobe-dom",
3
- "version": "0.0.59",
3
+ "version": "0.0.61",
4
4
  "main": "dist/bobe-dom.cjs.js",
5
5
  "module": "dist/bobe-dom.esm.js",
6
6
  "browser": "dist/bobe-dom.umd.js",
7
7
  "types": "dist/index.d.ts",
8
8
  "private": false,
9
9
  "dependencies": {
10
- "bobe": "0.0.59"
10
+ "marked": "^18.0.4",
11
+ "bobe": "0.0.61"
11
12
  },
12
13
  "devDependencies": {
13
14
  "vitest": "^4.1.7"
14
15
  },
16
+ "exports": {
17
+ ".": {
18
+ "types": "./dist/index.d.ts",
19
+ "import": "./dist/bobe-dom.esm.js",
20
+ "require": "./dist/bobe-dom.cjs.js"
21
+ },
22
+ "./plugin-markdown": {
23
+ "types": "./dist/markdown.d.ts",
24
+ "import": "./dist/markdown.esm.js",
25
+ "require": "./dist/markdown.cjs.js"
26
+ }
27
+ },
15
28
  "files": [
16
29
  "dist"
17
30
  ],