@lytjs/renderer 5.0.1 → 6.0.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 (92) 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 +3312 -1
  9. package/dist/index.cjs.map +1 -0
  10. package/dist/index.d.cts +1004 -0
  11. package/dist/index.d.ts +1004 -0
  12. package/dist/index.mjs +3190 -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/package.json +35 -58
  21. package/dist/miniapp.cjs +0 -27
  22. package/dist/miniapp.mjs +0 -27
  23. package/dist/native.cjs +0 -1
  24. package/dist/native.mjs +0 -1
  25. package/dist/types/create-renderer.d.ts +0 -20
  26. package/dist/types/create-renderer.d.ts.map +0 -1
  27. package/dist/types/dom/dom-ops.d.ts +0 -74
  28. package/dist/types/dom/dom-ops.d.ts.map +0 -1
  29. package/dist/types/dom/dom-renderer.d.ts +0 -243
  30. package/dist/types/dom/dom-renderer.d.ts.map +0 -1
  31. package/dist/types/dom/index.d.ts +0 -17
  32. package/dist/types/dom/index.d.ts.map +0 -1
  33. package/dist/types/dom/patch-events.d.ts +0 -123
  34. package/dist/types/dom/patch-events.d.ts.map +0 -1
  35. package/dist/types/dom/patch-props.d.ts +0 -118
  36. package/dist/types/dom/patch-props.d.ts.map +0 -1
  37. package/dist/types/index.d.ts +0 -36
  38. package/dist/types/index.d.ts.map +0 -1
  39. package/dist/types/miniapp/api-adapter.d.ts +0 -514
  40. package/dist/types/miniapp/api-adapter.d.ts.map +0 -1
  41. package/dist/types/miniapp/index.d.ts +0 -34
  42. package/dist/types/miniapp/index.d.ts.map +0 -1
  43. package/dist/types/miniapp/miniapp-compiler.d.ts +0 -269
  44. package/dist/types/miniapp/miniapp-compiler.d.ts.map +0 -1
  45. package/dist/types/miniapp/miniapp-event-bridge.d.ts +0 -255
  46. package/dist/types/miniapp/miniapp-event-bridge.d.ts.map +0 -1
  47. package/dist/types/miniapp/miniapp-lifecycle.d.ts +0 -224
  48. package/dist/types/miniapp/miniapp-lifecycle.d.ts.map +0 -1
  49. package/dist/types/miniapp/miniapp-renderer.d.ts +0 -269
  50. package/dist/types/miniapp/miniapp-renderer.d.ts.map +0 -1
  51. package/dist/types/miniapp/miniapp-utils.d.ts +0 -168
  52. package/dist/types/miniapp/miniapp-utils.d.ts.map +0 -1
  53. package/dist/types/miniapp/shared-constants.d.ts +0 -28
  54. package/dist/types/miniapp/shared-constants.d.ts.map +0 -1
  55. package/dist/types/miniapp/style-compiler.d.ts +0 -193
  56. package/dist/types/miniapp/style-compiler.d.ts.map +0 -1
  57. package/dist/types/mount.d.ts +0 -32
  58. package/dist/types/mount.d.ts.map +0 -1
  59. package/dist/types/native/index.d.ts +0 -13
  60. package/dist/types/native/index.d.ts.map +0 -1
  61. package/dist/types/native/native-renderer.d.ts +0 -249
  62. package/dist/types/native/native-renderer.d.ts.map +0 -1
  63. package/dist/types/patch.d.ts +0 -23
  64. package/dist/types/patch.d.ts.map +0 -1
  65. package/dist/types/props.d.ts +0 -19
  66. package/dist/types/props.d.ts.map +0 -1
  67. package/dist/types/renderer-interfaces.d.ts +0 -157
  68. package/dist/types/renderer-interfaces.d.ts.map +0 -1
  69. package/dist/types/shared/abstract-renderer.d.ts +0 -74
  70. package/dist/types/shared/abstract-renderer.d.ts.map +0 -1
  71. package/dist/types/ssr/hydration.d.ts +0 -267
  72. package/dist/types/ssr/hydration.d.ts.map +0 -1
  73. package/dist/types/ssr/index.d.ts +0 -15
  74. package/dist/types/ssr/index.d.ts.map +0 -1
  75. package/dist/types/ssr/ssr-renderer.d.ts +0 -277
  76. package/dist/types/ssr/ssr-renderer.d.ts.map +0 -1
  77. package/dist/types/unmount.d.ts +0 -16
  78. package/dist/types/unmount.d.ts.map +0 -1
  79. package/dist/types/vapor/index.d.ts +0 -18
  80. package/dist/types/vapor/index.d.ts.map +0 -1
  81. package/dist/types/vapor/vapor-compiler.d.ts +0 -76
  82. package/dist/types/vapor/vapor-compiler.d.ts.map +0 -1
  83. package/dist/types/vapor/vapor-component.d.ts +0 -55
  84. package/dist/types/vapor/vapor-component.d.ts.map +0 -1
  85. package/dist/types/vapor/vapor-reactive.d.ts +0 -133
  86. package/dist/types/vapor/vapor-reactive.d.ts.map +0 -1
  87. package/dist/types/vapor/vapor-renderer.d.ts +0 -135
  88. package/dist/types/vapor/vapor-renderer.d.ts.map +0 -1
  89. package/dist/types/vnode.d.ts +0 -203
  90. package/dist/types/vnode.d.ts.map +0 -1
  91. package/dist/vapor.cjs +0 -1
  92. package/dist/vapor.mjs +0 -1
package/dist/ssr.mjs CHANGED
@@ -1 +1,308 @@
1
- import{registerDOMOperations as Ee}from"@lytjs/vdom";var x=(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))(x||{}),j=(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))(j||{}),te=Symbol("Fragment"),ne=Symbol("Text"),re=Symbol("Comment");function C(t){return t.type===te}function _(t){return t.type===ne}function M(t){return t.type===re}function oe(t,e){return t.type===e.type&&t.key===e.key}function F(t){return Array.isArray(t.dynamicChildren)}function se(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 W(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 G(t,e,n,r){for(let o in r){if(o==="key"||o==="ref")continue;let s=n[o],i=r[o];i!==s&&W(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 U(t,e,n,r,o,s){let{shapeFlag:i}=n;if(C(n)){me(t,e,n,r,o,s);return}if(_(n)){let a=t.createText(n.children);n.el=a,t.insert(r,a,o);return}if(M(n)){let a=t.createComment(n.children);n.el=a,t.insert(r,a,o);return}if(i&1){fe(t,e,n,r,o,s);return}if(i&6){pe(e,n,r,o,s);return}}function fe(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];se(t,a,d,f)}let{shapeFlag:l,children:c}=n;l&8?a.textContent=c:l&16&&I(e,c,a,null,s),t.insert(r,a,o)}function I(t,e,n,r,o){for(let s=0;s<e.length;s++)t(null,e[s],n,r,o)}function me(t,e,n,r,o,s){let{children:i}=n,a=t.createComment("");t.insert(r,a,o),Array.isArray(i)&&i.length>0&&I(e,i,r,a,s),n.el=a,n.anchor=a}function pe(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 ie(t,e,n,r){let{shapeFlag:o,children:s}=n;if(C(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 O(t,e){for(let n=0;n<e.length;n++)t(e[n])}import{patchKeyedChildren as ge,patchUnkeyedChildren as he}from"@lytjs/vdom";function $(t,e,n,r,o,s=null,i=null){if(r==null){n&&e(n,o);return}if(n===null){U(t,Y(t,e),r,o,s,i);return}if(F(r)&&F(n)){Le(t,e,n,r,o,i);return}if(!oe(n,r)){e(n,o),U(t,Y(t,e),r,o,s,i);return}r.el=n.el,r.anchor=n.anchor;let{shapeFlag:a}=r;if(C(r)){Se(t,e,n,r,o,s,i);return}if(_(r)){r.children!==n.children&&(r.el.nodeValue=r.children);return}if(M(r)){r.children!==n.children&&(r.el.nodeValue=r.children);return}if(a&1){Ne(t,e,n,r,i);return}if(a&6){Ve(n,r,i);return}}function Y(t,e){return(n,r,o,s,i)=>{$(t,e,n,r,o,s,i)}}function Ne(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&&W(t,s,f,N,u)}l&16&&G(t,s,i,a)}else G(t,s,i,a);(!l||!(l&1))&&ae(t,e,n,r,s,null,o)}function ae(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&&O(e,c),c!==d&&(o.textContent=d);return}if(l&16){a&16?Te(t,e,c,d,o,s,i):(a&8&&(o.textContent=""),I(Y(t,e),d,o,s,i));return}d==null&&(a&8?o.textContent="":a&16&&O(e,c))}function Te(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)?ge(n,r,o,s,i,null,!1):he(n,r,o,s,i,null,!1)}function Se(t,e,n,r,o,s,i){let a=n.children,l=r.children;Array.isArray(l)&&l.length>0?(ae(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?(O(e,a),r.el=n.el,r.anchor=n.anchor):(r.el=n.el,r.anchor=n.anchor)}function Le(t,e,n,r,o,s){let i=n.dynamicChildren,a=r.dynamicChildren;for(let l=0;l<a.length;l++)$(t,e,i[l],a[l],o,null,s)}function Ve(t,e,n){e.component=t.component,e.el=t.el,e.component&&e.component.update&&e.component.update()}function be(t){function e(o,s){ie(t,e,o,s)}Ee({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){$(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)}}}import{ShapeFlags as h}from"@lytjs/vdom";import{normalizeClass as He,normalizeStyle as Ae}from"@lytjs/common";var z=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]),Ce={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},Re=/[&<>"']/g;var xe=0;function y(t){return t.replace(Re,e=>Ce[e])}function _e(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(He(e))}"`:t==="style"?`style="${y(Ae(e))}"`:t==="dangerouslySetInnerHTML"||t==="innerHTML"?"":`${t}="${y(String(e))}"`}function X(t){if(!t)return"";let e=[];for(let n in t){let r=t[n],o=_e(n,r);o&&e.push(o)}return e.length>0?" "+e.join(" "):""}var w=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*v(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"?Me(e,n,r,t):typeof e=="object"&&e!==null||typeof e=="function"?R(t):""}function Me(t,e,n,r){let o=X(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.TEXT_CHILDREN?s=y(String(n||"")):i&h.ARRAY_CHILDREN&&Array.isArray(n)?s=n.map(a=>m(a)).join(""):i&h.SLOTS_CHILDREN&&typeof n=="object"&&n!==null?s=q(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 q(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 R(t){let e=t.type;if(e&&e.__island)return Ie(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 Ie(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*v(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*v(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*Oe(e,n,r,t);return}if(typeof e=="object"||typeof e=="function"){yield R(t);return}}async function*Oe(t,e,n,r){let o=X(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.TEXT_CHILDREN)yield y(String(n||""));else if(s&h.ARRAY_CHILDREN&&Array.isArray(n))for(let i of n)yield*v(i);else if(s&h.SLOTS_CHILDREN&&typeof n=="object"&&n!==null)yield q(n);else if(typeof n=="string")yield y(n);else if(Array.isArray(n))for(let i of n)yield*v(i);else typeof n=="number"&&(yield y(String(n)));yield`</${t}>`}function $e(t){return m(t)}function we(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*ve(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*ke(n,r,o,t,e);return}if(typeof n=="object"&&n!==null){let s=n;if(s.name==="Suspense"||s._isSuspense){yield*De(t,e);return}if(s._isAsyncComponent||s.__asyncSetup){yield*Pe(t,e);return}yield R(t);return}if(typeof n=="function"){yield R(t);return}}async function*ke(t,e,n,r,o){let s=X(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.TEXT_CHILDREN)yield y(String(n||""));else if(i&h.ARRAY_CHILDREN&&Array.isArray(n))for(let a of n)yield*S(a,o);else if(i&h.SLOTS_CHILDREN&&typeof n=="object"&&n!==null)yield q(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*De(t,e){let n=`${e}-${xe++}`,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*Pe(t,e){let n=t.type,r=t.__asyncPromise||n.__asyncPromise;if(r)try{await r}catch(o){yield"<!--async-component-error-->";return}yield R(t)}var je=new w;import{LytError as Fe,LytErrorCodes as We}from"@lytjs/common";var D={ELEMENT:1,FUNCTIONAL_COMPONENT:2,STATEFUL_COMPONENT:4,TEXT_CHILDREN:8,ARRAY_CHILDREN:16,SLOTS_CHILDREN:32},g=!1,Q=[],B=!1,p={success:!0,mismatches:0,hydratedNodes:0};function Ge(){return g}function Ue(t){g=t}function Ye(){return{...p}}function ce(){p={success:!0,mismatches:0,hydratedNodes:0}}function ze(t){g?Q.push(t):t()}function Xe(t,e,n={}){ce(),n.onHydrated&&Q.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,J(),p):(g=!1,t.mount(e),p.success=!1,J(),p)}catch(r){return g=!1,p.success=!1,e.innerHTML="",t.mount(e),J(),p}}function J(){if(B)return;B=!0;let t=Q.splice(0);for(let e of t)try{e()}catch(n){}B=!1}function V(t,e,n){if(tt(e)){Ke(t,e,n);return}if(nt(e)){Be(t,e,n);return}if(rt(e)){Je(t,e,n);return}if(ot(e)){Qe(t,e,n);return}if(typeof e.type=="string"){qe(t,e,n);return}}function qe(t,e,n){let r=t.tagName.toLowerCase(),o=e.type.toLowerCase();if(r!==o){P(t,e,`\u6807\u7B7E\u4E0D\u5339\u914D: DOM "${r}" vs VNode "${o}"`,n);return}e.el=t,e.props&&Z(t,e.props),e.ref&&et(t,e.ref),Ze(t,e,n),p.hydratedNodes++}function Be(t,e,n){if(t.nodeType!==3){P(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 Je(t,e,n){if(t.nodeType!==8){P(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 Ke(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 Qe(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){}P(t,e,"\u7EC4\u4EF6\u65E0\u6CD5\u83B7\u53D6 subTree",n)}function Ze(t,e,n){if(!e.children)return;let r=e.shapeFlag||0;if(typeof e.children=="string"||r&D.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&D.SLOTS_CHILDREN&&typeof e.children=="object"&&e.children}function Z(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 et(t,e){typeof e=="function"?e(t):e&&typeof e=="object"&&(e.current=t)}function tt(t){return typeof t.type=="symbol"&&String(t.type)==="Symbol(Fragment)"}function nt(t){return typeof t.type=="symbol"&&String(t.type).includes("Text")}function rt(t){return typeof t.type=="symbol"&&String(t.type).includes("Comment")}function ot(t){return!!((t.shapeFlag||0)&(D.STATEFUL_COMPONENT|D.FUNCTIONAL_COMPONENT)||typeof t.type=="object"&&t.type!==null||typeof t.type=="function")}function P(t,e,n,r){let o=`[lyt] \u6CE8\u6C34\u4E0D\u5339\u914D: ${n}`;if(p.mismatches++,r.strict)throw new Fe(We.LYT_SSR_HYDRATION_ERROR,o)}var b=new Map,A=new Map,de={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},st=/[&<>"']/g;function E(t){return t.replace(st,e=>de[e])}function K(t){return t.replace(/[&<>"']/g,e=>de[e])}function ue(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=it(s,r);if(i===null)return{success:!1,mismatches:0,hydratedNodes:0};let a=o.getAttribute("data-hydrate-when");return a||n.lazy?at(o,s,e,i,a||"visible",n):L(o,s,e,i,n)}function it(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=pt(t,i,e);s.mismatches=l}V(t,i,o),s.hydratedNodes=p.hydratedNodes,i.props&&Z(t,i.props),k(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),A.set(e,n),g=!1,o.onHydrated&&o.onHydrated(),s}catch(i){return g=!1,s.success=!1,s}}function k(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)Z(n[o],s.props),k(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]&&k(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]&&k(n[o],a)}catch(a){}}r++}}}function at(t,e,n,r,o,s){let i={success:!0,mismatches:0,hydratedNodes:0},a=null;s.timeout&&s.timeout>0&&(a=setTimeout(()=>{ye(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),A.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 ye(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 lt(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=A.get(s);if(!i){r.success=!1;return}let a=ue(`[data-hydrate="${s}"]`,i,t);r.mismatches+=a.mismatches,r.hydratedNodes+=a.hydratedNodes,a.success||(r.success=!1)}),r}function ct(t,e){A.set(t,e)}function dt(t){if(!b.get(t))return;let n=typeof document!="undefined"?document.querySelector(`[data-hydrate="${t}"]`):null;n&&(ye(n,t),n.removeAttribute("data-hydrated")),b.delete(t),A.delete(t)}function ut(){return b}function yt(){b.clear(),A.clear()}function ft(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=H(u)}let l=r?` data-hydrate-when="${K(r)}"`:"",c=K(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 H(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=>H(o)).join(""):"";if(typeof e=="symbol"&&String(e).includes("Text"))return E(String(r||""));if(typeof e=="symbol"&&String(e).includes("Comment"))return`<!--${K(String(r||""))}-->`;if(typeof e=="string"){let o=mt(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=>H(a)).join(""):typeof r=="number"&&(i=E(String(r))),`<${e}${o}>${i}</${e}>`}if(typeof e=="function"){let o=e(n||{},{slots:r||{}});return H(o)}if(typeof e=="object"&&e!==null){let o=e;if(typeof o.render=="function"){let s=o.render(n||{},{slots:r||{},emit:()=>{}});return H(s)}}return""}function mt(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 ee=[];function pt(t,e,n){let r=0,o=gt(t),s=H(e);if(o!==s){r++;let i={islandId:n,expected:s,actual:o,suggestion:ht(o,s,n)};ee.push(i)}return r}function gt(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 ht(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":le(t)===le(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 le(t){return t.replace(/\s+/g," ").replace(/>\s+</g,"><").trim()}function Nt(){return[...ee]}function Tt(){ee.length=0}export{re as Comment,te as Fragment,j as PatchFlags,x as ShapeFlags,w as StringRenderer,ne as Text,yt as clearIslandRegistry,Tt as clearMismatchWarnings,ft as createHydrationIsland,be as createRenderer,Ye as getHydrateStats,ut as getIslandRegistry,Nt as getMismatchWarnings,Xe as hydrate,lt as hydrateAllIslands,ue as hydrateIsland,Ge as isHydrating,ze as onHydrated,ct as registerIslandComponent,we as renderToStream,ve as renderToStreamGenerator,$e as renderToString,ce as resetHydrateStats,Ue as setHydrating,je as ssrRenderer,dt as unmountIsland};
1
+ import { Fragment, Text, Comment, ShapeFlags } from '@lytjs/vdom';
2
+ import { isFunction, isArray, isNullish, isString, isObject } from '@lytjs/common-is';
3
+ import { escapeHtml, camelToKebab, isBooleanAttr, VOID_ELEMENTS } from '@lytjs/common-string';
4
+ import '@lytjs/common-error';
5
+
6
+ // src/ssr/ssr-renderer.ts
7
+ function isVoidElement(tag) {
8
+ return VOID_ELEMENTS.has(tag);
9
+ }
10
+ function isValidHTMLElementTag(tag) {
11
+ return /^[a-z][a-z0-9-]*$/.test(tag);
12
+ }
13
+ var URL_ATTRS = /* @__PURE__ */ new Set([
14
+ "href",
15
+ "src",
16
+ "action",
17
+ "formaction",
18
+ "xlink:href",
19
+ "data",
20
+ "srcdoc"
21
+ ]);
22
+ var NAMED_ENTITIES = {
23
+ "&colon;": ":",
24
+ "&tab;": " ",
25
+ "&newline;": "\n",
26
+ "&lpar;": "(",
27
+ "&rpar;": ")",
28
+ "&nbsp;": "\xA0",
29
+ "&copy;": "\xA9",
30
+ "&reg;": "\xAE",
31
+ "&trade;": "\u2122",
32
+ "&times;": "\xD7",
33
+ "&divide;": "\xF7",
34
+ "&pound;": "\xA3",
35
+ "&yen;": "\xA5",
36
+ "&cent;": "\xA2",
37
+ "&sect;": "\xA7",
38
+ "&para;": "\xB6",
39
+ "&middot;": "\xB7",
40
+ "&laquo;": "\xAB",
41
+ "&raquo;": "\xBB",
42
+ "&iexcl;": "\xA1",
43
+ "&iquest;": "\xBF",
44
+ "&deg;": "\xB0",
45
+ "&plusmn;": "\xB1",
46
+ "&micro;": "\xB5",
47
+ "&frac14;": "\xBC",
48
+ "&frac12;": "\xBD",
49
+ "&frac34;": "\xBE",
50
+ "&sup1;": "\xB9",
51
+ "&sup2;": "\xB2",
52
+ "&sup3;": "\xB3",
53
+ "&acute;": "\xB4",
54
+ "&cedil;": "\xB8",
55
+ "&ordf;": "\xAA",
56
+ "&not;": "\xAC",
57
+ "&shy;": "\xAD",
58
+ "&macr;": "\xAF",
59
+ "&uml;": "\xA8",
60
+ "&circ;": "\u02C6",
61
+ "&tilde;": "\u02DC",
62
+ "&ensp;": "\u2002",
63
+ "&emsp;": "\u2003",
64
+ "&thinsp;": "\u2009",
65
+ "&zwnj;": "\u200C",
66
+ "&zwj;": "\u200D",
67
+ "&lrm;": "\u200E",
68
+ "&rlm;": "\u200F",
69
+ "&ndash;": "\u2013",
70
+ "&mdash;": "\u2014",
71
+ "&lsquo;": "\u2018",
72
+ "&rsquo;": "\u2019",
73
+ "&sbquo;": "\u201A",
74
+ "&ldquo;": "\u201C",
75
+ "&rdquo;": "\u201D",
76
+ "&bdquo;": "\u201E",
77
+ "&dagger;": "\u2020",
78
+ "&Dagger;": "\u2021",
79
+ "&bull;": "\u2022",
80
+ "&hellip;": "\u2026",
81
+ "&permil;": "\u2030",
82
+ "&prime;": "\u2032",
83
+ "&Prime;": "\u2033",
84
+ "&lsaquo;": "\u2039",
85
+ "&rsaquo;": "\u203A",
86
+ "&oline;": "\u203E",
87
+ "&frasl;": "\u2044",
88
+ "&euro;": "\u20AC",
89
+ "&larr;": "\u2190",
90
+ "&uarr;": "\u2191",
91
+ "&rarr;": "\u2192",
92
+ "&darr;": "\u2193",
93
+ "&harr;": "\u2194",
94
+ "&crarr;": "\u21B5",
95
+ "&lceil;": "\u2308",
96
+ "&rceil;": "\u2309",
97
+ "&lfloor;": "\u230A",
98
+ "&rfloor;": "\u230B",
99
+ "&lang;": "\u27E8",
100
+ "&rang;": "\u27E9",
101
+ "&loz;": "\u25CA",
102
+ "&spades;": "\u2660",
103
+ "&clubs;": "\u2663",
104
+ "&hearts;": "\u2665",
105
+ "&diams;": "\u2666",
106
+ "&OElig;": "\u0152",
107
+ "&oelig;": "\u0153",
108
+ "&Scaron;": "\u0160",
109
+ "&scaron;": "\u0161",
110
+ "&Yuml;": "\u0178",
111
+ "&fnof;": "\u0192",
112
+ "&Alpha;": "\u0391",
113
+ "&Beta;": "\u0392",
114
+ "&Gamma;": "\u0393",
115
+ "&Delta;": "\u0394",
116
+ "&Epsilon;": "\u0395",
117
+ "&Zeta;": "\u0396",
118
+ "&Eta;": "\u0397",
119
+ "&Theta;": "\u0398",
120
+ "&Iota;": "\u0399",
121
+ "&Kappa;": "\u039A",
122
+ "&Lambda;": "\u039B",
123
+ "&Mu;": "\u039C",
124
+ "&Nu;": "\u039D",
125
+ "&Xi;": "\u039E",
126
+ "&Omicron;": "\u039F",
127
+ "&Pi;": "\u03A0",
128
+ "&Rho;": "\u03A1",
129
+ "&Sigma;": "\u03A3",
130
+ "&Tau;": "\u03A4",
131
+ "&Upsilon;": "\u03A5",
132
+ "&Phi;": "\u03A6",
133
+ "&Chi;": "\u03A7",
134
+ "&Psi;": "\u03A8",
135
+ "&Omega;": "\u03A9",
136
+ "&alpha;": "\u03B1",
137
+ "&beta;": "\u03B2",
138
+ "&gamma;": "\u03B3",
139
+ "&delta;": "\u03B4",
140
+ "&epsilon;": "\u03B5",
141
+ "&zeta;": "\u03B6",
142
+ "&eta;": "\u03B7",
143
+ "&theta;": "\u03B8",
144
+ "&iota;": "\u03B9",
145
+ "&kappa;": "\u03BA",
146
+ "&lambda;": "\u03BB",
147
+ "&mu;": "\u03BC",
148
+ "&nu;": "\u03BD",
149
+ "&xi;": "\u03BE",
150
+ "&omicron;": "\u03BF",
151
+ "&pi;": "\u03C0",
152
+ "&rho;": "\u03C1",
153
+ "&sigmaf;": "\u03C2",
154
+ "&sigma;": "\u03C3",
155
+ "&tau;": "\u03C4",
156
+ "&upsilon;": "\u03C5",
157
+ "&phi;": "\u03C6",
158
+ "&chi;": "\u03C7",
159
+ "&psi;": "\u03C8",
160
+ "&omega;": "\u03C9",
161
+ "&thetasym;": "\u03D1",
162
+ "&upsih;": "\u03D2",
163
+ "&piv;": "\u03D6",
164
+ "&apos;": "'",
165
+ "&quot;": '"',
166
+ "&amp;": "&",
167
+ "&lt;": "<",
168
+ "&gt;": ">"
169
+ };
170
+ var NAMED_ENTITY_REGEX = new RegExp(
171
+ Object.keys(NAMED_ENTITIES).map((e) => e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|"),
172
+ "g"
173
+ );
174
+ var NUMERIC_ENTITY_REGEX = /&#x?[0-9a-f]+;/gi;
175
+ function isSafeURL(url) {
176
+ let decoded = url;
177
+ let prev = "";
178
+ let maxIterations = 10;
179
+ while (decoded !== prev && maxIterations-- > 0) {
180
+ prev = decoded;
181
+ decoded = decoded.replace(NUMERIC_ENTITY_REGEX, (match) => {
182
+ const codePoint = match.startsWith("&#x") ? parseInt(match.slice(3, -1), 16) : parseInt(match.slice(2, -1), 10);
183
+ if (isNaN(codePoint) || codePoint < 0 || codePoint > 1114111) {
184
+ return match;
185
+ }
186
+ return String.fromCodePoint(codePoint);
187
+ });
188
+ decoded = decoded.replace(NAMED_ENTITY_REGEX, (match) => NAMED_ENTITIES[match] || match);
189
+ }
190
+ try {
191
+ const parsed = new URL(decoded, "http://example.com");
192
+ const protocol = parsed.protocol.toLowerCase().replace(":", "");
193
+ if (protocol === "javascript") {
194
+ return false;
195
+ }
196
+ if (protocol === "data") {
197
+ if (/^data:image\/svg\+xml/i.test(decoded)) {
198
+ return false;
199
+ }
200
+ return /^data:image\/(png|jpeg|jpg|gif|webp|bmp|ico|avif);/i.test(decoded);
201
+ }
202
+ return true;
203
+ } catch {
204
+ return false;
205
+ }
206
+ }
207
+ function renderAttributeToString(key, value) {
208
+ if (isNullish(value)) return "";
209
+ if (/^on[A-Z]/.test(key)) return "";
210
+ if (key === "class") {
211
+ const classValue = value == null ? "" : String(value);
212
+ if (!classValue) return "";
213
+ return ` class="${escapeHtml(classValue)}"`;
214
+ }
215
+ if (key === "style") {
216
+ if (isString(value)) {
217
+ if (!value) return "";
218
+ return ` style="${escapeHtml(value)}"`;
219
+ }
220
+ if (isObject(value)) {
221
+ const styles = [];
222
+ for (const k in value) {
223
+ const val = value[k];
224
+ if (val != null && val !== "") {
225
+ styles.push(`${camelToKebab(k)}:${String(val)}`);
226
+ }
227
+ }
228
+ if (styles.length === 0) return "";
229
+ return ` style="${escapeHtml(styles.join(";"))}"`;
230
+ }
231
+ return "";
232
+ }
233
+ if (isBooleanAttr(key)) {
234
+ if (value === false || value === "") return "";
235
+ return ` ${key}`;
236
+ }
237
+ if (URL_ATTRS.has(key)) {
238
+ if (!isSafeURL(String(value))) {
239
+ return "";
240
+ }
241
+ }
242
+ return ` ${key}="${escapeHtml(String(value))}"`;
243
+ }
244
+ function renderToString(input) {
245
+ return Promise.resolve(renderVNodeToString(input.vnode));
246
+ }
247
+ function renderVNodeToString(vnode) {
248
+ const { type, shapeFlag, children } = vnode;
249
+ if (type === Fragment) {
250
+ return renderFragmentToString(vnode);
251
+ }
252
+ if (type === Text) {
253
+ const text = isFunction(children) ? "" : String(children ?? "");
254
+ return escapeHtml(text);
255
+ }
256
+ if (type === Comment) {
257
+ const text = isFunction(children) ? "" : String(children ?? "");
258
+ let safe = text.replace(/<!--/g, "&lt;!--").replace(/-->/g, "--&gt;");
259
+ safe = safe.replace(/--/g, "- -");
260
+ return `<!--${safe}-->`;
261
+ }
262
+ if (shapeFlag & ShapeFlags.ELEMENT) {
263
+ return renderElementToString(vnode);
264
+ }
265
+ return "";
266
+ }
267
+ function renderFragmentToString(vnode) {
268
+ const children = vnode.children;
269
+ if (isArray(children)) {
270
+ return children.map((child) => child != null ? renderVNodeToString(child) : "").join("");
271
+ }
272
+ return "";
273
+ }
274
+ function renderElementToString(vnode) {
275
+ const tag = vnode.type;
276
+ if (!isValidHTMLElementTag(tag)) {
277
+ return "";
278
+ }
279
+ const props = vnode.props ?? {};
280
+ const { shapeFlag, children } = vnode;
281
+ let html = `<${tag}`;
282
+ for (const key in props) {
283
+ if (key === "key" || key === "ref") continue;
284
+ html += renderAttributeToString(key, props[key]);
285
+ }
286
+ if (isVoidElement(tag)) {
287
+ html += " />";
288
+ return html;
289
+ }
290
+ html += ">";
291
+ if (shapeFlag & ShapeFlags.TEXT_CHILDREN) {
292
+ const text = isFunction(children) ? "" : String(children ?? "");
293
+ html += escapeHtml(text);
294
+ } else if (shapeFlag & ShapeFlags.ARRAY_CHILDREN && isArray(children)) {
295
+ for (let i = 0; i < children.length; i++) {
296
+ const child = children[i];
297
+ if (child != null) {
298
+ html += renderVNodeToString(child);
299
+ }
300
+ }
301
+ }
302
+ html += `</${tag}>`;
303
+ return html;
304
+ }
305
+
306
+ export { renderToString };
307
+ //# sourceMappingURL=ssr.mjs.map
308
+ //# sourceMappingURL=ssr.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils.ts","../src/ssr/ssr-utils.ts","../src/ssr/ssr-renderer.ts"],"names":[],"mappings":";;;;;;AAmBO,SAAS,cAAc,GAAA,EAAsB;AAClD,EAAA,OAAO,aAAA,CAAc,IAAI,GAAG,CAAA;AAC9B;ACDO,SAAS,sBAAsB,GAAA,EAAsB;AAC1D,EAAA,OAAO,mBAAA,CAAoB,KAAK,GAAG,CAAA;AACrC;AAQO,IAAM,SAAA,uBAAgB,GAAA,CAAI;AAAA,EAC/B,MAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAC,CAAA;AAGM,IAAM,cAAA,GAAyC;AAAA,EACpD,SAAA,EAAW,GAAA;AAAA,EACX,OAAA,EAAS,GAAA;AAAA,EACT,WAAA,EAAa,IAAA;AAAA,EACb,QAAA,EAAU,GAAA;AAAA,EACV,QAAA,EAAU,GAAA;AAAA,EACV,QAAA,EAAU,MAAA;AAAA,EACV,QAAA,EAAU,MAAA;AAAA,EACV,OAAA,EAAS,MAAA;AAAA,EACT,SAAA,EAAW,QAAA;AAAA,EACX,SAAA,EAAW,MAAA;AAAA,EACX,UAAA,EAAY,MAAA;AAAA,EACZ,SAAA,EAAW,MAAA;AAAA,EACX,OAAA,EAAS,MAAA;AAAA,EACT,QAAA,EAAU,MAAA;AAAA,EACV,QAAA,EAAU,MAAA;AAAA,EACV,QAAA,EAAU,MAAA;AAAA,EACV,UAAA,EAAY,MAAA;AAAA,EACZ,SAAA,EAAW,MAAA;AAAA,EACX,SAAA,EAAW,MAAA;AAAA,EACX,SAAA,EAAW,MAAA;AAAA,EACX,UAAA,EAAY,MAAA;AAAA,EACZ,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,MAAA;AAAA,EACZ,SAAA,EAAW,MAAA;AAAA,EACX,UAAA,EAAY,MAAA;AAAA,EACZ,UAAA,EAAY,MAAA;AAAA,EACZ,UAAA,EAAY,MAAA;AAAA,EACZ,QAAA,EAAU,MAAA;AAAA,EACV,QAAA,EAAU,MAAA;AAAA,EACV,QAAA,EAAU,MAAA;AAAA,EACV,SAAA,EAAW,MAAA;AAAA,EACX,SAAA,EAAW,MAAA;AAAA,EACX,QAAA,EAAU,MAAA;AAAA,EACV,OAAA,EAAS,MAAA;AAAA,EACT,OAAA,EAAS,MAAA;AAAA,EACT,QAAA,EAAU,MAAA;AAAA,EACV,OAAA,EAAS,MAAA;AAAA,EACT,QAAA,EAAU,QAAA;AAAA,EACV,SAAA,EAAW,QAAA;AAAA,EACX,QAAA,EAAU,QAAA;AAAA,EACV,QAAA,EAAU,QAAA;AAAA,EACV,UAAA,EAAY,QAAA;AAAA,EACZ,QAAA,EAAU,QAAA;AAAA,EACV,OAAA,EAAS,QAAA;AAAA,EACT,OAAA,EAAS,QAAA;AAAA,EACT,OAAA,EAAS,QAAA;AAAA,EACT,SAAA,EAAW,QAAA;AAAA,EACX,SAAA,EAAW,QAAA;AAAA,EACX,SAAA,EAAW,QAAA;AAAA,EACX,SAAA,EAAW,QAAA;AAAA,EACX,SAAA,EAAW,QAAA;AAAA,EACX,SAAA,EAAW,QAAA;AAAA,EACX,SAAA,EAAW,QAAA;AAAA,EACX,SAAA,EAAW,QAAA;AAAA,EACX,UAAA,EAAY,QAAA;AAAA,EACZ,UAAA,EAAY,QAAA;AAAA,EACZ,QAAA,EAAU,QAAA;AAAA,EACV,UAAA,EAAY,QAAA;AAAA,EACZ,UAAA,EAAY,QAAA;AAAA,EACZ,SAAA,EAAW,QAAA;AAAA,EACX,SAAA,EAAW,QAAA;AAAA,EACX,UAAA,EAAY,QAAA;AAAA,EACZ,UAAA,EAAY,QAAA;AAAA,EACZ,SAAA,EAAW,QAAA;AAAA,EACX,SAAA,EAAW,QAAA;AAAA,EACX,QAAA,EAAU,QAAA;AAAA,EACV,QAAA,EAAU,QAAA;AAAA,EACV,QAAA,EAAU,QAAA;AAAA,EACV,QAAA,EAAU,QAAA;AAAA,EACV,QAAA,EAAU,QAAA;AAAA,EACV,QAAA,EAAU,QAAA;AAAA,EACV,SAAA,EAAW,QAAA;AAAA,EACX,SAAA,EAAW,QAAA;AAAA,EACX,SAAA,EAAW,QAAA;AAAA,EACX,UAAA,EAAY,QAAA;AAAA,EACZ,UAAA,EAAY,QAAA;AAAA,EACZ,QAAA,EAAU,QAAA;AAAA,EACV,QAAA,EAAU,QAAA;AAAA,EACV,OAAA,EAAS,QAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,SAAA,EAAW,QAAA;AAAA,EACX,UAAA,EAAY,QAAA;AAAA,EACZ,SAAA,EAAW,QAAA;AAAA,EACX,SAAA,EAAW,QAAA;AAAA,EACX,SAAA,EAAW,QAAA;AAAA,EACX,UAAA,EAAY,QAAA;AAAA,EACZ,UAAA,EAAY,QAAA;AAAA,EACZ,QAAA,EAAU,QAAA;AAAA,EACV,QAAA,EAAU,QAAA;AAAA,EACV,SAAA,EAAW,QAAA;AAAA,EACX,QAAA,EAAU,QAAA;AAAA,EACV,SAAA,EAAW,QAAA;AAAA,EACX,SAAA,EAAW,QAAA;AAAA,EACX,WAAA,EAAa,QAAA;AAAA,EACb,QAAA,EAAU,QAAA;AAAA,EACV,OAAA,EAAS,QAAA;AAAA,EACT,SAAA,EAAW,QAAA;AAAA,EACX,QAAA,EAAU,QAAA;AAAA,EACV,SAAA,EAAW,QAAA;AAAA,EACX,UAAA,EAAY,QAAA;AAAA,EACZ,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ,QAAA;AAAA,EACR,WAAA,EAAa,QAAA;AAAA,EACb,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS,QAAA;AAAA,EACT,SAAA,EAAW,QAAA;AAAA,EACX,OAAA,EAAS,QAAA;AAAA,EACT,WAAA,EAAa,QAAA;AAAA,EACb,OAAA,EAAS,QAAA;AAAA,EACT,OAAA,EAAS,QAAA;AAAA,EACT,OAAA,EAAS,QAAA;AAAA,EACT,SAAA,EAAW,QAAA;AAAA,EACX,SAAA,EAAW,QAAA;AAAA,EACX,QAAA,EAAU,QAAA;AAAA,EACV,SAAA,EAAW,QAAA;AAAA,EACX,SAAA,EAAW,QAAA;AAAA,EACX,WAAA,EAAa,QAAA;AAAA,EACb,QAAA,EAAU,QAAA;AAAA,EACV,OAAA,EAAS,QAAA;AAAA,EACT,SAAA,EAAW,QAAA;AAAA,EACX,QAAA,EAAU,QAAA;AAAA,EACV,SAAA,EAAW,QAAA;AAAA,EACX,UAAA,EAAY,QAAA;AAAA,EACZ,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ,QAAA;AAAA,EACR,WAAA,EAAa,QAAA;AAAA,EACb,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS,QAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,SAAA,EAAW,QAAA;AAAA,EACX,OAAA,EAAS,QAAA;AAAA,EACT,WAAA,EAAa,QAAA;AAAA,EACb,OAAA,EAAS,QAAA;AAAA,EACT,OAAA,EAAS,QAAA;AAAA,EACT,OAAA,EAAS,QAAA;AAAA,EACT,SAAA,EAAW,QAAA;AAAA,EACX,YAAA,EAAc,QAAA;AAAA,EACd,SAAA,EAAW,QAAA;AAAA,EACX,OAAA,EAAS,QAAA;AAAA,EACT,QAAA,EAAU,GAAA;AAAA,EACV,QAAA,EAAU,GAAA;AAAA,EACV,OAAA,EAAS,GAAA;AAAA,EACT,MAAA,EAAQ,GAAA;AAAA,EACR,MAAA,EAAQ;AACV,CAAA;AAGA,IAAM,qBAAqB,IAAI,MAAA;AAAA,EAC7B,MAAA,CAAO,IAAA,CAAK,cAAc,CAAA,CACvB,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAC,CAAA,CACnD,KAAK,GAAG,CAAA;AAAA,EACX;AACF,CAAA;AAGA,IAAM,oBAAA,GAAuB,kBAAA;AAOtB,SAAS,UAAU,GAAA,EAAsB;AAE9C,EAAA,IAAI,OAAA,GAAU,GAAA;AACd,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,IAAI,aAAA,GAAgB,EAAA;AACpB,EAAA,OAAO,OAAA,KAAY,IAAA,IAAQ,aAAA,EAAA,GAAkB,CAAA,EAAG;AAC9C,IAAA,IAAA,GAAO,OAAA;AACP,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,oBAAA,EAAsB,CAAC,KAAA,KAAU;AACzD,MAAA,MAAM,YAAY,KAAA,CAAM,UAAA,CAAW,KAAK,CAAA,GACpC,QAAA,CAAS,MAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,EAAG,EAAE,IAC/B,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA,EAAG,EAAE,GAAG,EAAE,CAAA;AAEnC,MAAA,IAAI,MAAM,SAAS,CAAA,IAAK,SAAA,GAAY,CAAA,IAAK,YAAY,OAAA,EAAU;AAC7D,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,OAAO,MAAA,CAAO,cAAc,SAAS,CAAA;AAAA,IACvC,CAAC,CAAA;AAED,IAAA,OAAA,GAAU,OAAA,CAAQ,QAAQ,kBAAA,EAAoB,CAAC,UAAU,cAAA,CAAe,KAAK,KAAK,KAAK,CAAA;AAAA,EACzF;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,OAAA,EAAS,oBAAoB,CAAA;AACpD,IAAA,MAAM,WAAW,MAAA,CAAO,QAAA,CAAS,aAAY,CAAE,OAAA,CAAQ,KAAK,EAAE,CAAA;AAC9D,IAAA,IAAI,aAAa,YAAA,EAAc;AAC7B,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,aAAa,MAAA,EAAQ;AAEvB,MAAA,IAAI,wBAAA,CAAyB,IAAA,CAAK,OAAO,CAAA,EAAG;AAC1C,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,OAAO,qDAAA,CAAsD,KAAK,OAAO,CAAA;AAAA,IAC3E;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAYO,SAAS,uBAAA,CAAwB,KAAa,KAAA,EAAwB;AAE3E,EAAA,IAAI,SAAA,CAAU,KAAK,CAAA,EAAG,OAAO,EAAA;AAG7B,EAAA,IAAI,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA,EAAG,OAAO,EAAA;AAGjC,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,MAAM,UAAA,GAAa,KAAA,IAAS,IAAA,GAAO,EAAA,GAAK,OAAO,KAAK,CAAA;AACpD,IAAA,IAAI,CAAC,YAAY,OAAO,EAAA;AACxB,IAAA,OAAO,CAAA,QAAA,EAAW,UAAA,CAAW,UAAU,CAAC,CAAA,CAAA,CAAA;AAAA,EAC1C;AAGA,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,IAAI,QAAA,CAAS,KAAK,CAAA,EAAG;AACnB,MAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AACnB,MAAA,OAAO,CAAA,QAAA,EAAW,UAAA,CAAW,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,IACrC;AACA,IAAA,IAAI,QAAA,CAAS,KAAK,CAAA,EAAG;AACnB,MAAA,MAAM,SAAmB,EAAC;AAC1B,MAAA,KAAA,MAAW,KAAK,KAAA,EAAkC;AAChD,QAAA,MAAM,GAAA,GAAO,MAAkC,CAAC,CAAA;AAChD,QAAA,IAAI,GAAA,IAAO,IAAA,IAAQ,GAAA,KAAQ,EAAA,EAAI;AAC7B,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,YAAA,CAAa,CAAC,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,QACjD;AAAA,MACF;AACA,MAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAChC,MAAA,OAAO,WAAW,UAAA,CAAW,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,IAChD;AACA,IAAA,OAAO,EAAA;AAAA,EACT;AAGA,EAAA,IAAI,aAAA,CAAc,GAAG,CAAA,EAAG;AACtB,IAAA,IAAI,KAAA,KAAU,KAAA,IAAS,KAAA,KAAU,EAAA,EAAI,OAAO,EAAA;AAC5C,IAAA,OAAO,IAAI,GAAG,CAAA,CAAA;AAAA,EAChB;AAGA,EAAA,IAAI,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,EAAG;AACtB,IAAA,IAAI,CAAC,SAAA,CAAU,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG;AAI7B,MAAA,OAAO,EAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,OAAO,IAAI,GAAG,CAAA,EAAA,EAAK,WAAW,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA,CAAA,CAAA;AAC9C;ACzRO,SAAS,eAAe,KAAA,EAAkC;AAC/D,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,mBAAA,CAAoB,KAAA,CAAM,KAAK,CAAC,CAAA;AACzD;AAMA,SAAS,oBAAoB,KAAA,EAAsB;AACjD,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,QAAA,EAAS,GAAI,KAAA;AAGtC,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,OAAO,uBAAuB,KAAK,CAAA;AAAA,EACrC;AAGA,EAAA,IAAI,SAAS,IAAA,EAAM;AACjB,IAAA,MAAM,OAAO,UAAA,CAAW,QAAQ,IAAI,EAAA,GAAK,MAAA,CAAO,YAAY,EAAE,CAAA;AAC9D,IAAA,OAAO,WAAW,IAAI,CAAA;AAAA,EACxB;AAGA,EAAA,IAAI,SAAS,OAAA,EAAS;AACpB,IAAA,MAAM,OAAO,UAAA,CAAW,QAAQ,IAAI,EAAA,GAAK,MAAA,CAAO,YAAY,EAAE,CAAA;AAG9D,IAAA,IAAI,IAAA,GAAO,KAAK,OAAA,CAAQ,OAAA,EAAS,SAAS,CAAA,CAAE,OAAA,CAAQ,QAAQ,QAAQ,CAAA;AACpE,IAAA,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,KAAK,CAAA;AAChC,IAAA,OAAO,OAAO,IAAI,CAAA,GAAA,CAAA;AAAA,EACpB;AAGA,EAAA,IAAI,SAAA,GAAY,WAAW,OAAA,EAAS;AAClC,IAAA,OAAO,sBAAsB,KAAK,CAAA;AAAA,EACpC;AAEA,EAAA,OAAO,EAAA;AACT;AAMA,SAAS,uBAAuB,KAAA,EAAsB;AACpD,EAAA,MAAM,WAAW,KAAA,CAAM,QAAA;AACvB,EAAA,IAAI,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACrB,IAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,KAAA,KAAW,KAAA,IAAS,IAAA,GAAO,mBAAA,CAAoB,KAAK,CAAA,GAAI,EAAG,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAAA,EAC3F;AACA,EAAA,OAAO,EAAA;AACT;AAMA,SAAS,sBAAsB,KAAA,EAAsB;AACnD,EAAA,MAAM,MAAM,KAAA,CAAM,IAAA;AAElB,EAAA,IAAI,CAAC,qBAAA,CAAsB,GAAG,CAAA,EAAG;AAI/B,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,IAAS,EAAC;AAC9B,EAAA,MAAM,EAAE,SAAA,EAAW,QAAA,EAAS,GAAI,KAAA;AAGhC,EAAA,IAAI,IAAA,GAAO,IAAI,GAAG,CAAA,CAAA;AAGlB,EAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,IAAA,IAAI,GAAA,KAAQ,KAAA,IAAS,GAAA,KAAQ,KAAA,EAAO;AACpC,IAAA,IAAA,IAAQ,uBAAA,CAAwB,GAAA,EAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,EACjD;AAGA,EAAA,IAAI,aAAA,CAAc,GAAG,CAAA,EAAG;AACtB,IAAA,IAAA,IAAQ,KAAA;AACR,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAA,IAAQ,GAAA;AAGR,EAAA,IAAI,SAAA,GAAY,WAAW,aAAA,EAAe;AACxC,IAAA,MAAM,OAAO,UAAA,CAAW,QAAQ,IAAI,EAAA,GAAK,MAAA,CAAO,YAAY,EAAE,CAAA;AAC9D,IAAA,IAAA,IAAQ,WAAW,IAAI,CAAA;AAAA,EACzB,WAAW,SAAA,GAAY,UAAA,CAAW,cAAA,IAAkB,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACrE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,KAAA,GAAQ,SAAS,CAAC,CAAA;AACxB,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,IAAA,IAAQ,oBAAoB,KAAK,CAAA;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAA,IAAQ,KAAK,GAAG,CAAA,CAAA,CAAA;AAChB,EAAA,OAAO,IAAA;AACT","file":"ssr.mjs","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/package.json CHANGED
@@ -1,81 +1,58 @@
1
1
  {
2
2
  "name": "@lytjs/renderer",
3
- "version": "5.0.1",
4
- "description": "Lyt.js 渲染器 - 多平台渲染抽象层(DOM/SSR/Native/MiniApp)",
3
+ "version": "6.0.0",
4
+ "description": "LytJS renderer - DOM, SSR, and Vapor rendering backends",
5
+ "type": "module",
5
6
  "main": "./dist/index.cjs",
6
7
  "module": "./dist/index.mjs",
7
- "types": "./dist/types/index.d.ts",
8
+ "types": "./dist/index.d.ts",
8
9
  "exports": {
9
10
  ".": {
10
- "types": "./dist/types/index.d.ts",
11
+ "types": "./dist/index.d.ts",
11
12
  "import": "./dist/index.mjs",
12
- "require": "./dist/index.cjs",
13
- "default": "./dist/index.mjs"
13
+ "require": "./dist/index.cjs"
14
14
  },
15
15
  "./dom": {
16
- "types": "./dist/types/dom/index.d.ts",
16
+ "types": "./dist/dom.d.ts",
17
17
  "import": "./dist/dom.mjs",
18
- "require": "./dist/dom.cjs",
19
- "default": "./dist/dom.mjs"
18
+ "require": "./dist/dom.cjs"
20
19
  },
21
20
  "./ssr": {
22
- "types": "./dist/types/ssr/index.d.ts",
21
+ "types": "./dist/ssr.d.ts",
23
22
  "import": "./dist/ssr.mjs",
24
- "require": "./dist/ssr.cjs",
25
- "default": "./dist/ssr.mjs"
26
- },
27
- "./native": {
28
- "types": "./dist/types/native/index.d.ts",
29
- "import": "./dist/native.mjs",
30
- "require": "./dist/native.cjs",
31
- "default": "./dist/native.mjs"
32
- },
33
- "./miniapp": {
34
- "types": "./dist/types/miniapp/index.d.ts",
35
- "import": "./dist/miniapp.mjs",
36
- "require": "./dist/miniapp.cjs",
37
- "default": "./dist/miniapp.mjs"
38
- },
39
- "./vapor": {
40
- "types": "./dist/types/vapor/index.d.ts",
41
- "import": "./dist/vapor.mjs",
42
- "require": "./dist/vapor.cjs",
43
- "default": "./dist/vapor.mjs"
23
+ "require": "./dist/ssr.cjs"
44
24
  }
45
25
  },
46
- "sideEffects": false,
47
26
  "files": [
48
27
  "dist"
49
28
  ],
50
- "license": "MIT",
51
- "author": "lytjs",
52
- "repository": {
53
- "type": "git",
54
- "url": "https://gitee.com/lytjs/lytjs"
29
+ "sideEffects": false,
30
+ "scripts": {
31
+ "build": "tsup",
32
+ "dev": "tsup --watch",
33
+ "test": "vitest run",
34
+ "test:watch": "vitest",
35
+ "type-check": "tsc --noEmit",
36
+ "clean": "rm -rf dist"
55
37
  },
56
- "homepage": "https://gitee.com/lytjs/lytjs",
57
- "keywords": [
58
- "lyt",
59
- "lytjs",
60
- "javascript",
61
- "framework",
62
- "frontend",
63
- "vue-like",
64
- "lightweight",
65
- "zero-dependency",
66
- "renderer",
67
- "dom",
68
- "ssr"
69
- ],
70
38
  "dependencies": {
71
- "@lytjs/common": "^5.0.1",
72
- "@lytjs/reactivity": "^5.0.1",
73
- "@lytjs/vdom": "^5.0.1"
39
+ "@lytjs/reactivity": "^6.0.0",
40
+ "@lytjs/vdom": "^6.0.0",
41
+ "@lytjs/common-is": "^6.0.0",
42
+ "@lytjs/common-string": "^6.0.0",
43
+ "@lytjs/common-events": "^6.0.0",
44
+ "@lytjs/common-dom": "^6.0.0",
45
+ "@lytjs/common-error": "^6.0.0",
46
+ "@lytjs/dom-runtime": "^6.0.0",
47
+ "@lytjs/compiler": "^6.0.0",
48
+ "@lytjs/host-contract": "^6.0.0",
49
+ "@lytjs/adapter-web": "^6.0.0"
74
50
  },
75
- "engines": {
76
- "node": ">=18.0.0"
51
+ "devDependencies": {
52
+ "tsup": "^8.0.0",
53
+ "typescript": "^5.4.0",
54
+ "vitest": "^1.6.0",
55
+ "jsdom": "^24.0.0"
77
56
  },
78
- "publishConfig": {
79
- "access": "public"
80
- }
57
+ "license": "MIT"
81
58
  }