bobe-dom 0.0.61 → 0.0.63

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"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":";;;;;;AAEO,QAAMA,eAAa,GAAG,IAAIC,GAAG,CAAC,CACnC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EACvD,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAC3D,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EACrD,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,CAC1E;EAED,MAAMC,eAAe,GAAG,IAAID,GAAG,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;EAEhE,MAAME,MAAM,GAAG,4BAA4B;EAC3C,MAAMC,OAAO,GAAG,oCAAoC;EAEpD,MAAMC,QAAQ,GAAG,IAAIJ,GAAG,CAAC,CACvB,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,kBAAkB,EAAE,QAAQ,EAAE,UAAU,EAC3E,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,qBAAqB,EAC5E,aAAa,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,mBAAmB,EAC3E,gBAAgB,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAC5E,SAAS,EAAE,gBAAgB,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAChF,UAAU,EAAE,cAAc,EAAE,oBAAoB,EAAE,aAAa,EAAE,QAAQ,EACzE,cAAc,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EACjF,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAC/E,gBAAgB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EACvE,OAAO,EAAE,KAAK,EAAE,MAAM,CACvB,CAAC;EAEF,MAAMK,SAAS,GAAG,IAAIL,GAAG,CAAC,CACxB,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EACpE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAC7E,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAC9E,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAC5E,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAC1E,WAAW,EAAE,YAAY,EAAE,gBAAgB,CAC5C,CAAC;EAEF,MAAMM,IAAI,GAAIC,EAAW,IAAKA,EAAE,CAACC,YAAY,KAAKN,MAAM,IAAIK,EAAE,CAACC,YAAY,KAAKL,OAAO;AAIhF,QAAMM,YAAU,GAAIC,IAAY,IAAW;IAChD,IAAIA,IAAI,KAAK,MAAM,EAAE,OAAOC,QAAQ,CAACC,cAAc,CAAC,EAAE,CAAC;EACvD,EAAA,IAAIP,SAAS,CAACQ,GAAG,CAACH,IAAI,CAAC,EAAE,OAAOC,QAAQ,CAACG,eAAe,CAACX,OAAO,EAAEO,IAAI,CAAC;EACvE,EAAA,IAAIN,QAAQ,CAACS,GAAG,CAACH,IAAI,CAAC,EAAE,OAAOC,QAAQ,CAACG,eAAe,CAACZ,MAAM,EAAEQ,IAAI,CAAC;EACrE,EAAA,OAAOC,QAAQ,CAACI,aAAa,CAACL,IAAI,CAAC;EACrC;QAEaM,YAAY,GAAGC,MAAM,CAAC,YAAY;AAExC,QAAMC,SAAO,GAAGA,CAACC,IAAU,EAAEC,GAAW,EAAEC,KAAU,KAA+B;IACxF,MAAMd,EAAE,GAAGY,IAAmB;IAG9B,IAAIC,GAAG,KAAK,MAAM,EAAE;EACjBD,IAAAA,IAAI,CAASH,YAAY,CAAC,GAAGK,KAAK,IAAI,IAAI;MAC3C,IAAIA,KAAK,IAAI,IAAI,EAAE;MACnBF,IAAI,CAACG,WAAW,GAAGD,KAAK;EACxB,IAAA;EACF,EAAA;EAGA,EAAA,IAAID,GAAG,CAACG,UAAU,CAAC,IAAI,CAAC,EAAE;EACxB,IAAA,MAAMC,OAAO,GAAGJ,GAAG,CAACK,KAAK,CAAC,CAAC,CAAC;EAC5BN,IAAAA,IAAI,CAACO,gBAAgB,CAACF,OAAO,EAAEH,KAAK,CAAC;MACrC,OAAO,MAAMF,IAAI,CAACQ,mBAAmB,CAACH,OAAO,EAAEH,KAAK,CAAC;EACvD,EAAA;IAGA,IAAID,GAAG,KAAK,OAAO,EAAE;MACnB,IAAIC,KAAK,IAAI,IAAI,EAAE;QACjBd,EAAE,CAACqB,SAAS,GAAG,EAAE;EACnB,IAAA,CAAC,MAAM,IAAI,OAAOP,KAAK,KAAK,QAAQ,IAAI,CAACQ,KAAK,CAACC,OAAO,CAACT,KAAK,CAAC,EAAE;EAC7D,MAAA,IAAIf,IAAI,CAACC,EAAE,CAAC,EAAE;EACZ,QAAA,MAAMwB,KAAK,GAAGC,MAAM,CAACC,OAAO,CAACZ,KAA4B,CAAC,CACvDa,MAAM,CAAC,CAAC,GAAGC,CAAC,CAAC,KAAK,CAAC,CAACA,CAAC,CAAC,CACtBC,GAAG,CAAC,CAAC,CAACC,CAAC,CAAC,KAAKA,CAAC,CAAC,CACfC,IAAI,CAAC,GAAG,CAAC;EACZ/B,QAAAA,EAAE,CAACgC,YAAY,CAAC,OAAO,EAAER,KAAK,CAAC;EACjC,MAAA,CAAC,MAAM;EACL,QAAA,KAAK,MAAMM,CAAC,IAAIhB,KAAK,EAAE;EACrBd,UAAAA,EAAE,CAACiC,SAAS,CAACC,MAAM,CAACJ,CAAC,EAAE,CAAC,CAAEhB,KAAK,CAAyBgB,CAAC,CAAC,CAAC;EAC7D,QAAA;EACF,MAAA;EACF,IAAA,CAAC,MAAM;EACL,MAAA,MAAMK,GAAG,GAAG,OAAOrB,KAAK,KAAK,SAAS,GAAIA,KAAK,GAAG,MAAM,GAAG,EAAE,GAAIsB,MAAM,CAACtB,KAAK,CAAC;EAC9E,MAAA,IAAIf,IAAI,CAACC,EAAE,CAAC,EAAE;EACZA,QAAAA,EAAE,CAACgC,YAAY,CAAC,OAAO,EAAEG,GAAG,CAAC;EAC/B,MAAA,CAAC,MAAM;UACLnC,EAAE,CAACqB,SAAS,GAAGc,GAAG;EACpB,MAAA;EACF,IAAA;EACA,IAAA;EACF,EAAA;IAGA,IAAItB,GAAG,KAAK,OAAO,EAAE;MACnB,IAAIC,KAAK,IAAI,IAAI,EAAE;EACjBd,MAAAA,EAAE,CAACqC,KAAK,CAACC,OAAO,GAAG,EAAE;EACvB,IAAA,CAAC,MAAM;QACLtC,EAAE,CAACqC,KAAK,CAACC,OAAO,GAAGF,MAAM,CAACtB,KAAK,CAAC;EAClC,IAAA;EACA,IAAA;EACF,EAAA;IAGA,IAAID,GAAG,KAAK,MAAM,EAAE;EACjBD,IAAAA,IAAI,CAASH,YAAY,CAAC,GAAGK,KAAK,IAAI,IAAI;MAC3C,IAAIA,KAAK,IAAI,IAAI,EAAE;EAClBF,IAAAA,IAAI,CAAa2B,SAAS,GAAGH,MAAM,CAACtB,KAAK,CAAC;EAC3C,IAAA;EACF,EAAA;EAGA,EAAA,IAAItB,eAAa,CAACc,GAAG,CAACO,GAAG,CAAC,EAAE;MAC1B,IAAIC,KAAK,KAAK,KAAK,IAAIA,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAK0B,SAAS,EAAE;EAC5DxC,MAAAA,EAAE,CAACyC,eAAe,CAAC5B,GAAG,CAAC;EACzB,IAAA,CAAC,MAAM;EACLb,MAAAA,EAAE,CAACgC,YAAY,CAACnB,GAAG,EAAE,EAAE,CAAC;EAC1B,IAAA;EACA,IAAA;EACF,EAAA;EAGA,EAAA,IAAI,CAACA,GAAG,KAAK,OAAO,IAAIA,GAAG,KAAK,SAAS,KAAKnB,eAAe,CAACY,GAAG,CAACN,EAAE,CAAC0C,OAAO,CAAC,EAAE;EAC5E1C,IAAAA,EAAE,CAASa,GAAG,CAAC,GAAGC,KAAK;EACxB,IAAA;EACF,EAAA;EAGA,EAAA,IAAIf,IAAI,CAACC,EAAE,CAAC,EAAE;MACZ,IAAIc,KAAK,IAAI,IAAI,EAAE;EACjBd,MAAAA,EAAE,CAACyC,eAAe,CAAC5B,GAAG,CAAC;EACzB,IAAA,CAAC,MAAM;QACLb,EAAE,CAACgC,YAAY,CAACnB,GAAG,EAAEuB,MAAM,CAACtB,KAAK,CAAC,CAAC;EACrC,IAAA;EACA,IAAA;EACF,EAAA;EAGA,EAAA,IAAID,GAAG,CAACG,UAAU,CAAC,OAAO,CAAC,IAAIH,GAAG,CAACG,UAAU,CAAC,OAAO,CAAC,EAAE;MACtD,IAAIF,KAAK,IAAI,IAAI,EAAE;EACjBd,MAAAA,EAAE,CAACyC,eAAe,CAAC5B,GAAG,CAAC;EACzB,IAAA,CAAC,MAAM;QACLb,EAAE,CAACgC,YAAY,CAACnB,GAAG,EAAEuB,MAAM,CAACtB,KAAK,CAAC,CAAC;EACrC,IAAA;EACA,IAAA;EACF,EAAA;IAGA,IAAIA,KAAK,IAAI,IAAI,EAAE;EACjBd,IAAAA,EAAE,CAACyC,eAAe,CAAC5B,GAAG,CAAC;EACzB,EAAA,CAAC,MAAM,IAAIA,GAAG,IAAIb,EAAE,EAAE;EACnBA,IAAAA,EAAE,CAASa,GAAG,CAAC,GAAGC,KAAK;EAC1B,EAAA,CAAC,MAAM;MACLd,EAAE,CAACgC,YAAY,CAACnB,GAAG,EAAEuB,MAAM,CAACtB,KAAK,CAAC,CAAC;EACrC,EAAA;EACF;AAEO,QAAM6B,aAAW,GAAGA,CAACC,MAAY,EAAEhC,IAAU,EAAEiC,IAAiB,KAAK;IAC1E,IAAI,CAACA,IAAI,EAAED,MAAM,CAACE,YAAY,CAAClC,IAAI,EAAEgC,MAAM,CAACG,UAAU,CAAC,CAAC,KACnDH,MAAM,CAACE,YAAY,CAAClC,IAAI,EAAEiC,IAAI,CAACG,WAAW,CAAC;EAClD;AAEO,QAAMC,cAAY,GAAI9C,IAAY,IAAKC,QAAQ,CAAC8C,aAAa,CAAC/C,IAAI;AAElE,QAAMgD,QAAM,GAAIvC,IAAU,IAAK;IAAGA,IAAI,CAAauC,MAAM,EAAE;EAAE;QAEvDJ,YAAU,GAAInC,IAAU,IAAKA,IAAI,CAACmC;QAElCK,SAAO,GAAIxC,IAAU,IAAKA,IAAI,CAACoC;AAErC,QAAMK,cAAY,GAAIzC,IAAU,IAAqB;EAC1D,EAAA,IAAKA,IAAI,CAASH,YAAY,CAAC,EAAE;MAC/B,MAAM6C,GAAG,GAAI1C,IAAI,CAAa8B,OAAO,EAAEa,WAAW,EAAE;EACpD,IAAA,MAAMC,OAAO,GAAI5C,IAAI,CAAiBG,WAAW,IAAI,IAAI;EACzD0C,IAAAA,OAAO,CAACC,IAAI,CAAC,CAAA,CAAA,EAAIJ,GAAG,CAAA,MAAA,EAASE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA,8CAAA,CAAgD,CAAC;EACvG,IAAA,OAAO,KAAK;EACd,EAAA;EACF;QAGaG,WAAS,GAAGA,MAAM,CAAC;QACnBC,gBAAc,GAAGA,MAAM,CAAC;AAE9B,QAAMC,MAAM,GAAGC,iBAAY,CAAC;gBACjC5D,YAAU;aACVS,SAAO;iBACPgC,aAAW;kBACXM,cAAY;YACZE,QAAM;gBACNJ,YAAU;aACVK,SAAO;kBACPC,cAAY;eACZM,WAAS;EACTC,kBAAAA;EACF,CAAC;;EClMM,IAAIG,GAAW,GAAG;EACvBC,EAAAA,IAAI,EAAE,IAAI;EACVC,EAAAA,OAAO,EAAE;EACX,CAAC;EAEM,MAAMC,QAAQ,GAAGA,MACtBzC,MAAM,CAAC0C,IAAI,CAACJ,GAAG,CAAC,CAACK,OAAO,CAACvD,GAAG,IAAI;EAC9BkD,EAAAA,GAAG,CAAClD,GAAG,CAAC,GAAG,IAAI;EACjB,CAAC,CAAC;;ECTG,MAAMwD,OAAO,CAAC;EAGnBzB,EAAAA,MAAM,GAAoB,IAAI;EAC9BG,EAAAA,UAAU,GAAmB,IAAI;EACjCuB,EAAAA,SAAS,GAAmB,IAAI;EAChCtB,EAAAA,WAAW,GAAmB,IAAI;EAClCuB,EAAAA,WAAW,GAAmB,IAAI;EAClCC,EAAAA,MAAM,GAAY,KAAK;EACvBC,EAAAA,WAAW,GAAY,KAAK;EAE5BC,EAAAA,UAAU,GAAkB,IAAI;EAClC;EAEA,IAAYC,WAAW,aAAXA,WAAW,EAAA;EAAXA,EAAAA,WAAW,CAAXA,WAAW,CAAA,SAAA,CAAA,GAAA,CAAA,CAAA,GAAA,SAAA;EAAXA,EAAAA,WAAW,CAAXA,WAAW,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAA;EAAXA,EAAAA,WAAW,CAAXA,WAAW,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAA;EAAXA,EAAAA,WAAW,CAAXA,WAAW,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAA;EAAA,EAAA,OAAXA,WAAW;EAAA,CAAA,CAAA,EAAA,CAAA;EAOhB,MAAMC,OAAO,SAASP,OAAO,CAAC;IACnCQ,IAAI,GAAGF,WAAW,CAACC,OAAO;EAC1B7D,EAAAA,WAAW,GAAkB,IAAI;IAEjC+D,KAAK,GAA2B,EAAE;EAClCC,EAAAA,WAAWA,CAEFjE,KAAa,EACb8B,MAAuB,EAC9B;EACA,IAAA,KAAK,EAAE;MAAC,IAAA,CAHD9B,KAAa,GAAbA,KAAa;MAAA,IAAA,CACb8B,MAAuB,GAAvBA,MAAuB;EAGhC,EAAA;EACF;EAEO,MAAMoC,IAAI,SAASX,OAAO,CAAC;IAChCQ,IAAI,GAAGF,WAAW,CAACK,IAAI;EACvBD,EAAAA,WAAWA,CAEFhE,WAAmB,EACnB6B,MAAuB,EAC9B;EACA,IAAA,KAAK,EAAE;MAAC,IAAA,CAHD7B,WAAmB,GAAnBA,WAAmB;MAAA,IAAA,CACnB6B,MAAuB,GAAvBA,MAAuB;EAGhC,EAAA;EACF;EAEO,MAAMqC,MAAM,SAASZ,OAAO,CAAC;IAClCQ,IAAI,GAAGF,WAAW,CAACM,MAAM;EACzBF,EAAAA,WAAWA,CAEFjE,KAAa,EACb8B,MAAuB,EAC9B;EACA,IAAA,KAAK,EAAE;MAAC,IAAA,CAHD9B,KAAa,GAAbA,KAAa;MAAA,IAAA,CACb8B,MAAuB,GAAvBA,MAAuB;EAGhC,EAAA;EACF;EACO,MAAMsC,IAAI,SAASb,OAAO,CAAC;IAChCQ,IAAI,GAAGF,WAAW,CAACO,IAAI;EACvBH,EAAAA,WAAWA,CAEFjE,KAAa,EACb8B,MAAuB,EAC9B;EACA,IAAA,KAAK,EAAE;MAAC,IAAA,CAHD9B,KAAa,GAAbA,KAAa;MAAA,IAAA,CACb8B,MAAuB,GAAvBA,MAAuB;EAGhC,EAAA;EACF;;EC7DA,MAAMuC,SAAS,GAAG,IAAI1F,GAAG,CAAC,CACxB,MAAM,EACN,MAAM,EACN,IAAI,EACJ,KAAK,EACL,OAAO,EACP,IAAI,EACJ,KAAK,EACL,OAAO,EACP,MAAM,EACN,MAAM,EACN,OAAO,EACP,QAAQ,EACR,OAAO,EACP,KAAK,CACN,CAAC;EAEF,MAAMD,aAAa,GAAG,IAAIC,GAAG,CAAC,CAC5B,UAAU,EACV,UAAU,EACV,SAAS,EACT,UAAU,EACV,QAAQ,EACR,UAAU,EACV,UAAU,EACV,WAAW,EACX,UAAU,EACV,UAAU,EACV,MAAM,EACN,OAAO,EACP,OAAO,EACP,OAAO,EACP,UAAU,EACV,MAAM,EACN,WAAW,EACX,OAAO,EACP,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,SAAS,EACT,SAAS,CACV,CAAC;EAEF,MAAM2F,OAAO,GAAG,SAAS;EACzB,MAAMC,OAAO,GAAG,QAAQ;EACxB,MAAMC,QAAgC,GAAG;EACvC,EAAA,GAAG,EAAE,OAAO;EACZ,EAAA,GAAG,EAAE,QAAQ;EACb,EAAA,GAAG,EAAE,MAAM;EACX,EAAA,GAAG,EAAE;EACP,CAAC;EACD,MAAMC,QAAgC,GAAG;EACvC,EAAA,GAAG,EAAE,OAAO;EACZ,EAAA,GAAG,EAAE,MAAM;EACX,EAAA,GAAG,EAAE;EACP,CAAC;EAED,MAAMC,UAAU,GAAIrD,GAAW,IAAK;EAClC,EAAA,MAAMsD,CAAC,GAAGrD,MAAM,CAACD,GAAG,CAAC;IACrB,OAAOiD,OAAO,CAACM,IAAI,CAACD,CAAC,CAAC,GAAGA,CAAC,CAACE,OAAO,CAACP,OAAO,EAAEQ,CAAC,IAAIN,QAAQ,CAACM,CAAC,CAAC,CAAC,GAAGH,CAAC;EACnE,CAAC;EAED,MAAMI,UAAU,GAAI1D,GAAW,IAAK;EAClC,EAAA,MAAMsD,CAAC,GAAGrD,MAAM,CAACD,GAAG,CAAC;IACrB,OAAOkD,OAAO,CAACK,IAAI,CAACD,CAAC,CAAC,GAAGA,CAAC,CAACE,OAAO,CAACN,OAAO,EAAEO,CAAC,IAAIL,QAAQ,CAACK,CAAC,CAAC,CAAC,GAAGH,CAAC;EACnE,CAAC;EAED,MAAMvF,UAAU,GAAIC,IAAY,IAAK;IACnC,IAAIA,IAAI,KAAK,MAAM,EAAE;EACnB,IAAA,OAAO,IAAI6E,IAAI,CAAC,EAAE,CAAC;EACrB,EAAA;EACAjB,EAAAA,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,CAAA,EAAIX,IAAI,CAAA,CAAE;EAC5B,EAAA,OAAO,IAAIyE,OAAO,CAACzE,IAAI,CAAC;EAC1B,CAAC;EAED,MAAMQ,OAAO,GAAGA,CAACC,IAAoB,EAAEC,GAAW,EAAEC,KAAU,KAAK;IACjE,IAAIF,IAAI,CAAC6D,WAAW,EAAE;IACtB,IAAI5D,GAAG,CAACG,UAAU,CAAC,IAAI,CAAC,IAAIH,GAAG,KAAK,KAAK,EAAE;IAG3C,IAAIA,GAAG,KAAK,MAAM,EAAE;MAClB,IAAIC,KAAK,IAAI,IAAI,EAAE;MACnBF,IAAI,CAACG,WAAW,GAAGD,KAAK;EACxB,IAAA;EACF,EAAA;IAGA,IAAID,GAAG,KAAK,MAAM,EAAE;MAClB,IAAIC,KAAK,IAAI,IAAI,EAAE;EACnBF,IAAAA,IAAI,CAAC8D,UAAU,GAAGtC,MAAM,CAACtB,KAAK,CAAC;EAC/B,IAAA;EACF,EAAA;IAGA,IAAID,GAAG,KAAK,OAAO,EAAE;MACnB,IAAIC,KAAK,IAAI,IAAI,EAAE;EACnB,IAAA,IAAIgF,QAAgB;EACpB,IAAA,IAAI,OAAOhF,KAAK,KAAK,QAAQ,IAAI,CAACQ,KAAK,CAACC,OAAO,CAACT,KAAK,CAAC,EAAE;EACtDgF,MAAAA,QAAQ,GAAGrE,MAAM,CAACC,OAAO,CAACZ,KAA4B,CAAC,CACpDa,MAAM,CAAC,CAAC,GAAGC,CAAC,CAAC,KAAK,CAAC,CAACA,CAAC,CAAC,CACtBC,GAAG,CAAC,CAAC,CAACC,CAAC,CAAC,KAAKA,CAAC,CAAC,CACfC,IAAI,CAAC,GAAG,CAAC;EACd,IAAA,CAAC,MAAM;EACL+D,MAAAA,QAAQ,GAAG,OAAOhF,KAAK,KAAK,SAAS,GAAIA,KAAK,GAAG,MAAM,GAAG,EAAE,GAAIsB,MAAM,CAACtB,KAAK,CAAC;EAC/E,IAAA;EACA,IAAA,IAAIgF,QAAQ,EAAE/B,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,QAAA,EAAW0E,UAAU,CAACM,QAAQ,CAAC,CAAA,CAAA,CAAG;EAClE,IAAA;EACF,EAAA;IAGA,IAAIjF,GAAG,KAAK,OAAO,EAAE;MACnB,IAAIC,KAAK,IAAI,IAAI,EAAE;EACnBiD,IAAAA,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,QAAA,EAAW0E,UAAU,CAACpD,MAAM,CAACtB,KAAK,CAAC,CAAC,CAAA,CAAA,CAAG;EACzD,IAAA;EACF,EAAA;EAGA,EAAA,IAAItB,aAAa,CAACc,GAAG,CAACO,GAAG,CAAC,EAAE;MAC1B,IAAIC,KAAK,KAAK,KAAK,IAAIA,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAK0B,SAAS,EAAE;EAC5DuB,MAAAA,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,CAAA,EAAID,GAAG,CAAA,CAAE;EAC7B,IAAA;EACA,IAAA;EACF,EAAA;EAGA,EAAA,IAAIA,GAAG,CAACG,UAAU,CAAC,OAAO,CAAC,IAAIH,GAAG,CAACG,UAAU,CAAC,OAAO,CAAC,EAAE;MACtD,IAAIF,KAAK,IAAI,IAAI,EAAE;EACnBiD,IAAAA,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,CAAA,EAAID,GAAG,CAAA,EAAA,EAAK2E,UAAU,CAAC1E,KAAK,CAAC,CAAA,CAAA,CAAG;EAClD,IAAA;EACF,EAAA;IAGA,IAAIA,KAAK,IAAI,IAAI,EAAE;EACnBiD,EAAAA,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,CAAA,EAAID,GAAG,CAAA,EAAA,EAAK2E,UAAU,CAAC1E,KAAK,CAAC,CAAA,CAAA,CAAG;EACpD,CAAC;EAED,MAAMiF,kBAAkB,GAAInF,IAAa,IAAK;EAC5C,EAAA,IAAIA,IAAI,CAAC8D,UAAU,IAAI,IAAI,EAAE;EAC3BX,IAAAA,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAIF,IAAI,CAAC8D,UAAU;EACjC,IAAA,OAAO,IAAI;EACb,EAAA;EACA,EAAA,IAAI9D,IAAI,CAACG,WAAW,IAAI,IAAI,EAAE;MAC5BgD,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI+E,UAAU,CAACjF,IAAI,CAACG,WAAW,CAAC;EAC9C,IAAA,OAAO,IAAI;EACb,EAAA;EACA,EAAA,OAAO,KAAK;EACd,CAAC;EAED,MAAMsC,YAAY,GAAIzC,IAAoB,IAAc;EACtD,EAAA,IAAIA,IAAI,YAAYoE,IAAI,EAAE,OAAO,IAAI;EAErC,EAAA,MAAMxB,OAAO,GAAG5C,IAAI,CAACG,WAAW,IAAI,IAAI;EACxC,EAAA,MAAMiF,OAAO,GAAGpF,IAAI,CAAC8D,UAAU,IAAI,IAAI;IAGvC,IAAIS,SAAS,CAAC7E,GAAG,CAACM,IAAI,CAACE,KAAK,CAAC,EAAE;EAC7BiD,IAAAA,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,EAAA,CAAI;MACtB2C,OAAO,CAACC,IAAI,CAAC,CAAA,CAAA,EAAI9C,IAAI,CAACE,KAAK,uBAAuB,CAAC;MACnDF,IAAI,CAAC6D,WAAW,GAAG,IAAI;MACvB7D,IAAI,CAAC4D,MAAM,GAAG,IAAI;EAClB,IAAA,OAAO,KAAK;EACd,EAAA;IAEA,IAAIhB,OAAO,IAAIwC,OAAO,EAAE;EACtBvC,IAAAA,OAAO,CAACC,IAAI,CAAC,CAAA,CAAA,EAAI9C,IAAI,CAACE,KAAK,CAAA,MAAA,EAASkF,OAAO,GAAG,MAAM,GAAG,MAAM,gDAAgD,CAAC;EAC9GjC,IAAAA,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,CAAA,CAAG;MAErBiF,kBAAkB,CAACnF,IAAI,CAAC;MACxBmD,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,EAAA,EAAKF,IAAI,CAACE,KAAK,CAAA,CAAA,CAAG;MACpCF,IAAI,CAAC6D,WAAW,GAAG,IAAI;MACvB7D,IAAI,CAAC4D,MAAM,GAAG,IAAI;EAClB,IAAA,OAAO,KAAK;EACd,EAAA;EAEAT,EAAAA,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,CAAA,CAAG;IACrBF,IAAI,CAAC6D,WAAW,GAAG,IAAI;EACvB,EAAA,OAAO,IAAI;EACb,CAAC;EAED,MAAMb,cAAc,GAAIhD,IAAe,IAAK;EAC1C,EAAA,MAAMqF,SAAS,GAAGrF,IAAI,CAACqF,SAAmB;IAC1ClC,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,IAAA,EAAOmF,SAAS,CAACnF,KAAK,CAAA,GAAA,CAAK;EAC/C,CAAC;EACD,MAAM6C,SAAS,GAAGA,CAAC/C,IAAoB,EAAEsF,QAAiB,KAAK;IAM7D,IAAItF,IAAI,CAAC4D,MAAM,EAAE;IACjB,IAAI5D,IAAI,YAAYoE,IAAI,EAAE;MACxBjB,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI+E,UAAU,CAACjF,IAAI,CAACG,WAAW,CAAC;EAChD,EAAA,CAAC,MAAM;MAEL,IAAIH,IAAI,CAAC6D,WAAW,EAAE;QAEpB,IAAIU,SAAS,CAAC7E,GAAG,CAACM,IAAI,CAACE,KAAK,CAAC,EAAE,CAC9B,MAAM;UACLiD,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,EAAA,EAAKF,IAAI,CAACE,KAAK,CAAA,CAAA,CAAG;EACtC,MAAA;EACF,IAAA,CAAC,MAEI;QAEH,IAAIqE,SAAS,CAAC7E,GAAG,CAACM,IAAI,CAACE,KAAK,CAAC,EAAE;EAC7BiD,QAAAA,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,GAAA,CAAK;EACzB,MAAA,CAAC,MAEI;EACHiD,QAAAA,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,CAAA,CAAG;UAErBiF,kBAAkB,CAACnF,IAAI,CAAC;UACxBmD,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,EAAA,EAAKF,IAAI,CAACE,KAAK,CAAA,CAAA,CAAG;EACtC,MAAA;EACF,IAAA;EACF,EAAA;EACF,CAAC;EAED,MAAM6B,WAAW,GAAGA,CAACC,MAAe,EAAEhC,IAAa,EAAEiC,IAAoB,KAAK;IAC5E,MAAMsD,IAAI,GAAGtD,IAAI,GAAGA,IAAI,CAACG,WAAW,GAAGJ,MAAM,CAACG,UAAU;IACxDnC,IAAI,CAACoC,WAAW,GAAGmD,IAAI;IACvBvF,IAAI,CAAC2D,WAAW,GAAG1B,IAAI;EAEvB,EAAA,IAAIA,IAAI,EAAE;MACRA,IAAI,CAACG,WAAW,GAAGpC,IAAI;EACzB,EAAA,CAAC,MAAM;MACLgC,MAAM,CAACG,UAAU,GAAGnC,IAAI;EAC1B,EAAA;EACA,EAAA,IAAIuF,IAAI,EAAE;MACRA,IAAI,CAAC5B,WAAW,GAAG3D,IAAI;EACzB,EAAA,CAAC,MAAM;MACLgC,MAAM,CAAC0B,SAAS,GAAG1D,IAAI;EACzB,EAAA;IACAA,IAAI,CAACgC,MAAM,GAAGA,MAAM;EACtB,CAAC;EAED,MAAMK,YAAY,GAAGA,CAAC9C,IAAY,EAAEiG,QAAkB,KAAK;EACzD,EAAA,IAAIA,QAAQ,EAAE;EACZrC,IAAAA,GAAG,CAACC,IAAI,CAAClD,KAAK,IAAI,CAAA,IAAA,EAAOX,IAAI,CAAA,GAAA,CAAK;EACpC,EAAA;EACA,EAAA,OAAO,IAAI8E,MAAM,CAAC9E,IAAI,CAAC;EACzB,CAAC;EAED,MAAMgD,MAAM,GAAIvC,IAAa,IAAK;EAChC,EAAA,MAAQgC,MAAM,GAA+BhC,IAAI,CAAzCgC,MAAM;MAAE2B,WAAW,GAAkB3D,IAAI,CAAjC2D,WAAW;MAAEvB,WAAW,GAAKpC,IAAI,CAApBoC,WAAW;EACxC,EAAA,IAAIuB,WAAW,EAAE;MACfA,WAAW,CAACvB,WAAW,GAAGA,WAAW;EACvC,EAAA;EACA,EAAA,IAAIA,WAAW,EAAE;MACfA,WAAW,CAACuB,WAAW,GAAGA,WAAW;EACvC,EAAA;EACA,EAAA,IAAI3B,MAAM,EAAE;EACV,IAAA,IAAIA,MAAM,CAACG,UAAU,KAAKnC,IAAI,EAAE;QAC9BgC,MAAM,CAACG,UAAU,GAAGC,WAAW;EACjC,IAAA;EACA,IAAA,IAAIJ,MAAM,CAAC0B,SAAS,KAAK1D,IAAI,EAAE;QAC7BgC,MAAM,CAAC0B,SAAS,GAAGC,WAAW;EAChC,IAAA;EACF,EAAA;EACF,CAAC;EAED,MAAMxB,UAAU,GAAInC,IAAa,IAAKA,IAAI,CAACmC,UAAU;EAErD,MAAMK,OAAO,GAAIxC,IAAa,IAAKA,IAAI,CAACoC,WAAW;AAE5C,QAAMqD,aAAa,GAAIC,cAA4B,IAAK;EAC7DpC,EAAAA,QAAQ,EAAE;EACV,EAAA,MAAMF,IAAI,GAAG,IAAIkB,IAAI,CAAC,EAAE,CAAC;EACzBnB,EAAAA,GAAG,CAACC,IAAI,GAAGD,GAAG,CAACE,OAAO,GAAGD,IAAI;IAC7B,MAAMH,MAAM,GAAGC,iBAAY,CAAC;MAC1B5D,UAAU;MACVS,OAAO;MACPgC,WAAW;MACXM,YAAY;MACZE,MAAM;MACNJ,UAAU;MACVK,OAAO;MACPC,YAAY;MACZM,SAAS;MACTC,cAAc;EACd2C,IAAAA,UAAU,EAAE;EACd,GAAC,CAAC;EACF1C,EAAAA,MAAM,CAACyC,cAAc,EAAEtC,IAAI,CAAC;IAC5B,OAAO;EACLwC,IAAAA,IAAI,EAAEzC,GAAG,CAACC,IAAI,CAAClD;KAChB;EACH;;ECjQA,MAAM2F,UAAU,CAAC;EAIPC,EAAAA,OAAO,GAAG,IAAIC,OAAO,EAAQ;IAErC5B,WAAWA,CAAC6B,SAAe,EAAE;MAC3B,IAAI,CAAChE,MAAM,GAAGgE,SAAS;EACzB,EAAA;IAGAC,aAAaA,CAACjG,IAAU,EAAE;MACxB,IAAI,CAACgC,MAAM,GAAGhC,IAAI;EACpB,EAAA;IAGAkG,aAAaA,CAAClG,IAAU,EAAE;MACxB,IAAIA,IAAI,KAAK,IAAI,CAACgC,MAAM,IAAI,IAAI,CAACA,MAAM,CAACmE,UAAU,EAAE;EAClD,MAAA,IAAI,CAACnE,MAAM,GAAG,IAAI,CAACA,MAAM,CAACmE,UAAU;EACtC,IAAA;EACF,EAAA;IAGQC,aAAaA,CAACC,SAAkC,EAAe;EACrE,IAAA,IAAIrG,IAAI,GAAG,IAAI,CAACgC,MAAM,CAACG,UAAU;EACjC,IAAA,OAAOnC,IAAI,EAAE;EACX,MAAA,IAAI,CAAC,IAAI,CAAC8F,OAAO,CAACpG,GAAG,CAACM,IAAI,CAAC,IAAIqG,SAAS,CAACrG,IAAI,CAAC,EAAE;EAC9C,QAAA,IAAI,CAAC8F,OAAO,CAACQ,GAAG,CAACtG,IAAI,CAAC;EACtB,QAAA,OAAOA,IAAI;EACb,MAAA;QACAA,IAAI,GAAGA,IAAI,CAACoC,WAAW;EACzB,IAAA;EACA,IAAA,OAAO,IAAI;EACb,EAAA;IAGAmE,eAAeA,CAACzE,OAAe,EAAkB;MAC/C,OAAO,IAAI,CAACsE,aAAa,CACtBpG,IAAI,IAAKA,IAAI,CAACwG,QAAQ,KAAK,CAAC,IAAKxG,IAAI,CAAa8B,OAAO,CAACa,WAAW,EAAE,KAAKb,OAC/E,CAAC;EACH,EAAA;IAGA2E,eAAeA,CAAClH,IAAY,EAAkB;EAC5C,IAAA,OAAO,IAAI,CAAC6G,aAAa,CACtBpG,IAAI,IAAKA,IAAI,CAACwG,QAAQ,KAAK,CAAC,IAAKxG,IAAI,CAAa0G,IAAI,KAAKnH,IAC9D,CAAC;EACH,EAAA;EAGAoH,EAAAA,YAAYA,GAAgB;MAC1B,OAAO,IAAI,CAACP,aAAa,CACtBpG,IAAI,IAAKA,IAAI,CAACwG,QAAQ,KAAK,CAAC,IAAI,CAAC,CAAExG,IAAI,CAACG,WAAW,EAAEyG,IAAI,EAC5D,CAAC;EACH,EAAA;EACF;QAIaC,OAAO,GAAGA,CAACnB,cAA4B,EAAEoB,MAAe,KAAK;EACxE,EAAA,MAAMC,MAAM,GAAG,IAAIlB,UAAU,CAACiB,MAAM,CAAC;IAGrC,IAAIE,aAAa,GAAG,IAAI;IAIxB,MAAMC,cAAc,GAAGA,CAACjH,IAAU,EAAEC,GAAW,EAAEC,KAAU,KAAK;MAC9D,IAAI8G,aAAa,KAAK/G,GAAG,KAAK,MAAM,IAAIA,GAAG,KAAK,MAAM,CAAC,EAAE;EACtDD,MAAAA,IAAI,CAASH,YAAY,CAAC,GAAGK,KAAK,IAAI,IAAI;EAC3C,MAAA;EACF,IAAA;EACA,IAAA,OAAOH,SAAO,CAACC,IAAI,EAAEC,GAAG,EAAEC,KAAK,CAAC;IAClC,CAAC;IAED,MAAMZ,UAAU,GAAIC,IAAY,IAAW;EACzC,IAAA,IAAIyH,aAAa,EAAE;EACjB,MAAA,MAAMlB,OAAO,GAAGvG,IAAI,KAAK,MAAM,GAC3BwH,MAAM,CAACJ,YAAY,EAAE,GACrBI,MAAM,CAACR,eAAe,CAAChH,IAAI,CAAC;QAChC,IAAIuG,OAAO,EAAE,OAAOA,OAAO;EAC7B,IAAA;EACA,IAAA,OAAOvG,IAAI,KAAK,MAAM,GAClBC,QAAQ,CAACC,cAAc,CAAC,EAAE,CAAC,GAC3ByH,YAAiB,CAAC3H,IAAI,CAAC;IAC7B,CAAC;IAED,MAAM8C,YAAY,GAAI9C,IAAY,IAAc;EAC9C,IAAA,IAAIyH,aAAa,EAAE;EACjB,MAAA,MAAMlB,OAAO,GAAGiB,MAAM,CAACN,eAAe,CAAClH,IAAI,CAAC;QAC5C,IAAIuG,OAAO,EAAE,OAAOA,OAAO;EAC7B,IAAA;EACA,IAAA,OAAOtG,QAAQ,CAAC8C,aAAa,CAAC/C,IAAI,CAAC;IACrC,CAAC;IAED,MAAMwC,WAAW,GAAGA,CAACC,MAAY,EAAEhC,IAAU,EAAEiC,IAAiB,KAAK;MACnE,IAAIjC,IAAI,KAAKgC,MAAM,EAAE;MACrB,MAAMmF,YAAY,GAAGlF,IAAI,GAAGA,IAAI,CAACG,WAAW,GAAGJ,MAAM,CAACG,UAAU;MAChE,IAAInC,IAAI,KAAKmH,YAAY,EAAE;EAC3BnF,IAAAA,MAAM,CAACE,YAAY,CAAClC,IAAI,EAAEmH,YAAY,CAAC;IACzC,CAAC;IAED,MAAM1E,YAAY,GAAIzC,IAAU,IAAqB;EACnD,IAAA,IAAKA,IAAI,CAASH,YAAY,CAAC,EAAE;QAC/B,MAAM6C,GAAG,GAAI1C,IAAI,CAAa8B,OAAO,EAAEa,WAAW,EAAE;EACpD,MAAA,MAAMC,OAAO,GAAI5C,IAAI,CAAiBG,WAAW,IAAI,IAAI;EACzD0C,MAAAA,OAAO,CAACC,IAAI,CACV,CAAA,CAAA,EAAIJ,GAAG,CAAA,MAAA,EAASE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA,8CAAA,CAC3C,CAAC;EACD,MAAA,OAAO,KAAK;EACd,IAAA;EACA,IAAA,IAAIoE,aAAa,EAAED,MAAM,CAACd,aAAa,CAACjG,IAAI,CAAC;IAC/C,CAAC;IAED,MAAM+C,SAAS,GAAI/C,IAAU,IAAK;EAChC,IAAA,IAAIgH,aAAa,EAAED,MAAM,CAACb,aAAa,CAAClG,IAAI,CAAC;IAC/C,CAAC;IAED,MAAMgD,cAAc,GAAIhD,IAAU,IAAK;EACrC,IAAA,IAAIgH,aAAa,EAAED,MAAM,CAACb,aAAa,CAAClG,IAAI,CAAC;IAC/C,CAAC;IAED,MAAMiD,MAAM,GAAGC,iBAAY,CAAC;MAC1B5D,UAAU;EACVS,IAAAA,OAAO,EAAEkH,cAAc;MACvBlF,WAAW;MACXM,YAAY;cACZE,QAAM;kBACNJ,YAAU;eACVK,SAAO;MACPC,YAAY;MACZM,SAAS;MACTC,cAAc;MAGdoE,aAAa,EAAEA,MAAM;EACnBJ,MAAAA,aAAa,GAAG,KAAK;EACvB,IAAA;EACF,GAAC,CAAC;EAEF,EAAA,OAAO/D,MAAM,CAACyC,cAAc,EAAEoB,MAAM,CAAC;EACvC;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.umd.js","sources":["../src/render.ts","../src/type.ts","../src/parse-html.ts","../src/render-html-str2.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","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\n\nexport class SSRFiber {\n parent?: SSRFiber = undefined;\n next?: SSRFiber = undefined;\n child?: SSRFiber = undefined;\n html?: string = undefined;\n /** 开标签 > 在原始 HTML 字符串中的索引位置 */\n openTagEnd?: number = undefined;\n constructor(public type: any, public props: Record<any, any> = {}) {}\n\n querySelector(selector: string): SSRFiber | null {\n // 解析 selector:tag#id.class1.class2\n const idMatch = selector.match(/#([\\w-]+)/);\n const id = idMatch ? idMatch[1] : null;\n const classMatches = selector.match(/\\.[\\w-]+/g);\n const classes = classMatches ? classMatches.map(c => c.slice(1)) : [];\n const tag = selector.replace(/#[\\w-]+/g, '').replace(/\\.[\\w-]+/g, '').trim() || null;\n\n // 深度优先遍历 child → next 链表\n const walk = (node: SSRFiber | undefined): SSRFiber | null => {\n if (!node) return null;\n // 跳过非元素节点\n if (node.type !== 'root' && node.type !== 'anchor' && node.type !== 'text') {\n if (!tag || node.type === tag) {\n if (!id || node.props['id'] === id) {\n if (\n classes.length === 0 ||\n classes.every(c => (node.props['class'] || '').split(/\\s+/).includes(c))\n ) {\n return node;\n }\n }\n }\n }\n return walk(node.child) || walk(node.next);\n };\n\n return walk(this.child);\n }\n\n getElementById(id: string): SSRFiber | null {\n return this.querySelector(`#${id}`);\n }\n}\n\n","import { Parser } from 'htmlparser2';\nimport { SSRFiber } from './type';\n\n/**\n * 使用 htmlparser2 将 HTML 字符串解析为 SSRFiber,插入到 root 下。\n * 解析产生的节点通过 child/next/parent 组成树结构,挂载到 root.child 链表。\n */\nexport function parseHtmlToFibers(html: string, root: SSRFiber): void {\n // 栈:跟踪当前父节点及其最后一个子节点。root 始终在栈底\n const stack: { parent: SSRFiber; lastChild: SSRFiber | null }[] = [\n { parent: root, lastChild: null },\n ];\n // 当前层级的上一个兄弟节点\n let prevSibling: SSRFiber | null = null;\n\n const append = (node: SSRFiber) => {\n const frame = stack[stack.length - 1];\n if (!frame.parent.child) {\n frame.parent.child = node;\n } else if (frame.lastChild) {\n frame.lastChild.next = node;\n }\n frame.lastChild = node;\n node.parent = frame.parent;\n prevSibling = node;\n };\n\n // 通过 onparserinit 拿到 parser 实例,后续从 parser.endIndex 读取 > 的位置\n let parserRef: Parser;\n\n const parser = new Parser({\n onparserinit(p: Parser) {\n parserRef = p;\n },\n\n onopentag(name: string, attribs: Record<string, string>) {\n const fiber = new SSRFiber(name, { ...attribs });\n // onopentagend 在 onopentag 之前触发,已将 endIndex 写入 parser\n fiber.openTagEnd = parserRef.endIndex;\n append(fiber);\n stack.push({ parent: fiber, lastChild: null });\n prevSibling = null;\n },\n\n ontext(text: string) {\n const fiber = new SSRFiber('text', { text });\n append(fiber);\n },\n\n onclosetag() {\n stack.pop();\n const top = stack[stack.length - 1];\n prevSibling = top.lastChild ?? null;\n },\n });\n\n parser.write(html);\n parser.end();\n}\n","import { customRender, Store } from 'bobe';\nimport { SSRFiber } from './type';\nimport { parseHtmlToFibers } from './parse-html';\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 return new SSRFiber(name);\n};\n\nconst setProp = (node: SSRFiber, key: string, value: any) => {\n node.props[key] = value;\n if (key === 'html') {\n parseHtmlToFibers(value, node);\n }\n};\n\nconst beforeIndent = (node: SSRFiber) => {\n // 仅 html 需要跳过缩进子节点(子内容来自 parseHtmlToFibers)\n if (node.props.html != null) {\n return false;\n }\n};\n\nconst insertAfter = (parent: SSRFiber, node: SSRFiber, prev: SSRFiber | null) => {\n let next: SSRFiber;\n if (prev) {\n next = prev.next;\n prev.next = node;\n } else {\n next = parent.child;\n parent.child = node;\n }\n node.next = next;\n node.parent = parent;\n};\n\nconst createAnchor = (name: string, isBefore?: boolean) => {\n return new SSRFiber('anchor', {\n name,\n isBefore\n });\n};\n\nconst remove = (node: SSRFiber, prev?: SSRFiber) => {\n const { parent, next } = node;\n node.next = null;\n if (prev) {\n prev.next = next;\n } else {\n parent.child = next;\n }\n node.parent = null;\n};\n\nconst firstChild = (node: SSRFiber) => node.child;\n\nconst nextSib = (node: SSRFiber) => node.next;\n\nexport function walkFiber(root: SSRFiber) {\n let point = root;\n let shouldSink = true;\n // 下沉\n sink: do {\n // begin 组装 HTML 起始部位\n if (point.type === 'root') {\n point.html = '';\n } else if (point.type === 'anchor') {\n point.html = `<!--${point.props.name}-->`;\n } else if (point.type === 'text') {\n const text = point.props.text;\n if (text != null) {\n point.html = escapeText(point.props.text);\n }\n }\n // dom 节点\n else {\n point.html = `<${point.type}`;\n const props = point.props;\n let text;\n\n for (const key in props) {\n const value = props[key];\n if (key.startsWith('on') || key === 'ref') continue;\n // html 被解析成了子节点,则不处理\n if (key === 'html') {\n continue;\n }\n if (key === 'text') {\n text = value;\n continue;\n }\n if (key === 'class') {\n if (value == null) continue;\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) {\n point.html += ` class=\"${escapeAttr(classStr)}\"`;\n }\n continue;\n }\n if (key === 'style') {\n if (value == null) continue;\n point.html += ` style=\"${escapeAttr(String(value))}\"`;\n continue;\n }\n // 4. 布尔属性\n if (BOOLEAN_ATTRS.has(key)) {\n if (value !== false && value !== null && value !== undefined) {\n point.html += ` ${key}`;\n }\n continue;\n }\n // 5. data-* / aria-* — 对齐 Browser:null 时不输出\n if (key.startsWith('data-') || key.startsWith('aria-')) {\n if (value == null) continue;\n point.html += ` ${key}=\"${escapeAttr(value)}\"`;\n continue;\n }\n // 6. 其余属性 — 对齐 Browser:null 时不输出\n if (value == null) continue;\n point.html += ` ${key}=\"${escapeAttr(value)}\"`;\n }\n // 纯 text(无 html children)→ 内联文本,闭合标签,不下沉\n if (text != null && props.html == null) {\n const content = escapeText(text);\n point.html += `>${content}</${point.type}>`;\n if (point.child) console.warn(`<${point.type}> has text content and child elements — children ignored`);\n shouldSink = false;\n } else {\n if (VOID_TAGS.has(point.type)) {\n point.html += `/>`;\n if (point.child) console.warn(`<${point.type}> can't have children`);\n shouldSink = false;\n } else {\n point.html += `>`;\n }\n }\n }\n\n if (point.child && shouldSink) {\n point = point.child;\n continue;\n }\n // 上浮\n do {\n const notRoot = point !== root;\n const notAnchor = point.type !== 'anchor';\n const notText = point.type !== 'text';\n /**\n * shouldSink == false 时会直接进入节点的 complete 且不会遍历子节点\n * 此时标签已闭合,complete 不需要重复处理\n */\n if (shouldSink && notRoot && notAnchor && notText) {\n point.html += `</${point.type}>`;\n }\n // 把子节点的字符串加入父节点\n if (notRoot) {\n point.parent.html += point.html;\n }\n // complete\n // 上浮到根,end\n shouldSink = true;\n if (!notRoot) break sink;\n // 有兄弟节点,停止上浮\n if (point.next) {\n point = point.next;\n break;\n }\n // 无兄弟节点,继续上浮\n point = point.parent;\n } while (true);\n } while (true);\n}\n\nexport const renderHtmlStr = (ComponentClass: typeof Store) => {\n const root = new SSRFiber('root');\n const render = customRender({\n createNode,\n setProp,\n insertAfter,\n createAnchor,\n remove,\n firstChild,\n nextSib,\n beforeIndent,\n noopEffect: true\n });\n render(ComponentClass, root);\n walkFiber(root);\n return root.html;\n};\n","import { customRender, Store } from 'bobe';\nimport {\n setProp,\n createNode as browserCreateNode,\n remove,\n firstChild,\n nextSib,\n CONTENT_FLAG\n} from './render';\n\n// ====== TreeCursor ======\n\n/**\n * SSR DOM 认领游标。\n *\n * 工作方式:\n * - 维护一个 `parent` 指针,始终指向\"当前容器\"。\n * - `findUnclaimed` 只在 `parent.firstChild` 中平铺搜索(只搜一层,不递归)。\n * - 认领过的节点放入 `claimed` WeakSet,同一次遍历不会重复认领。\n *\n * 典型调用(以 hydrate 测试为例):\n * container.innerHTML = ssrHtml; // <div id=\"app1\"><div>SSR...</div></div>\n * hydrate(Ctor, container);\n *\n * hydrate 内部:\n * cursor = new TreeCursor(rootEl.parentNode); // 光标起点 = container,即 <div id=\"app1\">\n * createNode('div') → findUnclaimed 搜 <div id=\"app1\"> 的直接子级 → 找到 rootEl → 认领 ✅\n * beforeIndent → enterChildren(rootEl) // 光标进入 rootEl\n * createNode('nav') → findUnclaimed 搜 rootEl 的直接子级 → 找到 SSR <nav> → 认领 ✅\n *\n * 关键约束:游标只在当前层级搜索。这就是为什么光标起点必须在 container 层——让 App 的\n * 外层 div 在 container 的子级中被认领,而不是在 <body> 层误将 #app 当 div 认领走。\n */\nclass TreeCursor {\n /** 当前搜索容器——findUnclaimed 在此节点的 firstChild 链上搜索 */\n private parent: Node;\n /** 已认领节点集合,防止 DOM 重排导致误认领 */\n private claimed = new WeakSet<Node>();\n /** 当前层级最后一个被认领的节点,搜索从 nextSibling 起跳,跳过已遍历节点 */\n private current: Node | null = null;\n\n constructor(container: Node) {\n this.parent = container;\n }\n\n /** 进入子节点:后续 findUnclaimed 搜 node 的直接子级 */\n enterChildren(node: Node) {\n this.parent = node;\n this.current = null;\n }\n\n /** 直接设置游标父级(用于 tp 等需要跳转到非树位置的场景) */\n setParent(node: Node) {\n this.parent = node;\n this.current = null;\n }\n\n /** 设置当前指针,后续 findUnclaimed 从 node.nextSibling 开始 */\n setCurrent(node: Node) {\n this.current = node;\n }\n\n /** 退出当前节点,回到父级,恢复游标位置 */\n leaveToParent(node: Node) {\n if (node === this.parent && this.parent.parentNode) {\n this.parent = this.parent.parentNode;\n this.current = node;\n }\n }\n\n /** 在 this.parent 的 firstChild 链上查找第一个满足条件的节点 */\n private findUnclaimed(predicate: (node: Node) => boolean): Node | null {\n // 指针起跳 + WeakSet 兜底:指针失效(DOM 重排)时 wrapped 扫描,WeakSet 防重认\n let node = this.current?.nextSibling || this.parent.firstChild;\n while (node) {\n if (!this.claimed.has(node) && predicate(node)) {\n this.claimed.add(node);\n this.current = node;\n return node;\n }\n node = node.nextSibling;\n }\n return null;\n }\n\n /** 认领一个未使用的元素节点(按 tagName 匹配) */\n tryClaimElement(tagName: string): Element | null {\n return this.findUnclaimed(\n (node) => node.nodeType === 1 && (node as Element).tagName.toLowerCase() === tagName\n ) as Element | null;\n }\n\n /** 认领一个未使用的注释节点(按注释内容匹配) */\n tryClaimComment(name: string): Comment | null {\n return this.findUnclaimed(\n (node) => node.nodeType === 8 && (node as Comment).data === name\n ) as Comment | null;\n }\n\n /** 认领一个未使用的文本节点(非空文本) */\n tryClaimText(): Text | null {\n return this.findUnclaimed(\n (node) => node.nodeType === 3 && !!(node.textContent?.trim())\n ) as Text | null;\n }\n}\n\n// ====== 回调 ======\n\nexport const hydrate = (ComponentClass: typeof Store, rootEl: Element) => {\n const cursor = new TreeCursor(rootEl);\n // 首屏 render 期间(含 flushMicroEffectManual 中的 for/if effect 首次执行)为 true\n // 后续响应式更新为 false,createNode/createAnchor 直接创建新节点\n let isFirstRender = true;\n\n // 首屏时 text/html 的 DOM 内容已由 SSR 生成,跳过 innerHTML/textContent 赋值避免重绘\n // 但仍需设 CONTENT_FLAG 保证 beforeIndent 冲突检测正常\n const hydrateSetProp = (node: Node, key: string, value: any) => {\n if (isFirstRender && (key === '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 // tp 节点进入 indent 时,将游标切入目标 DOM,使其子节点在正确位置认领\n const beforeLogicIndent = (node: any) => {\n if (isFirstRender && node.tpData) {\n const targetDom = node.tpData.node;\n if (targetDom) cursor.enterChildren(targetDom);\n }\n };\n\n const leaveLogicNode = (node: any, _isDedent: boolean) => {\n // tp 节点离开时,通过 realAfter 锚点找到模板父级 DOM 恢复游标\n if (isFirstRender && node.tpData) {\n const parentDom = node.realAfter?.parentNode;\n if (parentDom) {\n cursor.setParent(parentDom);\n // 后续认领从 tp-after 锚点之后开始\n if (node.realAfter) cursor.setCurrent(node.realAfter);\n }\n return;\n }\n if (isFirstRender) cursor.leaveToParent(node);\n };\n\n const render = customRender({\n createNode,\n setProp: hydrateSetProp,\n insertAfter,\n createAnchor,\n remove,\n firstChild,\n nextSib,\n beforeIndent,\n beforeLogicIndent,\n leaveNode,\n leaveLogicNode,\n // program() 遍历完模板后、flushMicroEffectManual 首次执行 effect 前切回首屏标志\n // 后续 for/if effect 中的 createNode 走浏览器新建路径,不再尝试从 SSR DOM 认领\n onBeforeFlush: () => {\n isFirstRender = false;\n }\n });\n\n return render(ComponentClass, rootEl);\n};\n"],"names":["BOOLEAN_ATTRS","Set","VALUE_PROP_TAGS","SVG_NS","MATH_NS","SVG_TAGS","MATH_TAGS","isNS","el","namespaceURI","createNode","name","document","createTextNode","has","createElementNS","createElement","CONTENT_FLAG","Symbol","setProp","node","key","value","textContent","startsWith","evtName","slice","addEventListener","removeEventListener","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","SSRNodeType","SSRFiber","next","child","html","openTagEnd","constructor","type","props","querySelector","selector","idMatch","match","id","classMatches","classes","c","replace","trim","walk","length","every","split","includes","getElementById","parseHtmlToFibers","root","stack","lastChild","append","frame","parserRef","parser","Parser","onparserinit","p","onopentag","attribs","fiber","endIndex","push","ontext","text","onclosetag","pop","top","prevSibling","write","end","VOID_TAGS","ATTR_RE","TEXT_RE","ATTR_MAP","TEXT_MAP","escapeAttr","s","test","m","escapeText","isBefore","walkFiber","point","shouldSink","sink","classStr","content","notRoot","notAnchor","notText","renderHtmlStr","ComponentClass","noopEffect","TreeCursor","claimed","WeakSet","current","container","enterChildren","setParent","setCurrent","leaveToParent","parentNode","findUnclaimed","predicate","add","tryClaimElement","nodeType","tryClaimComment","data","tryClaimText","hydrate","rootEl","cursor","isFirstRender","hydrateSetProp","browserCreateNode","expectedNext","beforeLogicIndent","tpData","targetDom","_isDedent","parentDom","realAfter","onBeforeFlush"],"mappings":"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"}
@@ -1,26 +1,215 @@
1
1
  'use strict';
2
2
 
3
3
  var marked = require('marked');
4
+ var path = require('path');
5
+ var fs = require('fs');
6
+ var hljs = require('highlight.js');
7
+
8
+ function highlight(code, lang) {
9
+ try {
10
+ return hljs.highlight(code, {
11
+ language: lang
12
+ }).value;
13
+ } catch {
14
+ return code.replace(/</g, '&lt;').replace(/>/g, '&gt;');
15
+ }
16
+ }
17
+ async function resolveImportTree(importPath, currentPath, vResolve, walked = new Set()) {
18
+ const resolved = await vResolve(importPath, currentPath);
19
+ const absPath = resolved?.id;
20
+ if (!absPath || absPath.includes('node_modules') || absPath.startsWith('\0') || walked.has(absPath)) {
21
+ return [];
22
+ }
23
+ walked.add(absPath);
24
+ let content = '';
25
+ try {
26
+ content = await fs.promises.readFile(absPath, 'utf-8');
27
+ } catch (error) {
28
+ console.warn(`Failed to read file: ${absPath}`);
29
+ }
30
+ if (!content) {
31
+ return [];
32
+ }
33
+ const langMap = {
34
+ ts: 'typescript',
35
+ tsx: 'typescript',
36
+ mts: 'typescript',
37
+ js: 'javascript',
38
+ jsx: 'javascript',
39
+ mjs: 'javascript',
40
+ css: 'css',
41
+ html: 'xml',
42
+ json: 'json'
43
+ };
44
+ const ext = path.extname(absPath).slice(1);
45
+ const lang = langMap[ext];
46
+ const item = {
47
+ path: absPath,
48
+ name: path.basename(absPath),
49
+ lang: lang,
50
+ html: lang ? highlight(content, lang) : content
51
+ };
52
+ const importRegex = /import\s+(?:[\w*\s{},]*\s+from\s+)?['"]([^'"]+)['"]/g;
53
+ let match;
54
+ const dependencies = [];
55
+ while ((match = importRegex.exec(content)) !== null) {
56
+ const importPath = match[1];
57
+ if (!importPath.startsWith('http')) {
58
+ dependencies.push(resolveImportTree(importPath, absPath, vResolve, walked));
59
+ }
60
+ }
61
+ if (!dependencies.length) {
62
+ return [item];
63
+ }
64
+ const deps = await Promise.all(dependencies);
65
+ return [item, ...deps.flat()];
66
+ }
67
+
68
+ function registerBobeLang() {
69
+ hljs.registerLanguage('bobe', hljs => {
70
+ const ATTRS = ['class', 'id', 'text', 'html', 'style', 'href', 'src', 'alt', 'title', 'ref', 'type', 'placeholder', 'value', 'name', 'foo', 'disabled', 'readonly', 'checked', 'selected', 'hidden', 'role', 'target', 'rel', 'width', 'height', 'tabindex', 'data-[\\w-]+', 'aria-[\\w-]+', 'onclick', 'oninput', 'onchange', 'onsubmit', 'onreset', 'onkeydown', 'onkeyup', 'onkeypress', 'onfocus', 'onblur', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseover', 'onmouseout', 'onload', 'onerror', 'onscroll', 'onresize', 'ondrag', 'ondragstart', 'ondragend', 'ondragover', 'ondrop', 'ontouchstart', 'ontouchend', 'ontouchmove'].join('|');
71
+ return {
72
+ name: 'bobe',
73
+ keywords: ['if', 'else', 'for', 'tp', 'context'],
74
+ contains: [hljs.COMMENT('#', '$', {
75
+ relevance: 0
76
+ }), {
77
+ className: 'template-substitution',
78
+ begin: /\$\{/,
79
+ end: /\}/,
80
+ contains: [{
81
+ begin: /\$\{/,
82
+ end: /\}/,
83
+ skip: true
84
+ }],
85
+ subLanguage: 'javascript'
86
+ }, {
87
+ className: 'template-substitution',
88
+ begin: /(?<==)\{/,
89
+ end: /\}/,
90
+ contains: [{
91
+ begin: /\{/,
92
+ end: /\}/,
93
+ skip: true
94
+ }],
95
+ subLanguage: 'javascript'
96
+ }, {
97
+ className: 'string',
98
+ begin: /"/,
99
+ end: /"/,
100
+ contains: [{
101
+ begin: /\$\{/,
102
+ end: /\}/,
103
+ subLanguage: 'javascript'
104
+ }]
105
+ }, {
106
+ className: 'selector-tag',
107
+ begin: /^[ \t]*(?!(?:if|else|for|tp)\b)[a-z][\w-]*(?:-[a-z][\w-]*)*\b/m,
108
+ relevance: 2
109
+ }, {
110
+ className: 'attr',
111
+ begin: new RegExp(`\\b(?:${ATTRS})\\b(?=\\s*=)`),
112
+ relevance: 1
113
+ }, {
114
+ className: 'attr',
115
+ begin: /\b(?:disabled|readonly|checked|selected|hidden)\b(?!\s*=)/,
116
+ relevance: 0
117
+ }, {
118
+ className: 'variable',
119
+ begin: /(?<=for\s+)\w+(?=\s*;)/,
120
+ relevance: 0
121
+ }, {
122
+ className: 'params',
123
+ begin: /(?<=for\s+\S+\s*;\s*)\w+/,
124
+ relevance: 0
125
+ }, {
126
+ className: 'params',
127
+ begin: /(?<=for\s+\S+\s*;\s*\w+\s+)\w+/,
128
+ relevance: 0
129
+ }, hljs.NUMBER_MODE]
130
+ };
131
+ });
132
+ function patchJsFamily(name) {
133
+ const fn = hljs.getLanguage(name)?.rawDefinition;
134
+ if (!fn) return;
135
+ const def = fn(hljs);
136
+ if (def.contains.some(c => c.begin?.toString?.().includes('bobe'))) return;
137
+ const SUBST = {
138
+ className: 'subst',
139
+ begin: /\$\{/,
140
+ end: /\}/,
141
+ keywords: def.keywords
142
+ };
143
+ def.contains.push({
144
+ begin: /\.?bobe`/,
145
+ end: '',
146
+ starts: {
147
+ end: '`',
148
+ returnEnd: false,
149
+ contains: [hljs.BACKSLASH_ESCAPE, SUBST],
150
+ subLanguage: 'bobe'
151
+ }
152
+ });
153
+ hljs.registerLanguage(name, () => def);
154
+ }
155
+ patchJsFamily('javascript');
156
+ patchJsFamily('typescript');
157
+ }
4
158
 
5
159
  function esc(s) {
6
160
  return s.replace(/\\/g, '\\\\').replace(/`/g, '\\`').replace(/\$/g, '\\$');
7
161
  }
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;
162
+ function gen(html, headers, previewEntries, codeTrees = []) {
163
+ const hasCode = codeTrees.length > 0;
164
+ const lines = [`import { bobe, Store } from 'bobe';`];
165
+ if (hasCode) {
166
+ lines.push(`import Code from 'bobe-dom/plugin-markdown/code';`);
167
+ previewEntries.forEach((src, i) => {
168
+ lines.push(`import $Bobe_Comp_${i} from '${src}';`);
169
+ });
170
+ }
171
+ lines.push(`const mdHtml = \`${esc(html)}\`;`);
172
+ if (hasCode) {
173
+ for (let i = 0; i < codeTrees.length; i++) {
174
+ lines.push(`const codeTree${i} = ${JSON.stringify(codeTrees[i])};`);
175
+ }
176
+ }
177
+ lines.push(`class Markdown extends Store {`);
178
+ lines.push(` mdRef = null;`);
179
+ lines.push(` ui = bobe\``);
180
+ lines.push(` div class="markdown" style="display: flex;"`);
181
+ lines.push(` main ref={mdRef} class="markdown-body" style="overflow-y: auto;" html=\${mdHtml}`);
182
+ lines.push(` if showAside`);
183
+ lines.push(` div class="markdown-aside" style="flex: none; display: flex; flex-direction: column; overflow-y: auto;"`);
184
+ for (const _ref of headers) {
185
+ const depth = _ref.depth;
186
+ const id = _ref.id;
187
+ const text = _ref.text;
188
+ lines.push(` a href="#${id}" text="${esc(text)}" class="markdown-aside-item markdown-aside-depth-${depth}"`);
189
+ }
190
+ if (hasCode) {
191
+ for (let i = 0; i < codeTrees.length; i++) {
192
+ const previewProp = previewEntries[i] ? `preview=\${() => $Bobe_Comp_${i}}` : '';
193
+ lines.push(` tp node={mdRef?.querySelector?.('#code-${i}')}`);
194
+ lines.push(` \${Code} files=\${codeTree${i}} ${previewProp}`);
195
+ }
196
+ }
197
+ lines.push(` \`;`);
198
+ lines.push(`}`);
199
+ lines.push(`export default Markdown;`);
200
+ return lines.join('\n');
17
201
  }
202
+ const CODE_TAG_RE = /<code\s+src="([^"]+)"(\s+preview)?\s*\/>/g;
18
203
  function markdownPlugin(opt = {}) {
19
204
  let headers = [];
205
+ const headClassMap = {
206
+ '1': 'cyber-title'
207
+ };
20
208
  return {
21
209
  name: 'bobe-markdown',
22
210
  enforce: 'pre',
23
211
  configResolved() {
212
+ registerBobeLang();
24
213
  marked.marked.use({
25
214
  gfm: true,
26
215
  renderer: {
@@ -29,27 +218,47 @@ function markdownPlugin(opt = {}) {
29
218
  depth
30
219
  }) {
31
220
  const text = this.parser.parseInline(tokens);
32
- const id = text.toLowerCase().replace(/[^\w\u4e00-\u9fff]+/g, '-');
33
- if (depth <= opt.asideDeep || 3) {
221
+ const id = text.toLowerCase().replace(/[^\w一-鿿]+/g, '-');
222
+ if (depth <= (opt.asideDeep || 3)) {
34
223
  headers.push({
35
224
  depth,
36
225
  id,
37
226
  text
38
227
  });
39
228
  }
40
- return `<h${depth} id="${id}">${text}</h${depth}>`;
229
+ return `<h${depth} class="${headClassMap[depth]}" data-text="${text}" id="${id}">${text}</h${depth}>`;
230
+ },
231
+ code({
232
+ text,
233
+ lang
234
+ }) {
235
+ return `<pre><code class="hljs">${hljs.highlight(text, {
236
+ language: lang
237
+ }).value}</code></pre>`;
41
238
  }
42
239
  }
43
240
  });
44
241
  if (opt.marked) marked.marked.use(opt.marked);
45
242
  },
46
- transform(code, id) {
243
+ async transform(code, id) {
47
244
  if (!id.match(/\.mdx?$/)) return;
48
245
  headers = [];
49
246
  try {
50
247
  const html = marked.marked.parse(code);
248
+ const codeTags = [];
249
+ const previewEntries = [];
250
+ let idx = 0;
251
+ const finalHtml = html.replace(CODE_TAG_RE, (_, src, preview) => {
252
+ codeTags.push(src);
253
+ if (preview) {
254
+ previewEntries[idx] = src;
255
+ }
256
+ return `<div id="code-${idx++}"></div>`;
257
+ });
258
+ const fileDir = path.dirname(id);
259
+ const codeTrees = await Promise.all(codeTags.map(tag => resolveImportTree(path.resolve(fileDir, tag), id, this.resolve.bind(this))));
51
260
  return {
52
- code: gen(html, headers),
261
+ code: gen(finalHtml, headers, previewEntries, codeTrees),
53
262
  moduleSideEffects: false
54
263
  };
55
264
  } catch (e) {
@@ -1 +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;;;;"}
1
+ {"version":3,"file":"markdown.cjs.js","sources":["../src/plugins/markdown/my-resolve.ts","../src/plugins/markdown/components/bobe-lang.ts","../src/plugins/markdown/index.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport hljs from 'highlight.js';\nfunction highlight(code: string, lang: string): string {\n try {\n return hljs.highlight(code, { language: lang }).value;\n } catch {\n return code.replace(/</g, '&lt;').replace(/>/g, '&gt;');\n }\n}\n\ntype ResolveFn = (id: string, importer?: string) => Promise<{ id: string } | null>;\nexport type FileItem = {\n path: string;\n name: string;\n lang: string;\n html: string;\n};\nexport async function resolveImportTree(\n importPath: string,\n currentPath: string,\n vResolve: ResolveFn,\n walked = new Set<string>()\n): Promise<FileItem[]> {\n const resolved = await vResolve(importPath, currentPath);\n const absPath = resolved?.id;\n\n if (!absPath || absPath.includes('node_modules') || absPath.startsWith('\\0') || walked.has(absPath)) {\n return [];\n }\n\n walked.add(absPath);\n\n let content = '';\n try {\n content = await fs.promises.readFile(absPath, 'utf-8');\n } catch (error) {\n console.warn(`Failed to read file: ${absPath}`);\n }\n if (!content) {\n return [];\n }\n\n const langMap: Record<string, string> = {\n ts: 'typescript',\n tsx: 'typescript',\n mts: 'typescript',\n js: 'javascript',\n jsx: 'javascript',\n mjs: 'javascript',\n css: 'css',\n html: 'xml',\n json: 'json'\n };\n const ext = path.extname(absPath).slice(1);\n const lang = langMap[ext];\n\n const item: FileItem = {\n path: absPath,\n name: path.basename(absPath),\n lang: lang,\n // html: highlight(content, lang)\n html: lang ? highlight(content, lang) : content\n };\n\n // 4. 正则匹配出文件中的静态 import 语句\n const importRegex = /import\\s+(?:[\\w*\\s{},]*\\s+from\\s+)?['\"]([^'\"]+)['\"]/g;\n let match: RegExpExecArray | null;\n const dependencies: Promise<FileItem[]>[] = [];\n\n while ((match = importRegex.exec(content)) !== null) {\n const importPath = match[1];\n // 排除绝对路径网络请求(如 https://)\n if (!importPath.startsWith('http')) {\n dependencies.push(resolveImportTree(importPath, absPath, vResolve, walked));\n }\n }\n if (!dependencies.length) {\n return [item];\n }\n const deps = await Promise.all(dependencies);\n return [item, ...deps.flat()];\n}\n","import hljs, { Language } from 'highlight.js';\n\n/**\n * 注册 bobe DSL 语法高亮。\n *\n * 1. 注册 `bobe` 独立语言(用于 markdown 中 ```bobe 代码块)\n * 2. 给 JavaScript grammar 打补丁,让 `bobe`...`` 标签模板被 TS/JS 代码块自动识别\n *\n * bobe 采用类似 Pug 的缩进风格,语法要素:\n * - 元素标签:div, span, h1-h6, a, p, ul, li, button, input ...\n * - 属性:class=\"...\", id=\"...\", text=\"...\", onclick={...}, ref={...}\n * - 控制流:if, else, for, tp\n * - 响应式绑定:{expr}\n * - 模板插值:${expr}\n * - 字符串:\"hello\"\n * - 注释:# comment\n */\nexport function registerBobeLang() {\n // ================================================================\n // Part 1: 注册 bobe 独立语言\n // ================================================================\n hljs.registerLanguage('bobe', (hljs) => {\n // 属性名列表(含事件处理器和布尔属性)\n const ATTRS = [\n 'class', 'id', 'text', 'html', 'style', 'href', 'src', 'alt', 'title',\n 'ref', 'type', 'placeholder', 'value', 'name', 'foo',\n 'disabled', 'readonly', 'checked', 'selected', 'hidden',\n 'role', 'target', 'rel', 'width', 'height', 'tabindex',\n 'data-[\\\\w-]+', 'aria-[\\\\w-]+',\n 'onclick', 'oninput', 'onchange', 'onsubmit', 'onreset',\n 'onkeydown', 'onkeyup', 'onkeypress',\n 'onfocus', 'onblur', 'onmouseenter', 'onmouseleave',\n 'onmousemove', 'onmouseover', 'onmouseout',\n 'onload', 'onerror', 'onscroll', 'onresize',\n 'ondrag', 'ondragstart', 'ondragend', 'ondragover', 'ondrop',\n 'ontouchstart', 'ontouchend', 'ontouchmove',\n ].join('|');\n\n return {\n name: 'bobe',\n // keywords: {\n // $pattern: /\\b(if|else|for|tp)\\b/,\n // keyword: 'if else for tp'\n // },\n keywords: ['if','else','for','tp','context'],\n contains: [\n // ----------------------------------------------------------\n // 1. 行注释 — # 到行尾\n // ----------------------------------------------------------\n hljs.COMMENT('#', '$', { relevance: 0 }),\n\n // ----------------------------------------------------------\n // 2. 模板插值 ${expr} — bobe 组件/表达式嵌入\n // ----------------------------------------------------------\n {\n className: 'template-substitution',\n begin: /\\$\\{/,\n end: /\\}/,\n contains: [\n { begin: /\\$\\{/, end: /\\}/, skip: true },\n ],\n subLanguage: 'javascript',\n },\n\n // ----------------------------------------------------------\n // 3. 响应式绑定 {expr} — 跟在 = 后面(不含 $)\n // ----------------------------------------------------------\n {\n className: 'template-substitution',\n begin: /(?<==)\\{/,\n end: /\\}/,\n contains: [\n { begin: /\\{/, end: /\\}/, skip: true },\n ],\n subLanguage: 'javascript',\n },\n\n // ----------------------------------------------------------\n // 4. 双引号字符串 — 内部可含 ${} 插值\n // ----------------------------------------------------------\n {\n className: 'string',\n begin: /\"/,\n end: /\"/,\n contains: [\n {\n begin: /\\$\\{/,\n end: /\\}/,\n subLanguage: 'javascript',\n }\n ]\n },\n\n // ----------------------------------------------------------\n // 5. 元素标签 — 行首缩进后的第一个标识符(排除关键字)\n // 泛化匹配:bobe 缩进语法中每行首个标识符必是标签或关键字\n // ----------------------------------------------------------\n {\n className: 'selector-tag',\n begin: /^[ \\t]*(?!(?:if|else|for|tp)\\b)[a-z][\\w-]*(?:-[a-z][\\w-]*)*\\b/m,\n relevance: 2,\n },\n\n // ----------------------------------------------------------\n // 6. 属性名 — key=value 形式\n // ----------------------------------------------------------\n {\n className: 'attr',\n begin: new RegExp(`\\\\b(?:${ATTRS})\\\\b(?=\\\\s*=)`),\n relevance: 1,\n },\n\n // ----------------------------------------------------------\n // 7. 布尔属性 — 独立出现,不跟 =\n // ----------------------------------------------------------\n {\n className: 'attr',\n begin: /\\b(?:disabled|readonly|checked|selected|hidden)\\b(?!\\s*=)/,\n relevance: 0,\n },\n\n // ----------------------------------------------------------\n // 8. for 循环变量 — for items; item i\n // ----------------------------------------------------------\n {\n className: 'variable',\n begin: /(?<=for\\s+)\\w+(?=\\s*;)/,\n relevance: 0,\n },\n {\n className: 'params',\n begin: /(?<=for\\s+\\S+\\s*;\\s*)\\w+/,\n relevance: 0,\n },\n {\n className: 'params',\n begin: /(?<=for\\s+\\S+\\s*;\\s*\\w+\\s+)\\w+/,\n relevance: 0,\n },\n\n // ----------------------------------------------------------\n // 9. 数字字面量\n // ----------------------------------------------------------\n hljs.NUMBER_MODE,\n ]\n } as Language;\n });\n\n // ================================================================\n // Part 2: 给 JS-family grammars 打补丁,让 `bobe`...`` 标签模板被识别\n // ================================================================\n function patchJsFamily(name: string) {\n const fn = (hljs.getLanguage(name) as any)?.rawDefinition as\n | ((hljs: any) => any)\n | undefined;\n if (!fn) return;\n\n const def = fn(hljs);\n\n // 避免重复注册\n if (def.contains.some((c: any) =>\n c.begin?.toString?.().includes('bobe')\n )) return;\n\n // 复刻该 grammar 的 keywords(用于 SUBST 中的 JS 表达式高亮)\n const SUBST = {\n className: 'subst',\n begin: /\\$\\{/,\n end: /\\}/,\n keywords: def.keywords,\n };\n\n def.contains.push({\n begin: /\\.?bobe`/, // 匹配 bobe` 或 .bobe`\n end: '',\n starts: {\n end: '`',\n returnEnd: false,\n contains: [hljs.BACKSLASH_ESCAPE, SUBST],\n subLanguage: 'bobe',\n },\n });\n\n hljs.registerLanguage(name, () => def);\n }\n\n patchJsFamily('javascript');\n patchJsFamily('typescript');\n}\n","import type { Plugin } from 'vite';\nimport type { MarkedExtension } from 'marked';\nimport { marked } from 'marked';\nimport { resolve, dirname } from 'path';\nimport { FileItem, resolveImportTree } from './my-resolve';\nimport hljs from 'highlight.js';\nimport { registerBobeLang } from './components/bobe-lang';\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[], previewEntries: string[], codeTrees: FileItem[][] = []): string {\n const hasCode = codeTrees.length > 0;\n const lines = [`import { bobe, Store } from 'bobe';`];\n\n if (hasCode) {\n lines.push(`import Code from 'bobe-dom/plugin-markdown/code';`);\n previewEntries.forEach((src, i) => {\n lines.push(`import $Bobe_Comp_${i} from '${src}';`);\n });\n }\n\n lines.push(`const mdHtml = \\`${esc(html)}\\`;`);\n\n // 代码树数据\n if (hasCode) {\n for (let i = 0; i < codeTrees.length; i++) {\n lines.push(`const codeTree${i} = ${JSON.stringify(codeTrees[i])};`);\n }\n }\n\n // Markdown Store 组件\n lines.push(`class Markdown extends Store {`);\n lines.push(` mdRef = null;`);\n lines.push(` ui = bobe\\``);\n lines.push(` div class=\"markdown\" style=\"display: flex;\"`);\n lines.push(` main ref={mdRef} class=\"markdown-body\" style=\"overflow-y: auto;\" html=\\${mdHtml}`);\n lines.push(` if showAside`);\n lines.push(` div class=\"markdown-aside\" style=\"flex: none; display: flex; flex-direction: column; overflow-y: auto;\"`);\n for (const { depth, id, text } of headers) {\n lines.push(\n ` a href=\"#${id}\" text=\"${esc(text)}\" class=\"markdown-aside-item markdown-aside-depth-${depth}\"`\n );\n }\n // tp + Code 组件\n if (hasCode) {\n for (let i = 0; i < codeTrees.length; i++) {\n const previewProp = previewEntries[i] ? `preview=\\${() => $Bobe_Comp_${i}}` : '';\n lines.push(` tp node={mdRef?.querySelector?.('#code-${i}')}`);\n lines.push(` \\${Code} files=\\${codeTree${i}} ${previewProp}`);\n }\n }\n lines.push(` \\`;`);\n lines.push(`}`);\n lines.push(`export default Markdown;`);\n return lines.join('\\n');\n}\n\n/**\n * bobe-markdown Vite 插件。\n *\n * 将 .md / .mdx 文件编译为 bobe 组件:\n * import Readme from './README.md';\n *\n * 支持 <code src=\"xxx.ts\" /> 引入代码文件及 import 树(非 node_modules),\n * 以 Code 组件 + tp 传送方式渲染。\n */\n\nexport type HeadItem = {\n depth: number;\n id: string;\n text: string;\n};\n\nconst CODE_TAG_RE = /<code\\s+src=\"([^\"]+)\"(\\s+preview)?\\s*\\/>/g;\n\nexport default function markdownPlugin(opt: MarkdownPluginOptions = {}): Plugin {\n let headers: HeadItem[] = [];\n const headClassMap = {\n '1': 'cyber-title'\n }\n return {\n name: 'bobe-markdown',\n enforce: 'pre',\n\n configResolved() {\n registerBobeLang(); // 注册 bobe DSL 语法高亮(支持 markdown 中的 ```bobe 代码块)\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一-鿿]+/g, '-');\n if (depth <= (opt.asideDeep || 3)) {\n headers.push({ depth, id, text });\n }\n return `<h${depth} class=\"${headClassMap[depth]}\" data-text=\"${text}\" id=\"${id}\">${text}</h${depth}>`;\n },\n code({ text, lang }) {\n return `<pre><code class=\"hljs\">${hljs.highlight(text, { language: lang }).value}</code></pre>`;\n }\n }\n });\n if (opt.marked) marked.use(opt.marked);\n },\n\n async transform(code, id) {\n if (!id.match(/\\.mdx?$/)) return;\n headers = [];\n try {\n const html = marked.parse(code) as string;\n\n // 匹配 <code src=\"xxx.ts\"> → <div id=\"code-N\">\n const codeTags: string[] = [];\n const previewEntries: string[] = [];\n let idx = 0;\n const finalHtml = html.replace(CODE_TAG_RE, (_, src, preview) => {\n codeTags.push(src);\n if (preview) {\n previewEntries[idx] = src;\n }\n return `<div id=\"code-${idx++}\"></div>`;\n });\n\n // 解析每个 code block 的 import 树\n const fileDir = dirname(id);\n const codeTrees = await Promise.all(\n codeTags.map(tag => resolveImportTree(resolve(fileDir, tag), id, this.resolve.bind(this)))\n );\n\n return { code: gen(finalHtml, headers, previewEntries, codeTrees), moduleSideEffects: false };\n } catch (e: any) {\n this.error(`[bobe-markdown] 解析失败: ${id}\\n${e.message}`);\n }\n }\n };\n}\n"],"names":["highlight","code","lang","hljs","language","value","replace","resolveImportTree","importPath","currentPath","vResolve","walked","Set","resolved","absPath","id","includes","startsWith","has","add","content","fs","promises","readFile","error","console","warn","langMap","ts","tsx","mts","js","jsx","mjs","css","html","json","ext","path","extname","slice","item","name","basename","importRegex","match","dependencies","exec","push","length","deps","Promise","all","flat","registerBobeLang","registerLanguage","ATTRS","join","keywords","contains","COMMENT","relevance","className","begin","end","skip","subLanguage","RegExp","NUMBER_MODE","patchJsFamily","fn","getLanguage","rawDefinition","def","some","c","toString","SUBST","starts","returnEnd","BACKSLASH_ESCAPE","esc","s","gen","headers","previewEntries","codeTrees","hasCode","lines","forEach","src","i","JSON","stringify","_ref","depth","text","previewProp","CODE_TAG_RE","markdownPlugin","opt","headClassMap","enforce","configResolved","marked","use","gfm","renderer","heading","tokens","parser","parseInline","toLowerCase","asideDeep","transform","parse","codeTags","idx","finalHtml","_","preview","fileDir","dirname","map","tag","resolve","bind","moduleSideEffects","e","message"],"mappings":"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"}
@@ -12,6 +12,9 @@ interface MarkdownPluginOptions {
12
12
  *
13
13
  * 将 .md / .mdx 文件编译为 bobe 组件:
14
14
  * import Readme from './README.md';
15
+ *
16
+ * 支持 <code src="xxx.ts" /> 引入代码文件及 import 树(非 node_modules),
17
+ * 以 Code 组件 + tp 传送方式渲染。
15
18
  */
16
19
  type HeadItem = {
17
20
  depth: number;