@lytjs/renderer 5.0.1 → 6.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/README.md +371 -204
  2. package/dist/dom.cjs +12 -1
  3. package/dist/dom.cjs.map +1 -0
  4. package/dist/dom.d.cts +1 -0
  5. package/dist/dom.d.ts +1 -0
  6. package/dist/dom.mjs +3 -1
  7. package/dist/dom.mjs.map +1 -0
  8. package/dist/index.cjs +3324 -1
  9. package/dist/index.cjs.map +1 -0
  10. package/dist/index.d.cts +965 -0
  11. package/dist/index.d.ts +965 -0
  12. package/dist/index.mjs +3202 -1
  13. package/dist/index.mjs.map +1 -0
  14. package/dist/ssr.cjs +310 -1
  15. package/dist/ssr.cjs.map +1 -0
  16. package/dist/ssr.d.cts +21 -0
  17. package/dist/ssr.d.ts +21 -0
  18. package/dist/ssr.mjs +308 -1
  19. package/dist/ssr.mjs.map +1 -0
  20. package/dist/vapor/vapor-app.cjs +334 -0
  21. package/dist/vapor/vapor-app.cjs.map +1 -0
  22. package/dist/vapor/vapor-app.d.cts +88 -0
  23. package/dist/vapor/vapor-app.d.ts +88 -0
  24. package/dist/vapor/vapor-app.mjs +330 -0
  25. package/dist/vapor/vapor-app.mjs.map +1 -0
  26. package/package.json +43 -56
  27. package/dist/miniapp.cjs +0 -27
  28. package/dist/miniapp.mjs +0 -27
  29. package/dist/native.cjs +0 -1
  30. package/dist/native.mjs +0 -1
  31. package/dist/types/create-renderer.d.ts +0 -20
  32. package/dist/types/create-renderer.d.ts.map +0 -1
  33. package/dist/types/dom/dom-ops.d.ts +0 -74
  34. package/dist/types/dom/dom-ops.d.ts.map +0 -1
  35. package/dist/types/dom/dom-renderer.d.ts +0 -243
  36. package/dist/types/dom/dom-renderer.d.ts.map +0 -1
  37. package/dist/types/dom/index.d.ts +0 -17
  38. package/dist/types/dom/index.d.ts.map +0 -1
  39. package/dist/types/dom/patch-events.d.ts +0 -123
  40. package/dist/types/dom/patch-events.d.ts.map +0 -1
  41. package/dist/types/dom/patch-props.d.ts +0 -118
  42. package/dist/types/dom/patch-props.d.ts.map +0 -1
  43. package/dist/types/index.d.ts +0 -36
  44. package/dist/types/index.d.ts.map +0 -1
  45. package/dist/types/miniapp/api-adapter.d.ts +0 -514
  46. package/dist/types/miniapp/api-adapter.d.ts.map +0 -1
  47. package/dist/types/miniapp/index.d.ts +0 -34
  48. package/dist/types/miniapp/index.d.ts.map +0 -1
  49. package/dist/types/miniapp/miniapp-compiler.d.ts +0 -269
  50. package/dist/types/miniapp/miniapp-compiler.d.ts.map +0 -1
  51. package/dist/types/miniapp/miniapp-event-bridge.d.ts +0 -255
  52. package/dist/types/miniapp/miniapp-event-bridge.d.ts.map +0 -1
  53. package/dist/types/miniapp/miniapp-lifecycle.d.ts +0 -224
  54. package/dist/types/miniapp/miniapp-lifecycle.d.ts.map +0 -1
  55. package/dist/types/miniapp/miniapp-renderer.d.ts +0 -269
  56. package/dist/types/miniapp/miniapp-renderer.d.ts.map +0 -1
  57. package/dist/types/miniapp/miniapp-utils.d.ts +0 -168
  58. package/dist/types/miniapp/miniapp-utils.d.ts.map +0 -1
  59. package/dist/types/miniapp/shared-constants.d.ts +0 -28
  60. package/dist/types/miniapp/shared-constants.d.ts.map +0 -1
  61. package/dist/types/miniapp/style-compiler.d.ts +0 -193
  62. package/dist/types/miniapp/style-compiler.d.ts.map +0 -1
  63. package/dist/types/mount.d.ts +0 -32
  64. package/dist/types/mount.d.ts.map +0 -1
  65. package/dist/types/native/index.d.ts +0 -13
  66. package/dist/types/native/index.d.ts.map +0 -1
  67. package/dist/types/native/native-renderer.d.ts +0 -249
  68. package/dist/types/native/native-renderer.d.ts.map +0 -1
  69. package/dist/types/patch.d.ts +0 -23
  70. package/dist/types/patch.d.ts.map +0 -1
  71. package/dist/types/props.d.ts +0 -19
  72. package/dist/types/props.d.ts.map +0 -1
  73. package/dist/types/renderer-interfaces.d.ts +0 -157
  74. package/dist/types/renderer-interfaces.d.ts.map +0 -1
  75. package/dist/types/shared/abstract-renderer.d.ts +0 -74
  76. package/dist/types/shared/abstract-renderer.d.ts.map +0 -1
  77. package/dist/types/ssr/hydration.d.ts +0 -267
  78. package/dist/types/ssr/hydration.d.ts.map +0 -1
  79. package/dist/types/ssr/index.d.ts +0 -15
  80. package/dist/types/ssr/index.d.ts.map +0 -1
  81. package/dist/types/ssr/ssr-renderer.d.ts +0 -277
  82. package/dist/types/ssr/ssr-renderer.d.ts.map +0 -1
  83. package/dist/types/unmount.d.ts +0 -16
  84. package/dist/types/unmount.d.ts.map +0 -1
  85. package/dist/types/vapor/index.d.ts +0 -18
  86. package/dist/types/vapor/index.d.ts.map +0 -1
  87. package/dist/types/vapor/vapor-compiler.d.ts +0 -76
  88. package/dist/types/vapor/vapor-compiler.d.ts.map +0 -1
  89. package/dist/types/vapor/vapor-component.d.ts +0 -55
  90. package/dist/types/vapor/vapor-component.d.ts.map +0 -1
  91. package/dist/types/vapor/vapor-reactive.d.ts +0 -133
  92. package/dist/types/vapor/vapor-reactive.d.ts.map +0 -1
  93. package/dist/types/vapor/vapor-renderer.d.ts +0 -135
  94. package/dist/types/vapor/vapor-renderer.d.ts.map +0 -1
  95. package/dist/types/vnode.d.ts +0 -203
  96. package/dist/types/vnode.d.ts.map +0 -1
  97. package/dist/vapor.cjs +0 -1
  98. package/dist/vapor.mjs +0 -1
package/dist/ssr.cjs CHANGED
@@ -1 +1,310 @@
1
- "use strict";var U=Object.defineProperty;var ve=Object.getOwnPropertyDescriptor;var ke=Object.getOwnPropertyNames;var De=Object.prototype.hasOwnProperty;var Pe=(t,e)=>{for(var n in e)U(t,n,{get:e[n],enumerable:!0})},je=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of ke(e))!De.call(t,o)&&o!==n&&U(t,o,{get:()=>e[o],enumerable:!(r=ve(e,o))||r.enumerable});return t};var Fe=t=>je(U({},"__esModule",{value:!0}),t);var bt={};Pe(bt,{Comment:()=>X,Fragment:()=>Y,PatchFlags:()=>M,ShapeFlags:()=>C,StringRenderer:()=>_,Text:()=>z,clearIslandRegistry:()=>Ie,clearMismatchWarnings:()=>we,createHydrationIsland:()=>Oe,createRenderer:()=>pe,getHydrateStats:()=>Ee,getIslandRegistry:()=>Me,getMismatchWarnings:()=>$e,hydrate:()=>Ce,hydrateAllIslands:()=>Ae,hydrateIsland:()=>le,isHydrating:()=>Le,onHydrated:()=>be,registerIslandComponent:()=>xe,renderToStream:()=>he,renderToStreamGenerator:()=>Ne,renderToString:()=>ge,resetHydrateStats:()=>ie,setHydrating:()=>Ve,ssrRenderer:()=>Te,unmountIsland:()=>_e});module.exports=Fe(bt);var me=require("@lytjs/vdom");var C=(i=>(i[i.ELEMENT=1]="ELEMENT",i[i.FUNCTIONAL_COMPONENT=2]="FUNCTIONAL_COMPONENT",i[i.STATEFUL_COMPONENT=4]="STATEFUL_COMPONENT",i[i.TEXT_CHILDREN=8]="TEXT_CHILDREN",i[i.ARRAY_CHILDREN=16]="ARRAY_CHILDREN",i[i.SLOTS_CHILDREN=32]="SLOTS_CHILDREN",i))(C||{}),M=(u=>(u[u.TEXT=1]="TEXT",u[u.CLASS=2]="CLASS",u[u.STYLE=4]="STYLE",u[u.PROPS=8]="PROPS",u[u.FULL_PROPS=16]="FULL_PROPS",u[u.STABLE_FRAGMENT=32]="STABLE_FRAGMENT",u[u.KEYED_FRAGMENT=64]="KEYED_FRAGMENT",u[u.UNKEYED_FRAGMENT=128]="UNKEYED_FRAGMENT",u[u.NEED_PATCH=256]="NEED_PATCH",u[u.DYNAMIC_SLOTS=512]="DYNAMIC_SLOTS",u[u.HOISTED=-1]="HOISTED",u[u.BAIL=-2]="BAIL",u))(M||{}),Y=Symbol("Fragment"),z=Symbol("Text"),X=Symbol("Comment");function R(t){return t.type===Y}function I(t){return t.type===z}function O(t){return t.type===X}function de(t,e){return t.type===e.type&&t.key===e.key}function q(t){return Array.isArray(t.dynamicChildren)}function ue(t,e,n,r){if(n==="class")t.setClass(e,r);else if(n==="style")t.setStyle(e,r);else if(n.startsWith("on")||n.startsWith("@")){let o=n.startsWith("@")?n.slice(1).toLowerCase():n.slice(2).toLowerCase();t.addEventListener(e,o,r)}else n==="key"||n==="ref"||t.setAttribute(e,n,r)}function B(t,e,n,r,o){if(n==="class")t.setClass(e,r);else if(n==="style")t.setStyle(e,r||{});else if(n.startsWith("on")||n.startsWith("@")){let s=n.startsWith("@")?n.slice(1).toLowerCase():n.slice(2).toLowerCase();o&&t.removeEventListener(e,s,o),r&&t.addEventListener(e,s,r)}else t.setAttribute(e,n,r)}function J(t,e,n,r){for(let o in r){if(o==="key"||o==="ref")continue;let s=n[o],i=r[o];i!==s&&B(t,e,o,i,s)}for(let o in n)if(!(o==="key"||o==="ref")&&!(o in r))if(o==="class")t.setClass(e,"");else if(o==="style")t.setStyle(e,{});else if(o.startsWith("on")||o.startsWith("@")){let s=o.startsWith("@")?o.slice(1).toLowerCase():o.slice(2).toLowerCase();t.removeEventListener(e,s,n[o])}else t.removeAttribute(e,o)}function K(t,e,n,r,o,s){let{shapeFlag:i}=n;if(R(n)){Ge(t,e,n,r,o,s);return}if(I(n)){let a=t.createText(n.children);n.el=a,t.insert(r,a,o);return}if(O(n)){let a=t.createComment(n.children);n.el=a,t.insert(r,a,o);return}if(i&1){We(t,e,n,r,o,s);return}if(i&6){Ue(e,n,r,o,s);return}}function We(t,e,n,r,o,s){let i=n.type,a=t.createElement(i);if(n.el=a,n.props)for(let d in n.props){let f=n.props[d];ue(t,a,d,f)}let{shapeFlag:l,children:c}=n;l&8?a.textContent=c:l&16&&$(e,c,a,null,s),t.insert(r,a,o)}function $(t,e,n,r,o){for(let s=0;s<e.length;s++)t(null,e[s],n,r,o)}function Ge(t,e,n,r,o,s){let{children:i}=n,a=t.createComment("");t.insert(r,a,o),Array.isArray(i)&&i.length>0&&$(e,i,r,a,s),n.el=a,n.anchor=a}function Ue(t,e,n,r,o){let s=e.component;s&&s.update&&s.update(),s&&s.subTree&&(t(null,s.subTree,n,r,s),e.el=s.subTree.el)}function ye(t,e,n,r){let{shapeFlag:o,children:s}=n;if(R(n)){if(Array.isArray(s))for(let i=0;i<s.length;i++)e(s[i],r);n.anchor&&n.anchor.parentNode&&t.remove(n.anchor);return}if(o&6){n.component&&n.component.subTree&&e(n.component.subTree,r);return}n.el&&t.remove(n.el)}function w(t,e){for(let n=0;n<e.length;n++)t(e[n])}var v=require("@lytjs/vdom");function k(t,e,n,r,o,s=null,i=null){if(r==null){n&&e(n,o);return}if(n===null){K(t,Q(t,e),r,o,s,i);return}if(q(r)&&q(n)){qe(t,e,n,r,o,i);return}if(!de(n,r)){e(n,o),K(t,Q(t,e),r,o,s,i);return}r.el=n.el,r.anchor=n.anchor;let{shapeFlag:a}=r;if(R(r)){Xe(t,e,n,r,o,s,i);return}if(I(r)){r.children!==n.children&&(r.el.nodeValue=r.children);return}if(O(r)){r.children!==n.children&&(r.el.nodeValue=r.children);return}if(a&1){Ye(t,e,n,r,i);return}if(a&6){Be(n,r,i);return}}function Q(t,e){return(n,r,o,s,i)=>{k(t,e,n,r,o,s,i)}}function Ye(t,e,n,r,o=null){let s=r.el=n.el,i=n.props||{},a=r.props||{},{patchFlag:l,dynamicProps:c}=r;if(l&&l>0){if(l&1&&n.children!==r.children&&(s.textContent=r.children),l&2&&i.class!==a.class&&t.setClass(s,a.class),l&4&&i.style!==a.style&&t.setStyle(s,a.style||{}),l&8&&c)for(let d=0;d<c.length;d++){let f=c[d],u=i[f],N=a[f];N!==u&&B(t,s,f,N,u)}l&16&&J(t,s,i,a)}else J(t,s,i,a);(!l||!(l&1))&&fe(t,e,n,r,s,null,o)}function fe(t,e,n,r,o,s,i){let a=n.shapeFlag,l=r.shapeFlag,c=n.children,d=r.children;if(l&8){a&16&&w(e,c),c!==d&&(o.textContent=d);return}if(l&16){a&16?ze(t,e,c,d,o,s,i):(a&8&&(o.textContent=""),$(Q(t,e),d,o,s,i));return}d==null&&(a&8?o.textContent="":a&16&&w(e,c))}function ze(t,e,n,r,o,s,i){r.every(l=>l.key!==null&&l.key!==void 0)&&n.every(l=>l.key!==null&&l.key!==void 0)?(0,v.patchKeyedChildren)(n,r,o,s,i,null,!1):(0,v.patchUnkeyedChildren)(n,r,o,s,i,null,!1)}function Xe(t,e,n,r,o,s,i){let a=n.children,l=r.children;Array.isArray(l)&&l.length>0?(fe(t,e,n,r,o,s,i),r.el=l[0].el,r.anchor=l[l.length-1].el?t.nextSibling(l[l.length-1].el):s):Array.isArray(a)&&a.length>0&&l===null?(w(e,a),r.el=n.el,r.anchor=n.anchor):(r.el=n.el,r.anchor=n.anchor)}function qe(t,e,n,r,o,s){let i=n.dynamicChildren,a=r.dynamicChildren;for(let l=0;l<a.length;l++)k(t,e,i[l],a[l],o,null,s)}function Be(t,e,n){e.component=t.component,e.el=t.el,e.component&&e.component.update&&e.component.update()}function pe(t){function e(o,s){ye(t,e,o,s)}(0,me.registerDOMOperations)({insert(o,s,i){t.insert(s,o,i)},createElement(o){return t.createElement(o)},createText(o){return t.createText(o)},setText(o,s){o.nodeValue=s},setElementText(o,s){o.textContent=s},remove(o){t.remove(o)},createComment(o){return t.createComment(o)},mount(o,s,i,a,l,c,d){r(null,o,s,i,a)},patch(o,s,i,a,l,c,d,f){r(o,s,i,a,l)},unmount(o,s,i,a){e(o)},move(o,s,i){t.insert(s,o.el,i)}});function r(o,s,i,a,l){k(t,e,o,s,i,a,l)}return{mount(o,s){s.nodeType===1&&(s.textContent=""),r(null,o,s,null,null)},patch(o,s,i){var a;r(o,s,i||((a=o.el)==null?void 0:a.parentNode),null,null)},unmount(o,s){e(o,s)}}}var h=require("@lytjs/vdom"),P=require("@lytjs/common"),Z=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]),Je={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},Ke=/[&<>"']/g;var Qe=0;function y(t){return t.replace(Ke,e=>Je[e])}function Ze(t,e){return t.startsWith("on")||t.startsWith("@")||t==="key"||t==="ref"||t==="__vccOpts"||t.startsWith("__")?"":e===!0?t:e===!1||e===null||e===void 0?"":t==="class"?`class="${y((0,P.normalizeClass)(e))}"`:t==="style"?`style="${y((0,P.normalizeStyle)(e))}"`:t==="dangerouslySetInnerHTML"||t==="innerHTML"?"":`${t}="${y(String(e))}"`}function ee(t){if(!t)return"";let e=[];for(let n in t){let r=t[n],o=Ze(n,r);o&&e.push(o)}return e.length>0?" "+e.join(" "):""}var _=class{createElement(e){return{tag:e,props:{},children:[]}}createText(e){return{type:"text",value:e}}createComment(e){return{type:"comment",value:e}}insert(e,n,r){e.children.push(n)}renderToString(e){return m(e)}async*renderToStream(e){yield*D(e)}};function m(t){if(t==null)return"";let{type:e,props:n,children:r}=t;return typeof e=="symbol"&&String(e)==="Symbol(Fragment)"?Array.isArray(r)?r.map(o=>m(o)).join(""):"":typeof e=="symbol"&&String(e).includes("Text")?y(String(r||"")):typeof e=="symbol"&&String(e).includes("Comment")?`<!--${String(r||"")}-->`:typeof e=="string"?et(e,n,r,t):typeof e=="object"&&e!==null||typeof e=="function"?H(t):""}function et(t,e,n,r){let o=ee(e);if(Z.has(t))return`<${t}${o} />`;if(e&&(e.dangerouslySetInnerHTML||e.innerHTML)){let a=e.dangerouslySetInnerHTML?e.dangerouslySetInnerHTML.__html||e.dangerouslySetInnerHTML:e.innerHTML;return`<${t}${o}>${y(String(a))}</${t}>`}let s="",i=r.shapeFlag||0;return i&h.ShapeFlags.TEXT_CHILDREN?s=y(String(n||"")):i&h.ShapeFlags.ARRAY_CHILDREN&&Array.isArray(n)?s=n.map(a=>m(a)).join(""):i&h.ShapeFlags.SLOTS_CHILDREN&&typeof n=="object"&&n!==null?s=te(n):typeof n=="string"?s=y(n):Array.isArray(n)?s=n.map(a=>m(a)).join(""):typeof n=="number"&&(s=y(String(n))),`<${t}${o}>${s}</${t}>`}function te(t){let e=[];for(let n in t){let r=t[n];if(typeof r=="function"){let o=r();Array.isArray(o)?e.push(o.map(s=>m(s)).join("")):o!=null&&e.push(m(o))}else Array.isArray(r)?e.push(r.map(o=>m(o)).join("")):r!=null&&e.push(m(r))}return e.join("")}function H(t){let e=t.type;if(e&&e.__island)return tt(t,e);if(typeof e=="function"){let n=e(t.props||{},{slots:t.children||{}});return m(n)}if(typeof e=="object"&&e!==null){if(typeof e.render=="function"){let n=e.render(t.props||{},{slots:t.children||{},emit:()=>{}});return m(n)}if(typeof e.setup=="function"){let n=e.setup(t.props||{},{emit:()=>{},slots:t.children||{}});if(typeof n=="function"){let r=n();return m(r)}if(typeof e.render=="function"){let r=e.render(n||{},{slots:t.children||{},emit:()=>{}});return m(r)}}}return t.component&&t.component.subTree?m(t.component.subTree):"<!---->"}function tt(t,e){var N;let n=e.name||((N=t.props)==null?void 0:N["data-island-id"])||"anonymous",r=t.props||{},o=r["data-hydrate-when"]||e.__hydrateWhen||"",s=e.__islandTag||"div",i={};for(let T in r)T==="data-hydrate-when"||T==="data-island-id"||(i[T]=r[T]);let a=JSON.stringify(i),l=y(a),c="";if(typeof e.render=="function"){let T=e.render(r,{slots:t.children||{},emit:()=>{}});c=m(T)}else if(typeof e=="function"){let T=e(r,{slots:t.children||{}});c=m(T)}let d=o?` data-hydrate-when="${y(o)}"`:"",f=`<${s} data-hydrate="${y(n)}" data-props="${l}"${d}>${c}</${s}>`,u=`<script type="application/json" data-hydrate-props="${y(n)}">${a}<\/script>`;return f+u}async function*D(t){if(t==null)return;let{type:e,props:n,children:r}=t;if(typeof e=="symbol"&&String(e)==="Symbol(Fragment)"){if(Array.isArray(r))for(let o of r)yield*D(o);return}if(typeof e=="symbol"&&String(e).includes("Text")){yield y(String(r||""));return}if(typeof e=="symbol"&&String(e).includes("Comment")){yield`<!--${String(r||"")}-->`;return}if(typeof e=="string"){yield*nt(e,n,r,t);return}if(typeof e=="object"||typeof e=="function"){yield H(t);return}}async function*nt(t,e,n,r){let o=ee(e);if(Z.has(t)){yield`<${t}${o} />`;return}if(e&&(e.dangerouslySetInnerHTML||e.innerHTML)){let i=e.dangerouslySetInnerHTML?e.dangerouslySetInnerHTML.__html||e.dangerouslySetInnerHTML:e.innerHTML;yield`<${t}${o}>${y(String(i))}</${t}>`;return}yield`<${t}${o}>`;let s=r.shapeFlag||0;if(s&h.ShapeFlags.TEXT_CHILDREN)yield y(String(n||""));else if(s&h.ShapeFlags.ARRAY_CHILDREN&&Array.isArray(n))for(let i of n)yield*D(i);else if(s&h.ShapeFlags.SLOTS_CHILDREN&&typeof n=="object"&&n!==null)yield te(n);else if(typeof n=="string")yield y(n);else if(Array.isArray(n))for(let i of n)yield*D(i);else typeof n=="number"&&(yield y(String(n)));yield`</${t}>`}function ge(t){return m(t)}function he(t,e){let n=(e==null?void 0:e.suspenseIdPrefix)||"suspense",r=S(t,n);return new ReadableStream({async pull(o){let{value:s,done:i}=await r.next();i?o.close():o.enqueue(s)},async cancel(){await r.return(void 0)}})}async function*Ne(t,e){let n=(e==null?void 0:e.suspenseIdPrefix)||"suspense";yield*S(t,n)}async function*S(t,e){if(t==null)return;let{type:n,props:r,children:o}=t;if(typeof n=="symbol"&&String(n)==="Symbol(Fragment)"){if(Array.isArray(o))for(let s of o)yield*S(s,e);return}if(typeof n=="symbol"&&String(n).includes("Text")){yield y(String(o||""));return}if(typeof n=="symbol"&&String(n).includes("Comment")){yield`<!--${String(o||"")}-->`;return}if(typeof n=="string"){yield*rt(n,r,o,t,e);return}if(typeof n=="object"&&n!==null){let s=n;if(s.name==="Suspense"||s._isSuspense){yield*ot(t,e);return}if(s._isAsyncComponent||s.__asyncSetup){yield*st(t,e);return}yield H(t);return}if(typeof n=="function"){yield H(t);return}}async function*rt(t,e,n,r,o){let s=ee(e);if(Z.has(t)){yield`<${t}${s} />`;return}if(e&&(e.dangerouslySetInnerHTML||e.innerHTML)){let a=e.dangerouslySetInnerHTML?e.dangerouslySetInnerHTML.__html||e.dangerouslySetInnerHTML:e.innerHTML;yield`<${t}${s}>${y(String(a))}</${t}>`;return}yield`<${t}${s}>`;let i=r.shapeFlag||0;if(i&h.ShapeFlags.TEXT_CHILDREN)yield y(String(n||""));else if(i&h.ShapeFlags.ARRAY_CHILDREN&&Array.isArray(n))for(let a of n)yield*S(a,o);else if(i&h.ShapeFlags.SLOTS_CHILDREN&&typeof n=="object"&&n!==null)yield te(n);else if(typeof n=="string")yield y(n);else if(Array.isArray(n))for(let a of n)yield*S(a,o);else typeof n=="number"&&(yield y(String(n)));yield`</${t}>`}async function*ot(t,e){let n=`${e}-${Qe++}`,o=(t.props||{}).fallback,s="";o&&(typeof o=="object"&&o!==null?s=m(o):typeof o=="string"&&(s=o));let i=t.children,a=[];if(typeof i=="object"&&i!==null){if(Array.isArray(i))a=i;else if(typeof i.default=="function"){let d=i.default();Array.isArray(d)?a=d:d!=null&&(a=[d])}}let l=[];function c(d){for(let f of d){if(f==null)continue;let u=f.type;if(u&&(u._isAsyncComponent||u.__asyncSetup||f.__asyncSetup)){let N=f.__asyncPromise||u.__asyncPromise;N&&l.push(N.then(()=>{}))}}}if(c(a),l.length===0){for(let d of a)yield*S(d,e);return}yield`<!--${n}-fallback-->`,yield s,await Promise.all(l),yield`<!--${n}-resolved-->`;for(let d of a)yield*S(d,e);yield`<!--/${n}-->`}async function*st(t,e){let n=t.type,r=t.__asyncPromise||n.__asyncPromise;if(r)try{await r}catch(o){yield"<!--async-component-error-->";return}yield H(t)}var Te=new _;var W=require("@lytjs/common"),F={ELEMENT:1,FUNCTIONAL_COMPONENT:2,STATEFUL_COMPONENT:4,TEXT_CHILDREN:8,ARRAY_CHILDREN:16,SLOTS_CHILDREN:32},g=!1,se=[],ne=!1,p={success:!0,mismatches:0,hydratedNodes:0};function Le(){return g}function Ve(t){g=t}function Ee(){return{...p}}function ie(){p={success:!0,mismatches:0,hydratedNodes:0}}function be(t){g?se.push(t):t()}function Ce(t,e,n={}){ie(),n.onHydrated&&se.push(n.onHydrated),g=!0;try{let r=e.firstElementChild;return r?(t._vnode||t.mount(e),t._vnode&&V(r,t._vnode,n),g=!1,re(),p):(g=!1,t.mount(e),p.success=!1,re(),p)}catch(r){return g=!1,p.success=!1,e.innerHTML="",t.mount(e),re(),p}}function re(){if(ne)return;ne=!0;let t=se.splice(0);for(let e of t)try{e()}catch(n){}ne=!1}function V(t,e,n){if(ft(e)){ct(t,e,n);return}if(mt(e)){at(t,e,n);return}if(pt(e)){lt(t,e,n);return}if(gt(e)){dt(t,e,n);return}if(typeof e.type=="string"){it(t,e,n);return}}function it(t,e,n){let r=t.tagName.toLowerCase(),o=e.type.toLowerCase();if(r!==o){G(t,e,`\u6807\u7B7E\u4E0D\u5339\u914D: DOM "${r}" vs VNode "${o}"`,n);return}e.el=t,e.props&&ae(t,e.props),e.ref&&yt(t,e.ref),ut(t,e,n),p.hydratedNodes++}function at(t,e,n){if(t.nodeType!==3){G(t,e,"\u671F\u671B\u6587\u672C\u8282\u70B9",n);return}e.el=t;let r=t.nodeValue||"",o=String(e.children||"");r!==o&&(t.nodeValue=o,n.strict),p.hydratedNodes++}function lt(t,e,n){if(t.nodeType!==8){G(t,e,"\u671F\u671B\u6CE8\u91CA\u8282\u70B9",n);return}e.el=t;let r=t.nodeValue||"",o=String(e.children||"");r!==o&&(t.nodeValue=o),p.hydratedNodes++}function ct(t,e,n){if(!Array.isArray(e.children))return;let r=Array.from(t.childNodes);for(let o=0;o<e.children.length;o++){let s=e.children[o],i=r[o];if(!i){p.mismatches++;break}V(i,s,n)}}function dt(t,e,n){if(e.component&&e.component.subTree){V(t,e.component.subTree,n),e.el=e.component.subTree.el;return}let r=e.type;if(typeof r=="function")try{let o=r(e.props||{},{slots:e.children||{}});if(o){V(t,o,n),e.el=o.el;return}}catch(o){}if(typeof r=="object"&&r!==null&&typeof r.render=="function")try{let o=r.render(e.props||{},{slots:e.children||{},emit:()=>{}});if(o){V(t,o,n),e.el=o.el;return}}catch(o){}G(t,e,"\u7EC4\u4EF6\u65E0\u6CD5\u83B7\u53D6 subTree",n)}function ut(t,e,n){if(!e.children)return;let r=e.shapeFlag||0;if(typeof e.children=="string"||r&F.TEXT_CHILDREN){let o=t.textContent||"",s=String(e.children||"");o!==s&&(t.textContent=s,n.strict);return}if(Array.isArray(e.children)){let o=Array.from(t.childNodes),s=0;for(let i=0;i<o.length&&s<e.children.length;i++){let a=e.children[s];if(a==null){s++;continue}V(o[i],a,n),s++}s<e.children.length&&p.mismatches++}r&F.SLOTS_CHILDREN&&typeof e.children=="object"&&e.children}function ae(t,e){for(let n in e){let r=e[n];if(n.startsWith("on")&&typeof r=="function"){let o=n.slice(2).toLowerCase();t.addEventListener(o,r)}}}function yt(t,e){typeof e=="function"?e(t):e&&typeof e=="object"&&(e.current=t)}function ft(t){return typeof t.type=="symbol"&&String(t.type)==="Symbol(Fragment)"}function mt(t){return typeof t.type=="symbol"&&String(t.type).includes("Text")}function pt(t){return typeof t.type=="symbol"&&String(t.type).includes("Comment")}function gt(t){return!!((t.shapeFlag||0)&(F.STATEFUL_COMPONENT|F.FUNCTIONAL_COMPONENT)||typeof t.type=="object"&&t.type!==null||typeof t.type=="function")}function G(t,e,n,r){let o=`[lyt] \u6CE8\u6C34\u4E0D\u5339\u914D: ${n}`;if(p.mismatches++,r.strict)throw new W.LytError(W.LytErrorCodes.LYT_SSR_HYDRATION_ERROR,o)}var b=new Map,x=new Map,Re={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},ht=/[&<>"']/g;function E(t){return t.replace(ht,e=>Re[e])}function oe(t){return t.replace(/[&<>"']/g,e=>Re[e])}function le(t,e,n={}){let r=typeof document!="undefined"?document:null;if(!r)return{success:!1,mismatches:0,hydratedNodes:0};let o=r.querySelector(t);if(!o)return{success:!1,mismatches:0,hydratedNodes:0};let s=o.getAttribute("data-hydrate");if(!s)return{success:!1,mismatches:0,hydratedNodes:0};if(o.hasAttribute("data-hydrated"))return{success:!0,mismatches:0,hydratedNodes:0};let i=Nt(s,r);if(i===null)return{success:!1,mismatches:0,hydratedNodes:0};let a=o.getAttribute("data-hydrate-when");return a||n.lazy?Tt(o,s,e,i,a||"visible",n):L(o,s,e,i,n)}function Nt(t,e){let n=e.querySelector(`script[type="application/json"][data-hydrate-props="${t}"]`);if(!n){let r=e.querySelector(`[data-hydrate="${t}"]`);if(r){let o=r.getAttribute("data-props");if(o)try{return JSON.parse(o)}catch(s){return null}}return{}}try{return JSON.parse(n.textContent||"{}")}catch(r){return null}}function L(t,e,n,r,o){let s={success:!0,mismatches:0,hydratedNodes:0};try{g=!0;let i=null;if(typeof n.render=="function")i=n.render(r,{slots:n.slots||{},emit:()=>{}});else if(typeof n.setup=="function"){let l=n.setup(r,{emit:()=>{},slots:n.slots||{}});typeof l=="function"&&(i=l())}if(!i)return g=!1,s.success=!1,s;if(o.dev!==!1){let l=Lt(t,i,e);s.mismatches=l}V(t,i,o),s.hydratedNodes=p.hydratedNodes,i.props&&ae(t,i.props),j(t,i),t.setAttribute("data-hydrated","");let a={id:e,hydrated:!0,instance:n,eventListeners:[],timeoutId:null,observer:null,interactionHandler:null};return b.set(e,a),x.set(e,n),g=!1,o.onHydrated&&o.onHydrated(),s}catch(i){return g=!1,s.success=!1,s}}function j(t,e){if(!(!e.children||typeof e.children=="string")&&Array.isArray(e.children)){let n=Array.from(t.children),r=0;for(let o=0;o<n.length&&r<e.children.length;o++){let s=e.children[r];if(s==null){r++;continue}if(typeof s.type=="string"&&s.props)ae(n[o],s.props),j(n[o],s);else if(typeof s.type=="object"||typeof s.type=="function"){let i=s.type;if(typeof i=="function")try{let a=i(s.props||{},{slots:s.children||{}});a&&n[o]&&j(n[o],a)}catch(a){}else if(i&&typeof i.render=="function")try{let a=i.render(s.props||{},{slots:s.children||{},emit:()=>{}});a&&n[o]&&j(n[o],a)}catch(a){}}r++}}}function Tt(t,e,n,r,o,s){let i={success:!0,mismatches:0,hydratedNodes:0},a=null;s.timeout&&s.timeout>0&&(a=setTimeout(()=>{He(t,e),L(t,e,n,r,s)},s.timeout));let l={id:e,hydrated:!1,instance:n,eventListeners:[],timeoutId:a,observer:null,interactionHandler:null};switch(b.set(e,l),x.set(e,n),o){case"visible":{if(typeof IntersectionObserver!="undefined"){let c=new IntersectionObserver(d=>{for(let f of d)f.isIntersecting&&(c.unobserve(f.target),l.observer=null,a&&clearTimeout(a),l.timeoutId=null,L(t,e,n,r,s))},{rootMargin:"200px"});c.observe(t),l.observer=c}else a&&clearTimeout(a),L(t,e,n,r,s);break}case"idle":{(d=>{typeof requestIdleCallback!="undefined"?requestIdleCallback(d,{timeout:s.timeout||2e3}):setTimeout(d,1)})(()=>{a&&clearTimeout(a),l.timeoutId=null,t.hasAttribute("data-hydrated")||L(t,e,n,r,s)});break}case"interaction":{let c=()=>{a&&clearTimeout(a),l.timeoutId=null,l.interactionHandler=null,document.removeEventListener("click",c),document.removeEventListener("keydown",c),document.removeEventListener("scroll",c),document.removeEventListener("touchstart",c),t.hasAttribute("data-hydrated")||L(t,e,n,r,s)};document.addEventListener("click",c,{once:!1,passive:!0}),document.addEventListener("keydown",c,{once:!1,passive:!0}),document.addEventListener("scroll",c,{once:!1,passive:!0}),document.addEventListener("touchstart",c,{once:!1,passive:!0}),l.interactionHandler=c;break}default:a&&clearTimeout(a),L(t,e,n,r,s)}return i}function He(t,e){let n=b.get(e);n&&(n.observer&&(n.observer.disconnect(),n.observer=null),n.timeoutId!==null&&(clearTimeout(n.timeoutId),n.timeoutId=null),n.interactionHandler&&(document.removeEventListener("click",n.interactionHandler),document.removeEventListener("keydown",n.interactionHandler),document.removeEventListener("scroll",n.interactionHandler),document.removeEventListener("touchstart",n.interactionHandler),n.interactionHandler=null))}function Ae(t={}){let e=typeof document!="undefined"?document:null;if(!e)return{success:!1,mismatches:0,hydratedNodes:0};let n=e.querySelectorAll("[data-hydrate]:not([data-hydrated])"),r={success:!0,mismatches:0,hydratedNodes:0};return n.forEach(o=>{let s=o.getAttribute("data-hydrate");if(!s){r.success=!1;return}let i=x.get(s);if(!i){r.success=!1;return}let a=le(`[data-hydrate="${s}"]`,i,t);r.mismatches+=a.mismatches,r.hydratedNodes+=a.hydratedNodes,a.success||(r.success=!1)}),r}function xe(t,e){x.set(t,e)}function _e(t){if(!b.get(t))return;let n=typeof document!="undefined"?document.querySelector(`[data-hydrate="${t}"]`):null;n&&(He(n,t),n.removeAttribute("data-hydrated")),b.delete(t),x.delete(t)}function Me(){return b}function Ie(){b.clear(),x.clear()}function Oe(t,e={},n="div",r){let o=t.name||"anonymous",s=JSON.stringify(e),i=E(s),a="";if(typeof t.render=="function"){let u=t.render(e,{slots:t.slots||{},emit:()=>{}});a=A(u)}let l=r?` data-hydrate-when="${oe(r)}"`:"",c=oe(o),d=`<${n} data-hydrate="${c}" data-props="${i}"${l}>${a}</${n}>`,f=`<script type="application/json" data-hydrate-props="${c}">${s}<\/script>`;return d+f}function A(t){if(t==null)return"";let{type:e,props:n,children:r}=t;if(typeof e=="symbol"&&String(e)==="Symbol(Fragment)")return Array.isArray(r)?r.map(o=>A(o)).join(""):"";if(typeof e=="symbol"&&String(e).includes("Text"))return E(String(r||""));if(typeof e=="symbol"&&String(e).includes("Comment"))return`<!--${oe(String(r||""))}-->`;if(typeof e=="string"){let o=St(n);if(new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]).has(e))return`<${e}${o} />`;let i="";return typeof r=="string"?i=E(r):Array.isArray(r)?i=r.map(a=>A(a)).join(""):typeof r=="number"&&(i=E(String(r))),`<${e}${o}>${i}</${e}>`}if(typeof e=="function"){let o=e(n||{},{slots:r||{}});return A(o)}if(typeof e=="object"&&e!==null){let o=e;if(typeof o.render=="function"){let s=o.render(n||{},{slots:r||{},emit:()=>{}});return A(s)}}return""}function St(t){if(!t)return"";let e=[];for(let n in t){let r=t[n];if(!(n.startsWith("on")||n.startsWith("@")||n==="key"||n==="ref")&&!(n==="__vccOpts"||n.startsWith("__"))&&!(n==="dangerouslySetInnerHTML"||n==="innerHTML"))if(r===!0)e.push(n);else{if(r===!1||r===null||r===void 0)continue;n==="class"&&typeof r=="string"?e.push(`class="${E(r)}"`):n==="style"&&typeof r=="string"?e.push(`style="${E(r)}"`):e.push(`${n}="${E(String(r))}"`)}}return e.length>0?" "+e.join(" "):""}var ce=[];function Lt(t,e,n){let r=0,o=Vt(t),s=A(e);if(o!==s){r++;let i={islandId:n,expected:s,actual:o,suggestion:Et(o,s,n)};ce.push(i)}return r}function Vt(t){let e=t.cloneNode(!0);return e.removeAttribute("data-hydrate"),e.removeAttribute("data-props"),e.removeAttribute("data-hydrate-when"),e.removeAttribute("data-hydrated"),e.innerHTML}function Et(t,e,n){if(t.trim()==="")return`\u670D\u52A1\u7AEF\u6E32\u67D3\u4E3A\u7A7A\uFF0C\u8BF7\u68C0\u67E5\u7EC4\u4EF6 "${n}" \u7684\u670D\u52A1\u7AEF\u6E32\u67D3\u903B\u8F91`;if(e.trim()==="")return`\u5BA2\u6237\u7AEF\u6E32\u67D3\u4E3A\u7A7A\uFF0C\u8BF7\u68C0\u67E5\u7EC4\u4EF6 "${n}" \u7684 render \u51FD\u6570`;let r=/\d{10,13}/;return r.test(t)||r.test(e)?"\u68C0\u6D4B\u5230\u65F6\u95F4\u6233\u5DEE\u5F02\uFF0C\u8003\u8651\u4F7F\u7528\u7EDF\u4E00\u7684\u65F6\u95F4\u6E90\u6216\u5EF6\u8FDF\u6CE8\u6C34":Se(t)===Se(e)?"HTML \u5185\u5BB9\u76F8\u540C\u4F46\u5C5E\u6027\u987A\u5E8F\u4E0D\u540C\uFF0C\u8FD9\u4E0D\u5F71\u54CD\u529F\u80FD\u4F46\u53EF\u80FD\u5BFC\u81F4 mismatch \u8B66\u544A":`\u8BF7\u786E\u4FDD\u7EC4\u4EF6 "${n}" \u5728\u670D\u52A1\u7AEF\u548C\u5BA2\u6237\u7AEF\u6E32\u67D3\u76F8\u540C\u7684\u8F93\u51FA`}function Se(t){return t.replace(/\s+/g," ").replace(/>\s+</g,"><").trim()}function $e(){return[...ce]}function we(){ce.length=0}
1
+ 'use strict';
2
+
3
+ var vdom = require('@lytjs/vdom');
4
+ var commonIs = require('@lytjs/common-is');
5
+ var commonString = require('@lytjs/common-string');
6
+ require('@lytjs/common-error');
7
+
8
+ // src/ssr/ssr-renderer.ts
9
+ function isVoidElement(tag) {
10
+ return commonString.VOID_ELEMENTS.has(tag);
11
+ }
12
+ function isValidHTMLElementTag(tag) {
13
+ return /^[a-z][a-z0-9-]*$/.test(tag);
14
+ }
15
+ var URL_ATTRS = /* @__PURE__ */ new Set([
16
+ "href",
17
+ "src",
18
+ "action",
19
+ "formaction",
20
+ "xlink:href",
21
+ "data",
22
+ "srcdoc"
23
+ ]);
24
+ var NAMED_ENTITIES = {
25
+ "&colon;": ":",
26
+ "&tab;": " ",
27
+ "&newline;": "\n",
28
+ "&lpar;": "(",
29
+ "&rpar;": ")",
30
+ "&nbsp;": "\xA0",
31
+ "&copy;": "\xA9",
32
+ "&reg;": "\xAE",
33
+ "&trade;": "\u2122",
34
+ "&times;": "\xD7",
35
+ "&divide;": "\xF7",
36
+ "&pound;": "\xA3",
37
+ "&yen;": "\xA5",
38
+ "&cent;": "\xA2",
39
+ "&sect;": "\xA7",
40
+ "&para;": "\xB6",
41
+ "&middot;": "\xB7",
42
+ "&laquo;": "\xAB",
43
+ "&raquo;": "\xBB",
44
+ "&iexcl;": "\xA1",
45
+ "&iquest;": "\xBF",
46
+ "&deg;": "\xB0",
47
+ "&plusmn;": "\xB1",
48
+ "&micro;": "\xB5",
49
+ "&frac14;": "\xBC",
50
+ "&frac12;": "\xBD",
51
+ "&frac34;": "\xBE",
52
+ "&sup1;": "\xB9",
53
+ "&sup2;": "\xB2",
54
+ "&sup3;": "\xB3",
55
+ "&acute;": "\xB4",
56
+ "&cedil;": "\xB8",
57
+ "&ordf;": "\xAA",
58
+ "&not;": "\xAC",
59
+ "&shy;": "\xAD",
60
+ "&macr;": "\xAF",
61
+ "&uml;": "\xA8",
62
+ "&circ;": "\u02C6",
63
+ "&tilde;": "\u02DC",
64
+ "&ensp;": "\u2002",
65
+ "&emsp;": "\u2003",
66
+ "&thinsp;": "\u2009",
67
+ "&zwnj;": "\u200C",
68
+ "&zwj;": "\u200D",
69
+ "&lrm;": "\u200E",
70
+ "&rlm;": "\u200F",
71
+ "&ndash;": "\u2013",
72
+ "&mdash;": "\u2014",
73
+ "&lsquo;": "\u2018",
74
+ "&rsquo;": "\u2019",
75
+ "&sbquo;": "\u201A",
76
+ "&ldquo;": "\u201C",
77
+ "&rdquo;": "\u201D",
78
+ "&bdquo;": "\u201E",
79
+ "&dagger;": "\u2020",
80
+ "&Dagger;": "\u2021",
81
+ "&bull;": "\u2022",
82
+ "&hellip;": "\u2026",
83
+ "&permil;": "\u2030",
84
+ "&prime;": "\u2032",
85
+ "&Prime;": "\u2033",
86
+ "&lsaquo;": "\u2039",
87
+ "&rsaquo;": "\u203A",
88
+ "&oline;": "\u203E",
89
+ "&frasl;": "\u2044",
90
+ "&euro;": "\u20AC",
91
+ "&larr;": "\u2190",
92
+ "&uarr;": "\u2191",
93
+ "&rarr;": "\u2192",
94
+ "&darr;": "\u2193",
95
+ "&harr;": "\u2194",
96
+ "&crarr;": "\u21B5",
97
+ "&lceil;": "\u2308",
98
+ "&rceil;": "\u2309",
99
+ "&lfloor;": "\u230A",
100
+ "&rfloor;": "\u230B",
101
+ "&lang;": "\u27E8",
102
+ "&rang;": "\u27E9",
103
+ "&loz;": "\u25CA",
104
+ "&spades;": "\u2660",
105
+ "&clubs;": "\u2663",
106
+ "&hearts;": "\u2665",
107
+ "&diams;": "\u2666",
108
+ "&OElig;": "\u0152",
109
+ "&oelig;": "\u0153",
110
+ "&Scaron;": "\u0160",
111
+ "&scaron;": "\u0161",
112
+ "&Yuml;": "\u0178",
113
+ "&fnof;": "\u0192",
114
+ "&Alpha;": "\u0391",
115
+ "&Beta;": "\u0392",
116
+ "&Gamma;": "\u0393",
117
+ "&Delta;": "\u0394",
118
+ "&Epsilon;": "\u0395",
119
+ "&Zeta;": "\u0396",
120
+ "&Eta;": "\u0397",
121
+ "&Theta;": "\u0398",
122
+ "&Iota;": "\u0399",
123
+ "&Kappa;": "\u039A",
124
+ "&Lambda;": "\u039B",
125
+ "&Mu;": "\u039C",
126
+ "&Nu;": "\u039D",
127
+ "&Xi;": "\u039E",
128
+ "&Omicron;": "\u039F",
129
+ "&Pi;": "\u03A0",
130
+ "&Rho;": "\u03A1",
131
+ "&Sigma;": "\u03A3",
132
+ "&Tau;": "\u03A4",
133
+ "&Upsilon;": "\u03A5",
134
+ "&Phi;": "\u03A6",
135
+ "&Chi;": "\u03A7",
136
+ "&Psi;": "\u03A8",
137
+ "&Omega;": "\u03A9",
138
+ "&alpha;": "\u03B1",
139
+ "&beta;": "\u03B2",
140
+ "&gamma;": "\u03B3",
141
+ "&delta;": "\u03B4",
142
+ "&epsilon;": "\u03B5",
143
+ "&zeta;": "\u03B6",
144
+ "&eta;": "\u03B7",
145
+ "&theta;": "\u03B8",
146
+ "&iota;": "\u03B9",
147
+ "&kappa;": "\u03BA",
148
+ "&lambda;": "\u03BB",
149
+ "&mu;": "\u03BC",
150
+ "&nu;": "\u03BD",
151
+ "&xi;": "\u03BE",
152
+ "&omicron;": "\u03BF",
153
+ "&pi;": "\u03C0",
154
+ "&rho;": "\u03C1",
155
+ "&sigmaf;": "\u03C2",
156
+ "&sigma;": "\u03C3",
157
+ "&tau;": "\u03C4",
158
+ "&upsilon;": "\u03C5",
159
+ "&phi;": "\u03C6",
160
+ "&chi;": "\u03C7",
161
+ "&psi;": "\u03C8",
162
+ "&omega;": "\u03C9",
163
+ "&thetasym;": "\u03D1",
164
+ "&upsih;": "\u03D2",
165
+ "&piv;": "\u03D6",
166
+ "&apos;": "'",
167
+ "&quot;": '"',
168
+ "&amp;": "&",
169
+ "&lt;": "<",
170
+ "&gt;": ">"
171
+ };
172
+ var NAMED_ENTITY_REGEX = new RegExp(
173
+ Object.keys(NAMED_ENTITIES).map((e) => e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|"),
174
+ "g"
175
+ );
176
+ var NUMERIC_ENTITY_REGEX = /&#x?[0-9a-f]+;/gi;
177
+ function isSafeURL(url) {
178
+ let decoded = url;
179
+ let prev = "";
180
+ let maxIterations = 10;
181
+ while (decoded !== prev && maxIterations-- > 0) {
182
+ prev = decoded;
183
+ decoded = decoded.replace(NUMERIC_ENTITY_REGEX, (match) => {
184
+ const codePoint = match.startsWith("&#x") ? parseInt(match.slice(3, -1), 16) : parseInt(match.slice(2, -1), 10);
185
+ if (isNaN(codePoint) || codePoint < 0 || codePoint > 1114111) {
186
+ return match;
187
+ }
188
+ return String.fromCodePoint(codePoint);
189
+ });
190
+ decoded = decoded.replace(NAMED_ENTITY_REGEX, (match) => NAMED_ENTITIES[match] || match);
191
+ }
192
+ try {
193
+ const parsed = new URL(decoded, "http://example.com");
194
+ const protocol = parsed.protocol.toLowerCase().replace(":", "");
195
+ if (protocol === "javascript") {
196
+ return false;
197
+ }
198
+ if (protocol === "data") {
199
+ if (/^data:image\/svg\+xml/i.test(decoded)) {
200
+ return false;
201
+ }
202
+ return /^data:image\/(png|jpeg|jpg|gif|webp|bmp|ico|avif);/i.test(decoded);
203
+ }
204
+ return true;
205
+ } catch {
206
+ return false;
207
+ }
208
+ }
209
+ function renderAttributeToString(key, value) {
210
+ if (commonIs.isNullish(value)) return "";
211
+ if (/^on[A-Z]/.test(key)) return "";
212
+ if (key === "class") {
213
+ const classValue = value == null ? "" : String(value);
214
+ if (!classValue) return "";
215
+ return ` class="${commonString.escapeHtml(classValue)}"`;
216
+ }
217
+ if (key === "style") {
218
+ if (commonIs.isString(value)) {
219
+ if (!value) return "";
220
+ return ` style="${commonString.escapeHtml(value)}"`;
221
+ }
222
+ if (commonIs.isObject(value)) {
223
+ const styles = [];
224
+ for (const k in value) {
225
+ const val = value[k];
226
+ if (val != null && val !== "") {
227
+ styles.push(`${commonString.camelToKebab(k)}:${String(val)}`);
228
+ }
229
+ }
230
+ if (styles.length === 0) return "";
231
+ return ` style="${commonString.escapeHtml(styles.join(";"))}"`;
232
+ }
233
+ return "";
234
+ }
235
+ if (commonString.isBooleanAttr(key)) {
236
+ if (value === false || value === "") return "";
237
+ return ` ${key}`;
238
+ }
239
+ if (URL_ATTRS.has(key)) {
240
+ if (!isSafeURL(String(value))) {
241
+ return "";
242
+ }
243
+ }
244
+ return ` ${key}="${commonString.escapeHtml(String(value))}"`;
245
+ }
246
+ function renderToString(input) {
247
+ return Promise.resolve(renderVNodeToString(input.vnode));
248
+ }
249
+ function renderVNodeToString(vnode) {
250
+ const { type, shapeFlag, children } = vnode;
251
+ if (type === vdom.Fragment) {
252
+ return renderFragmentToString(vnode);
253
+ }
254
+ if (type === vdom.Text) {
255
+ const text = commonIs.isFunction(children) ? "" : String(children ?? "");
256
+ return commonString.escapeHtml(text);
257
+ }
258
+ if (type === vdom.Comment) {
259
+ const text = commonIs.isFunction(children) ? "" : String(children ?? "");
260
+ let safe = text.replace(/<!--/g, "&lt;!--").replace(/-->/g, "--&gt;");
261
+ safe = safe.replace(/--/g, "- -");
262
+ return `<!--${safe}-->`;
263
+ }
264
+ if (shapeFlag & vdom.ShapeFlags.ELEMENT) {
265
+ return renderElementToString(vnode);
266
+ }
267
+ return "";
268
+ }
269
+ function renderFragmentToString(vnode) {
270
+ const children = vnode.children;
271
+ if (commonIs.isArray(children)) {
272
+ return children.map((child) => child != null ? renderVNodeToString(child) : "").join("");
273
+ }
274
+ return "";
275
+ }
276
+ function renderElementToString(vnode) {
277
+ const tag = vnode.type;
278
+ if (!isValidHTMLElementTag(tag)) {
279
+ return "";
280
+ }
281
+ const props = vnode.props ?? {};
282
+ const { shapeFlag, children } = vnode;
283
+ let html = `<${tag}`;
284
+ for (const key in props) {
285
+ if (key === "key" || key === "ref") continue;
286
+ html += renderAttributeToString(key, props[key]);
287
+ }
288
+ if (isVoidElement(tag)) {
289
+ html += " />";
290
+ return html;
291
+ }
292
+ html += ">";
293
+ if (shapeFlag & vdom.ShapeFlags.TEXT_CHILDREN) {
294
+ const text = commonIs.isFunction(children) ? "" : String(children ?? "");
295
+ html += commonString.escapeHtml(text);
296
+ } else if (shapeFlag & vdom.ShapeFlags.ARRAY_CHILDREN && commonIs.isArray(children)) {
297
+ for (let i = 0; i < children.length; i++) {
298
+ const child = children[i];
299
+ if (child != null) {
300
+ html += renderVNodeToString(child);
301
+ }
302
+ }
303
+ }
304
+ html += `</${tag}>`;
305
+ return html;
306
+ }
307
+
308
+ exports.renderToString = renderToString;
309
+ //# sourceMappingURL=ssr.cjs.map
310
+ //# sourceMappingURL=ssr.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils.ts","../src/ssr/ssr-utils.ts","../src/ssr/ssr-renderer.ts"],"names":["VOID_ELEMENTS","isNullish","escapeHtml","isString","isObject","camelToKebab","isBooleanAttr","Fragment","Text","isFunction","Comment","ShapeFlags","isArray"],"mappings":"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","file":"ssr.cjs","sourcesContent":["/**\r\n * @lytjs/renderer - Shared utilities\r\n *\r\n * This module provides shared utility functions used across the renderer package,\r\n * including HTML escaping, boolean attribute detection, and void element checks.\r\n * It re-exports selected utilities from @lytjs/common-string for convenience.\r\n */\r\n\r\nimport { escapeHtml, isBooleanAttr, VOID_ELEMENTS } from '@lytjs/common-string';\r\n\r\nexport { escapeHtml, isBooleanAttr };\r\n\r\n// ============================================================\r\n// Self-closing elements\r\n// ============================================================\r\n\r\n/**\r\n * Check if a tag is a void (self-closing) element\r\n */\r\nexport function isVoidElement(tag: string): boolean {\r\n return VOID_ELEMENTS.has(tag);\r\n}\r\n","/**\r\n * @lytjs/renderer - SSR Utilities\r\n * SSR 渲染共享工具函数\r\n * FIX: P2-36 提取 ssr-renderer 和 ssr-stream 的共享代码\r\n */\r\n\r\nimport { isString, isObject, isNullish } from '@lytjs/common-is';\r\nimport { camelToKebab } from '@lytjs/common-string';\r\nimport { warn } from '@lytjs/common-error';\r\nimport { escapeHtml, isBooleanAttr } from '../utils';\r\n\r\n// ============================================================\r\n// HTML 标签验证\r\n// ============================================================\r\n\r\n/**\r\n * 验证是否为有效的 HTML 元素标签名\r\n * @param tag - 标签名\r\n * @returns 是否有效\r\n */\r\nexport function isValidHTMLElementTag(tag: string): boolean {\r\n return /^[a-z][a-z0-9-]*$/.test(tag);\r\n}\r\n\r\n// ============================================================\r\n// URL 安全验证\r\n// ============================================================\r\n\r\n// 安全:携带 URL 且需要协议验证的属性\r\n// 提取为模块级常量以避免每次渲染时重新创建\r\nexport const URL_ATTRS = new Set([\r\n 'href',\r\n 'src',\r\n 'action',\r\n 'formaction',\r\n 'xlink:href',\r\n 'data',\r\n 'srcdoc',\r\n]);\r\n\r\n// 命名实体解码常量\r\nexport const NAMED_ENTITIES: Record<string, string> = {\r\n '&colon;': ':',\r\n '&tab;': '\\t',\r\n '&newline;': '\\n',\r\n '&lpar;': '(',\r\n '&rpar;': ')',\r\n '&nbsp;': '\\u00A0',\r\n '&copy;': '\\u00A9',\r\n '&reg;': '\\u00AE',\r\n '&trade;': '\\u2122',\r\n '&times;': '\\u00D7',\r\n '&divide;': '\\u00F7',\r\n '&pound;': '\\u00A3',\r\n '&yen;': '\\u00A5',\r\n '&cent;': '\\u00A2',\r\n '&sect;': '\\u00A7',\r\n '&para;': '\\u00B6',\r\n '&middot;': '\\u00B7',\r\n '&laquo;': '\\u00AB',\r\n '&raquo;': '\\u00BB',\r\n '&iexcl;': '\\u00A1',\r\n '&iquest;': '\\u00BF',\r\n '&deg;': '\\u00B0',\r\n '&plusmn;': '\\u00B1',\r\n '&micro;': '\\u00B5',\r\n '&frac14;': '\\u00BC',\r\n '&frac12;': '\\u00BD',\r\n '&frac34;': '\\u00BE',\r\n '&sup1;': '\\u00B9',\r\n '&sup2;': '\\u00B2',\r\n '&sup3;': '\\u00B3',\r\n '&acute;': '\\u00B4',\r\n '&cedil;': '\\u00B8',\r\n '&ordf;': '\\u00AA',\r\n '&not;': '\\u00AC',\r\n '&shy;': '\\u00AD',\r\n '&macr;': '\\u00AF',\r\n '&uml;': '\\u00A8',\r\n '&circ;': '\\u02C6',\r\n '&tilde;': '\\u02DC',\r\n '&ensp;': '\\u2002',\r\n '&emsp;': '\\u2003',\r\n '&thinsp;': '\\u2009',\r\n '&zwnj;': '\\u200C',\r\n '&zwj;': '\\u200D',\r\n '&lrm;': '\\u200E',\r\n '&rlm;': '\\u200F',\r\n '&ndash;': '\\u2013',\r\n '&mdash;': '\\u2014',\r\n '&lsquo;': '\\u2018',\r\n '&rsquo;': '\\u2019',\r\n '&sbquo;': '\\u201A',\r\n '&ldquo;': '\\u201C',\r\n '&rdquo;': '\\u201D',\r\n '&bdquo;': '\\u201E',\r\n '&dagger;': '\\u2020',\r\n '&Dagger;': '\\u2021',\r\n '&bull;': '\\u2022',\r\n '&hellip;': '\\u2026',\r\n '&permil;': '\\u2030',\r\n '&prime;': '\\u2032',\r\n '&Prime;': '\\u2033',\r\n '&lsaquo;': '\\u2039',\r\n '&rsaquo;': '\\u203A',\r\n '&oline;': '\\u203E',\r\n '&frasl;': '\\u2044',\r\n '&euro;': '\\u20AC',\r\n '&larr;': '\\u2190',\r\n '&uarr;': '\\u2191',\r\n '&rarr;': '\\u2192',\r\n '&darr;': '\\u2193',\r\n '&harr;': '\\u2194',\r\n '&crarr;': '\\u21B5',\r\n '&lceil;': '\\u2308',\r\n '&rceil;': '\\u2309',\r\n '&lfloor;': '\\u230A',\r\n '&rfloor;': '\\u230B',\r\n '&lang;': '\\u27E8',\r\n '&rang;': '\\u27E9',\r\n '&loz;': '\\u25CA',\r\n '&spades;': '\\u2660',\r\n '&clubs;': '\\u2663',\r\n '&hearts;': '\\u2665',\r\n '&diams;': '\\u2666',\r\n '&OElig;': '\\u0152',\r\n '&oelig;': '\\u0153',\r\n '&Scaron;': '\\u0160',\r\n '&scaron;': '\\u0161',\r\n '&Yuml;': '\\u0178',\r\n '&fnof;': '\\u0192',\r\n '&Alpha;': '\\u0391',\r\n '&Beta;': '\\u0392',\r\n '&Gamma;': '\\u0393',\r\n '&Delta;': '\\u0394',\r\n '&Epsilon;': '\\u0395',\r\n '&Zeta;': '\\u0396',\r\n '&Eta;': '\\u0397',\r\n '&Theta;': '\\u0398',\r\n '&Iota;': '\\u0399',\r\n '&Kappa;': '\\u039A',\r\n '&Lambda;': '\\u039B',\r\n '&Mu;': '\\u039C',\r\n '&Nu;': '\\u039D',\r\n '&Xi;': '\\u039E',\r\n '&Omicron;': '\\u039F',\r\n '&Pi;': '\\u03A0',\r\n '&Rho;': '\\u03A1',\r\n '&Sigma;': '\\u03A3',\r\n '&Tau;': '\\u03A4',\r\n '&Upsilon;': '\\u03A5',\r\n '&Phi;': '\\u03A6',\r\n '&Chi;': '\\u03A7',\r\n '&Psi;': '\\u03A8',\r\n '&Omega;': '\\u03A9',\r\n '&alpha;': '\\u03B1',\r\n '&beta;': '\\u03B2',\r\n '&gamma;': '\\u03B3',\r\n '&delta;': '\\u03B4',\r\n '&epsilon;': '\\u03B5',\r\n '&zeta;': '\\u03B6',\r\n '&eta;': '\\u03B7',\r\n '&theta;': '\\u03B8',\r\n '&iota;': '\\u03B9',\r\n '&kappa;': '\\u03BA',\r\n '&lambda;': '\\u03BB',\r\n '&mu;': '\\u03BC',\r\n '&nu;': '\\u03BD',\r\n '&xi;': '\\u03BE',\r\n '&omicron;': '\\u03BF',\r\n '&pi;': '\\u03C0',\r\n '&rho;': '\\u03C1',\r\n '&sigmaf;': '\\u03C2',\r\n '&sigma;': '\\u03C3',\r\n '&tau;': '\\u03C4',\r\n '&upsilon;': '\\u03C5',\r\n '&phi;': '\\u03C6',\r\n '&chi;': '\\u03C7',\r\n '&psi;': '\\u03C8',\r\n '&omega;': '\\u03C9',\r\n '&thetasym;': '\\u03D1',\r\n '&upsih;': '\\u03D2',\r\n '&piv;': '\\u03D6',\r\n '&apos;': \"'\",\r\n '&quot;': '\"',\r\n '&amp;': '&',\r\n '&lt;': '<',\r\n '&gt;': '>',\r\n};\r\n\r\n// 命名实体正则(模块级以避免重新创建)\r\nconst NAMED_ENTITY_REGEX = new RegExp(\r\n Object.keys(NAMED_ENTITIES)\r\n .map((e) => e.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\r\n .join('|'),\r\n 'g',\r\n);\r\n\r\n// 数字实体正则(模块级以避免每次调用 isSafeURL 时重新创建)\r\nconst NUMERIC_ENTITY_REGEX = /&#x?[0-9a-f]+;/gi;\r\n\r\n/**\r\n * 检查 URL 是否安全(防止 XSS 攻击)\r\n * @param url - 要检查的 URL\r\n * @returns 是否安全\r\n */\r\nexport function isSafeURL(url: string): boolean {\r\n // 循环解码 HTML 实体,直到字符串不再变化\r\n let decoded = url;\r\n let prev = '';\r\n let maxIterations = 10;\r\n while (decoded !== prev && maxIterations-- > 0) {\r\n prev = decoded;\r\n decoded = decoded.replace(NUMERIC_ENTITY_REGEX, (match) => {\r\n const codePoint = match.startsWith('&#x')\r\n ? parseInt(match.slice(3, -1), 16)\r\n : parseInt(match.slice(2, -1), 10);\r\n // 验证解析后的码点是否在有效的 Unicode 范围内\r\n if (isNaN(codePoint) || codePoint < 0 || codePoint > 0x10ffff) {\r\n return match;\r\n }\r\n return String.fromCodePoint(codePoint);\r\n });\r\n // 命名实体解码(在数字实体解码之后)\r\n decoded = decoded.replace(NAMED_ENTITY_REGEX, (match) => NAMED_ENTITIES[match] || match);\r\n }\r\n // 使用 URL 构造函数进行额外验证\r\n try {\r\n const parsed = new URL(decoded, 'http://example.com');\r\n const protocol = parsed.protocol.toLowerCase().replace(':', '');\r\n if (protocol === 'javascript') {\r\n return false;\r\n }\r\n if (protocol === 'data') {\r\n // 禁止 data:image/svg+xml(可嵌入脚本,存在 XSS 风险)\r\n if (/^data:image\\/svg\\+xml/i.test(decoded)) {\r\n return false;\r\n }\r\n // 允许安全的 data:image/* MIME 类型(使用解码后的 URL 进行检查)\r\n return /^data:image\\/(png|jpeg|jpg|gif|webp|bmp|ico|avif);/i.test(decoded);\r\n }\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n// ============================================================\r\n// 属性渲染\r\n// ============================================================\r\n\r\n/**\r\n * 将属性渲染为 HTML 字符串(用于 SSR)\r\n * @param key - 属性名\r\n * @param value - 属性值\r\n * @returns HTML 属性字符串\r\n */\r\nexport function renderAttributeToString(key: string, value: unknown): string {\r\n // 跳过 null/undefined\r\n if (isNullish(value)) return '';\r\n\r\n // 跳过事件处理器\r\n if (/^on[A-Z]/.test(key)) return '';\r\n\r\n // Class 处理\r\n if (key === 'class') {\r\n const classValue = value == null ? '' : String(value);\r\n if (!classValue) return '';\r\n return ` class=\"${escapeHtml(classValue)}\"`;\r\n }\r\n\r\n // Style 处理\r\n if (key === 'style') {\r\n if (isString(value)) {\r\n if (!value) return '';\r\n return ` style=\"${escapeHtml(value)}\"`;\r\n }\r\n if (isObject(value)) {\r\n const styles: string[] = [];\r\n for (const k in value as Record<string, unknown>) {\r\n const val = (value as Record<string, unknown>)[k];\r\n if (val != null && val !== '') {\r\n styles.push(`${camelToKebab(k)}:${String(val)}`);\r\n }\r\n }\r\n if (styles.length === 0) return '';\r\n return ` style=\"${escapeHtml(styles.join(';'))}\"`;\r\n }\r\n return '';\r\n }\r\n\r\n // 布尔属性\r\n if (isBooleanAttr(key)) {\r\n if (value === false || value === '') return '';\r\n return ` ${key}`;\r\n }\r\n\r\n // 安全:阻止 URL 属性上的危险协议\r\n if (URL_ATTRS.has(key)) {\r\n if (!isSafeURL(String(value))) {\r\n if (__DEV__) {\r\n warn(`Blocked potentially dangerous attribute: ${key}=\"${String(value)}\"`);\r\n }\r\n return '';\r\n }\r\n }\r\n\r\n // 常规属性\r\n return ` ${key}=\"${escapeHtml(String(value))}\"`;\r\n}\r\n","/**\r\n * @lytjs/renderer - SSR 渲染器\r\n * 服务端渲染为字符串\r\n * FIX: P2-36 使用共享工具函数\r\n */\r\n\r\nimport type { VNode } from '@lytjs/vdom';\r\nimport { Fragment, Text, Comment, ShapeFlags } from '@lytjs/vdom';\r\nimport { isArray, isFunction } from '@lytjs/common-is';\r\nimport { escapeHtml, isVoidElement } from '../utils';\r\nimport { isValidHTMLElementTag, renderAttributeToString } from './ssr-utils';\r\nimport { warn } from '@lytjs/common-error';\r\n\r\n// ============================================================\r\n// renderToString - 主入口\r\n// ============================================================\r\n\r\nexport interface SSRInput {\r\n vnode: VNode;\r\n}\r\n\r\n/**\r\n * 将 VNode 渲染为 HTML 字符串。\r\n *\r\n * 返回 Promise 以支持未来的 Suspense/异步组件。\r\n * 当组件包含异步子组件(如 Suspense 边界)时,\r\n * 渲染过程需要等待异步数据加载完成后才能输出 HTML。\r\n */\r\nexport function renderToString(input: SSRInput): Promise<string> {\r\n return Promise.resolve(renderVNodeToString(input.vnode));\r\n}\r\n\r\n// ============================================================\r\n// renderVNodeToString\r\n// ============================================================\r\n\r\nfunction renderVNodeToString(vnode: VNode): string {\r\n const { type, shapeFlag, children } = vnode;\r\n\r\n // 处理 Fragment\r\n if (type === Fragment) {\r\n return renderFragmentToString(vnode);\r\n }\r\n\r\n // 处理 Text\r\n if (type === Text) {\r\n const text = isFunction(children) ? '' : String(children ?? '');\r\n return escapeHtml(text);\r\n }\r\n\r\n // 处理 Comment\r\n if (type === Comment) {\r\n const text = isFunction(children) ? '' : String(children ?? '');\r\n // 转义 <!-- 和 --> 防止注释注入导致 HTML 结构破坏\r\n // 先清理注释分隔符,再处理双连字符\r\n let safe = text.replace(/<!--/g, '&lt;!--').replace(/-->/g, '--&gt;');\r\n safe = safe.replace(/--/g, '- -');\r\n return `<!--${safe}-->`;\r\n }\r\n\r\n // 处理 Element\r\n if (shapeFlag & ShapeFlags.ELEMENT) {\r\n return renderElementToString(vnode);\r\n }\r\n\r\n return '';\r\n}\r\n\r\n// ============================================================\r\n// renderFragmentToString\r\n// ============================================================\r\n\r\nfunction renderFragmentToString(vnode: VNode): string {\r\n const children = vnode.children;\r\n if (isArray(children)) {\r\n return children.map((child) => (child != null ? renderVNodeToString(child) : '')).join('');\r\n }\r\n return '';\r\n}\r\n\r\n// ============================================================\r\n// renderElementToString\r\n// ============================================================\r\n\r\nfunction renderElementToString(vnode: VNode): string {\r\n const tag = vnode.type as string;\r\n\r\n if (!isValidHTMLElementTag(tag)) {\r\n if (__DEV__) {\r\n warn(`Invalid SSR element tag: \"${tag}\"`);\r\n }\r\n return '';\r\n }\r\n\r\n const props = vnode.props ?? {};\r\n const { shapeFlag, children } = vnode;\r\n\r\n // 构建带属性的开始标签\r\n let html = `<${tag}`;\r\n\r\n // 将 props 渲染为属性\r\n for (const key in props) {\r\n if (key === 'key' || key === 'ref') continue;\r\n html += renderAttributeToString(key, props[key]);\r\n }\r\n\r\n // 自闭合元素\r\n if (isVoidElement(tag)) {\r\n html += ' />';\r\n return html;\r\n }\r\n\r\n html += '>';\r\n\r\n // 渲染子节点\r\n if (shapeFlag & ShapeFlags.TEXT_CHILDREN) {\r\n const text = isFunction(children) ? '' : String(children ?? '');\r\n html += escapeHtml(text);\r\n } else if (shapeFlag & ShapeFlags.ARRAY_CHILDREN && isArray(children)) {\r\n for (let i = 0; i < children.length; i++) {\r\n const child = children[i];\r\n if (child != null) {\r\n html += renderVNodeToString(child);\r\n }\r\n }\r\n }\r\n\r\n html += `</${tag}>`;\r\n return html;\r\n}\r\n"]}
package/dist/ssr.d.cts ADDED
@@ -0,0 +1,21 @@
1
+ import { VNode } from '@lytjs/vdom';
2
+
3
+ /**
4
+ * @lytjs/renderer - SSR 渲染器
5
+ * 服务端渲染为字符串
6
+ * FIX: P2-36 使用共享工具函数
7
+ */
8
+
9
+ interface SSRInput {
10
+ vnode: VNode;
11
+ }
12
+ /**
13
+ * 将 VNode 渲染为 HTML 字符串。
14
+ *
15
+ * 返回 Promise 以支持未来的 Suspense/异步组件。
16
+ * 当组件包含异步子组件(如 Suspense 边界)时,
17
+ * 渲染过程需要等待异步数据加载完成后才能输出 HTML。
18
+ */
19
+ declare function renderToString(input: SSRInput): Promise<string>;
20
+
21
+ export { type SSRInput, renderToString };
package/dist/ssr.d.ts ADDED
@@ -0,0 +1,21 @@
1
+ import { VNode } from '@lytjs/vdom';
2
+
3
+ /**
4
+ * @lytjs/renderer - SSR 渲染器
5
+ * 服务端渲染为字符串
6
+ * FIX: P2-36 使用共享工具函数
7
+ */
8
+
9
+ interface SSRInput {
10
+ vnode: VNode;
11
+ }
12
+ /**
13
+ * 将 VNode 渲染为 HTML 字符串。
14
+ *
15
+ * 返回 Promise 以支持未来的 Suspense/异步组件。
16
+ * 当组件包含异步子组件(如 Suspense 边界)时,
17
+ * 渲染过程需要等待异步数据加载完成后才能输出 HTML。
18
+ */
19
+ declare function renderToString(input: SSRInput): Promise<string>;
20
+
21
+ export { type SSRInput, renderToString };