@lytjs/renderer 5.0.0 → 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.
- package/README.md +371 -204
- package/dist/dom.cjs +12 -1
- package/dist/dom.cjs.map +1 -0
- package/dist/dom.d.cts +1 -0
- package/dist/dom.d.ts +1 -0
- package/dist/dom.mjs +3 -1
- package/dist/dom.mjs.map +1 -0
- package/dist/index.cjs +3312 -1
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1004 -0
- package/dist/index.d.ts +1004 -0
- package/dist/index.mjs +3190 -1
- package/dist/index.mjs.map +1 -0
- package/dist/ssr.cjs +310 -1
- package/dist/ssr.cjs.map +1 -0
- package/dist/ssr.d.cts +21 -0
- package/dist/ssr.d.ts +21 -0
- package/dist/ssr.mjs +308 -1
- package/dist/ssr.mjs.map +1 -0
- package/package.json +35 -58
- package/dist/miniapp.cjs +0 -21
- package/dist/miniapp.mjs +0 -21
- package/dist/native.cjs +0 -1
- package/dist/native.mjs +0 -1
- package/dist/types/create-renderer.d.ts +0 -20
- package/dist/types/create-renderer.d.ts.map +0 -1
- package/dist/types/dom/dom-ops.d.ts +0 -74
- package/dist/types/dom/dom-ops.d.ts.map +0 -1
- package/dist/types/dom/dom-renderer.d.ts +0 -243
- package/dist/types/dom/dom-renderer.d.ts.map +0 -1
- package/dist/types/dom/index.d.ts +0 -17
- package/dist/types/dom/index.d.ts.map +0 -1
- package/dist/types/dom/patch-events.d.ts +0 -123
- package/dist/types/dom/patch-events.d.ts.map +0 -1
- package/dist/types/dom/patch-props.d.ts +0 -118
- package/dist/types/dom/patch-props.d.ts.map +0 -1
- package/dist/types/index.d.ts +0 -36
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/miniapp/index.d.ts +0 -21
- package/dist/types/miniapp/index.d.ts.map +0 -1
- package/dist/types/miniapp/miniapp-compiler.d.ts +0 -269
- package/dist/types/miniapp/miniapp-compiler.d.ts.map +0 -1
- package/dist/types/miniapp/miniapp-event-bridge.d.ts +0 -255
- package/dist/types/miniapp/miniapp-event-bridge.d.ts.map +0 -1
- package/dist/types/miniapp/miniapp-lifecycle.d.ts +0 -224
- package/dist/types/miniapp/miniapp-lifecycle.d.ts.map +0 -1
- package/dist/types/miniapp/miniapp-renderer.d.ts +0 -269
- package/dist/types/miniapp/miniapp-renderer.d.ts.map +0 -1
- package/dist/types/miniapp/miniapp-utils.d.ts +0 -168
- package/dist/types/miniapp/miniapp-utils.d.ts.map +0 -1
- package/dist/types/miniapp/shared-constants.d.ts +0 -28
- package/dist/types/miniapp/shared-constants.d.ts.map +0 -1
- package/dist/types/mount.d.ts +0 -32
- package/dist/types/mount.d.ts.map +0 -1
- package/dist/types/native/index.d.ts +0 -13
- package/dist/types/native/index.d.ts.map +0 -1
- package/dist/types/native/native-renderer.d.ts +0 -249
- package/dist/types/native/native-renderer.d.ts.map +0 -1
- package/dist/types/patch.d.ts +0 -23
- package/dist/types/patch.d.ts.map +0 -1
- package/dist/types/props.d.ts +0 -19
- package/dist/types/props.d.ts.map +0 -1
- package/dist/types/renderer-interfaces.d.ts +0 -157
- package/dist/types/renderer-interfaces.d.ts.map +0 -1
- package/dist/types/shared/abstract-renderer.d.ts +0 -74
- package/dist/types/shared/abstract-renderer.d.ts.map +0 -1
- package/dist/types/ssr/hydration.d.ts +0 -267
- package/dist/types/ssr/hydration.d.ts.map +0 -1
- package/dist/types/ssr/index.d.ts +0 -15
- package/dist/types/ssr/index.d.ts.map +0 -1
- package/dist/types/ssr/ssr-renderer.d.ts +0 -277
- package/dist/types/ssr/ssr-renderer.d.ts.map +0 -1
- package/dist/types/unmount.d.ts +0 -16
- package/dist/types/unmount.d.ts.map +0 -1
- package/dist/types/vapor/index.d.ts +0 -18
- package/dist/types/vapor/index.d.ts.map +0 -1
- package/dist/types/vapor/vapor-compiler.d.ts +0 -76
- package/dist/types/vapor/vapor-compiler.d.ts.map +0 -1
- package/dist/types/vapor/vapor-component.d.ts +0 -55
- package/dist/types/vapor/vapor-component.d.ts.map +0 -1
- package/dist/types/vapor/vapor-reactive.d.ts +0 -133
- package/dist/types/vapor/vapor-reactive.d.ts.map +0 -1
- package/dist/types/vapor/vapor-renderer.d.ts +0 -135
- package/dist/types/vapor/vapor-renderer.d.ts.map +0 -1
- package/dist/types/vnode.d.ts +0 -203
- package/dist/types/vnode.d.ts.map +0 -1
- package/dist/vapor.cjs +0 -1
- 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||{}),F=(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))(F||{}),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 j(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(j(r)&&j(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={"&":"&","<":"<",">":">",'"':""","'":"'"},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 Fe=new w;import{LytError as je,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 je(We.LYT_SSR_HYDRATION_ERROR,o)}var b=new Map,A=new Map,de={"&":"&","<":"<",">":">",'"':""","'":"'"},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,F 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,Fe 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
|
+
":": ":",
|
|
24
|
+
"&tab;": " ",
|
|
25
|
+
"&newline;": "\n",
|
|
26
|
+
"(": "(",
|
|
27
|
+
")": ")",
|
|
28
|
+
" ": "\xA0",
|
|
29
|
+
"©": "\xA9",
|
|
30
|
+
"®": "\xAE",
|
|
31
|
+
"™": "\u2122",
|
|
32
|
+
"×": "\xD7",
|
|
33
|
+
"÷": "\xF7",
|
|
34
|
+
"£": "\xA3",
|
|
35
|
+
"¥": "\xA5",
|
|
36
|
+
"¢": "\xA2",
|
|
37
|
+
"§": "\xA7",
|
|
38
|
+
"¶": "\xB6",
|
|
39
|
+
"·": "\xB7",
|
|
40
|
+
"«": "\xAB",
|
|
41
|
+
"»": "\xBB",
|
|
42
|
+
"¡": "\xA1",
|
|
43
|
+
"¿": "\xBF",
|
|
44
|
+
"°": "\xB0",
|
|
45
|
+
"±": "\xB1",
|
|
46
|
+
"µ": "\xB5",
|
|
47
|
+
"¼": "\xBC",
|
|
48
|
+
"½": "\xBD",
|
|
49
|
+
"¾": "\xBE",
|
|
50
|
+
"¹": "\xB9",
|
|
51
|
+
"²": "\xB2",
|
|
52
|
+
"³": "\xB3",
|
|
53
|
+
"´": "\xB4",
|
|
54
|
+
"¸": "\xB8",
|
|
55
|
+
"ª": "\xAA",
|
|
56
|
+
"¬": "\xAC",
|
|
57
|
+
"­": "\xAD",
|
|
58
|
+
"¯": "\xAF",
|
|
59
|
+
"¨": "\xA8",
|
|
60
|
+
"ˆ": "\u02C6",
|
|
61
|
+
"˜": "\u02DC",
|
|
62
|
+
" ": "\u2002",
|
|
63
|
+
" ": "\u2003",
|
|
64
|
+
" ": "\u2009",
|
|
65
|
+
"‌": "\u200C",
|
|
66
|
+
"‍": "\u200D",
|
|
67
|
+
"‎": "\u200E",
|
|
68
|
+
"‏": "\u200F",
|
|
69
|
+
"–": "\u2013",
|
|
70
|
+
"—": "\u2014",
|
|
71
|
+
"‘": "\u2018",
|
|
72
|
+
"’": "\u2019",
|
|
73
|
+
"‚": "\u201A",
|
|
74
|
+
"“": "\u201C",
|
|
75
|
+
"”": "\u201D",
|
|
76
|
+
"„": "\u201E",
|
|
77
|
+
"†": "\u2020",
|
|
78
|
+
"‡": "\u2021",
|
|
79
|
+
"•": "\u2022",
|
|
80
|
+
"…": "\u2026",
|
|
81
|
+
"‰": "\u2030",
|
|
82
|
+
"′": "\u2032",
|
|
83
|
+
"″": "\u2033",
|
|
84
|
+
"‹": "\u2039",
|
|
85
|
+
"›": "\u203A",
|
|
86
|
+
"‾": "\u203E",
|
|
87
|
+
"⁄": "\u2044",
|
|
88
|
+
"€": "\u20AC",
|
|
89
|
+
"←": "\u2190",
|
|
90
|
+
"↑": "\u2191",
|
|
91
|
+
"→": "\u2192",
|
|
92
|
+
"↓": "\u2193",
|
|
93
|
+
"↔": "\u2194",
|
|
94
|
+
"↵": "\u21B5",
|
|
95
|
+
"⌈": "\u2308",
|
|
96
|
+
"⌉": "\u2309",
|
|
97
|
+
"⌊": "\u230A",
|
|
98
|
+
"⌋": "\u230B",
|
|
99
|
+
"⟨": "\u27E8",
|
|
100
|
+
"⟩": "\u27E9",
|
|
101
|
+
"◊": "\u25CA",
|
|
102
|
+
"♠": "\u2660",
|
|
103
|
+
"♣": "\u2663",
|
|
104
|
+
"♥": "\u2665",
|
|
105
|
+
"♦": "\u2666",
|
|
106
|
+
"Œ": "\u0152",
|
|
107
|
+
"œ": "\u0153",
|
|
108
|
+
"Š": "\u0160",
|
|
109
|
+
"š": "\u0161",
|
|
110
|
+
"Ÿ": "\u0178",
|
|
111
|
+
"ƒ": "\u0192",
|
|
112
|
+
"Α": "\u0391",
|
|
113
|
+
"Β": "\u0392",
|
|
114
|
+
"Γ": "\u0393",
|
|
115
|
+
"Δ": "\u0394",
|
|
116
|
+
"Ε": "\u0395",
|
|
117
|
+
"Ζ": "\u0396",
|
|
118
|
+
"Η": "\u0397",
|
|
119
|
+
"Θ": "\u0398",
|
|
120
|
+
"Ι": "\u0399",
|
|
121
|
+
"Κ": "\u039A",
|
|
122
|
+
"Λ": "\u039B",
|
|
123
|
+
"Μ": "\u039C",
|
|
124
|
+
"Ν": "\u039D",
|
|
125
|
+
"Ξ": "\u039E",
|
|
126
|
+
"Ο": "\u039F",
|
|
127
|
+
"Π": "\u03A0",
|
|
128
|
+
"Ρ": "\u03A1",
|
|
129
|
+
"Σ": "\u03A3",
|
|
130
|
+
"Τ": "\u03A4",
|
|
131
|
+
"Υ": "\u03A5",
|
|
132
|
+
"Φ": "\u03A6",
|
|
133
|
+
"Χ": "\u03A7",
|
|
134
|
+
"Ψ": "\u03A8",
|
|
135
|
+
"Ω": "\u03A9",
|
|
136
|
+
"α": "\u03B1",
|
|
137
|
+
"β": "\u03B2",
|
|
138
|
+
"γ": "\u03B3",
|
|
139
|
+
"δ": "\u03B4",
|
|
140
|
+
"ε": "\u03B5",
|
|
141
|
+
"ζ": "\u03B6",
|
|
142
|
+
"η": "\u03B7",
|
|
143
|
+
"θ": "\u03B8",
|
|
144
|
+
"ι": "\u03B9",
|
|
145
|
+
"κ": "\u03BA",
|
|
146
|
+
"λ": "\u03BB",
|
|
147
|
+
"μ": "\u03BC",
|
|
148
|
+
"ν": "\u03BD",
|
|
149
|
+
"ξ": "\u03BE",
|
|
150
|
+
"ο": "\u03BF",
|
|
151
|
+
"π": "\u03C0",
|
|
152
|
+
"ρ": "\u03C1",
|
|
153
|
+
"ς": "\u03C2",
|
|
154
|
+
"σ": "\u03C3",
|
|
155
|
+
"τ": "\u03C4",
|
|
156
|
+
"υ": "\u03C5",
|
|
157
|
+
"φ": "\u03C6",
|
|
158
|
+
"χ": "\u03C7",
|
|
159
|
+
"ψ": "\u03C8",
|
|
160
|
+
"ω": "\u03C9",
|
|
161
|
+
"ϑ": "\u03D1",
|
|
162
|
+
"ϒ": "\u03D2",
|
|
163
|
+
"ϖ": "\u03D6",
|
|
164
|
+
"'": "'",
|
|
165
|
+
""": '"',
|
|
166
|
+
"&": "&",
|
|
167
|
+
"<": "<",
|
|
168
|
+
">": ">"
|
|
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, "<!--").replace(/-->/g, "-->");
|
|
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
|
package/dist/ssr.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils.ts","../src/ssr/ssr-utils.ts","../src/ssr/ssr-renderer.ts"],"names":[],"mappings":"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","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 ':': ':',\r\n '&tab;': '\\t',\r\n '&newline;': '\\n',\r\n '(': '(',\r\n ')': ')',\r\n ' ': '\\u00A0',\r\n '©': '\\u00A9',\r\n '®': '\\u00AE',\r\n '™': '\\u2122',\r\n '×': '\\u00D7',\r\n '÷': '\\u00F7',\r\n '£': '\\u00A3',\r\n '¥': '\\u00A5',\r\n '¢': '\\u00A2',\r\n '§': '\\u00A7',\r\n '¶': '\\u00B6',\r\n '·': '\\u00B7',\r\n '«': '\\u00AB',\r\n '»': '\\u00BB',\r\n '¡': '\\u00A1',\r\n '¿': '\\u00BF',\r\n '°': '\\u00B0',\r\n '±': '\\u00B1',\r\n 'µ': '\\u00B5',\r\n '¼': '\\u00BC',\r\n '½': '\\u00BD',\r\n '¾': '\\u00BE',\r\n '¹': '\\u00B9',\r\n '²': '\\u00B2',\r\n '³': '\\u00B3',\r\n '´': '\\u00B4',\r\n '¸': '\\u00B8',\r\n 'ª': '\\u00AA',\r\n '¬': '\\u00AC',\r\n '­': '\\u00AD',\r\n '¯': '\\u00AF',\r\n '¨': '\\u00A8',\r\n 'ˆ': '\\u02C6',\r\n '˜': '\\u02DC',\r\n ' ': '\\u2002',\r\n ' ': '\\u2003',\r\n ' ': '\\u2009',\r\n '‌': '\\u200C',\r\n '‍': '\\u200D',\r\n '‎': '\\u200E',\r\n '‏': '\\u200F',\r\n '–': '\\u2013',\r\n '—': '\\u2014',\r\n '‘': '\\u2018',\r\n '’': '\\u2019',\r\n '‚': '\\u201A',\r\n '“': '\\u201C',\r\n '”': '\\u201D',\r\n '„': '\\u201E',\r\n '†': '\\u2020',\r\n '‡': '\\u2021',\r\n '•': '\\u2022',\r\n '…': '\\u2026',\r\n '‰': '\\u2030',\r\n '′': '\\u2032',\r\n '″': '\\u2033',\r\n '‹': '\\u2039',\r\n '›': '\\u203A',\r\n '‾': '\\u203E',\r\n '⁄': '\\u2044',\r\n '€': '\\u20AC',\r\n '←': '\\u2190',\r\n '↑': '\\u2191',\r\n '→': '\\u2192',\r\n '↓': '\\u2193',\r\n '↔': '\\u2194',\r\n '↵': '\\u21B5',\r\n '⌈': '\\u2308',\r\n '⌉': '\\u2309',\r\n '⌊': '\\u230A',\r\n '⌋': '\\u230B',\r\n '⟨': '\\u27E8',\r\n '⟩': '\\u27E9',\r\n '◊': '\\u25CA',\r\n '♠': '\\u2660',\r\n '♣': '\\u2663',\r\n '♥': '\\u2665',\r\n '♦': '\\u2666',\r\n 'Œ': '\\u0152',\r\n 'œ': '\\u0153',\r\n 'Š': '\\u0160',\r\n 'š': '\\u0161',\r\n 'Ÿ': '\\u0178',\r\n 'ƒ': '\\u0192',\r\n 'Α': '\\u0391',\r\n 'Β': '\\u0392',\r\n 'Γ': '\\u0393',\r\n 'Δ': '\\u0394',\r\n 'Ε': '\\u0395',\r\n 'Ζ': '\\u0396',\r\n 'Η': '\\u0397',\r\n 'Θ': '\\u0398',\r\n 'Ι': '\\u0399',\r\n 'Κ': '\\u039A',\r\n 'Λ': '\\u039B',\r\n 'Μ': '\\u039C',\r\n 'Ν': '\\u039D',\r\n 'Ξ': '\\u039E',\r\n 'Ο': '\\u039F',\r\n 'Π': '\\u03A0',\r\n 'Ρ': '\\u03A1',\r\n 'Σ': '\\u03A3',\r\n 'Τ': '\\u03A4',\r\n 'Υ': '\\u03A5',\r\n 'Φ': '\\u03A6',\r\n 'Χ': '\\u03A7',\r\n 'Ψ': '\\u03A8',\r\n 'Ω': '\\u03A9',\r\n 'α': '\\u03B1',\r\n 'β': '\\u03B2',\r\n 'γ': '\\u03B3',\r\n 'δ': '\\u03B4',\r\n 'ε': '\\u03B5',\r\n 'ζ': '\\u03B6',\r\n 'η': '\\u03B7',\r\n 'θ': '\\u03B8',\r\n 'ι': '\\u03B9',\r\n 'κ': '\\u03BA',\r\n 'λ': '\\u03BB',\r\n 'μ': '\\u03BC',\r\n 'ν': '\\u03BD',\r\n 'ξ': '\\u03BE',\r\n 'ο': '\\u03BF',\r\n 'π': '\\u03C0',\r\n 'ρ': '\\u03C1',\r\n 'ς': '\\u03C2',\r\n 'σ': '\\u03C3',\r\n 'τ': '\\u03C4',\r\n 'υ': '\\u03C5',\r\n 'φ': '\\u03C6',\r\n 'χ': '\\u03C7',\r\n 'ψ': '\\u03C8',\r\n 'ω': '\\u03C9',\r\n 'ϑ': '\\u03D1',\r\n 'ϒ': '\\u03D2',\r\n 'ϖ': '\\u03D6',\r\n ''': \"'\",\r\n '"': '\"',\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\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, '<!--').replace(/-->/g, '-->');\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": "
|
|
4
|
-
"description": "
|
|
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/
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
8
9
|
"exports": {
|
|
9
10
|
".": {
|
|
10
|
-
"types": "./dist/
|
|
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/
|
|
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/
|
|
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
|
-
"
|
|
51
|
-
"
|
|
52
|
-
|
|
53
|
-
"
|
|
54
|
-
"
|
|
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/
|
|
72
|
-
"@lytjs/
|
|
73
|
-
"@lytjs/
|
|
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
|
-
"
|
|
76
|
-
"
|
|
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
|
-
"
|
|
79
|
-
"access": "public"
|
|
80
|
-
}
|
|
57
|
+
"license": "MIT"
|
|
81
58
|
}
|