loly-jsx 0.1.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 +361 -0
- package/dist/dev-runtime-CEyE3QDn.js +207 -0
- package/dist/dev-runtime-CEyE3QDn.js.map +1 -0
- package/dist/dev-runtime-CRAwY4ll.cjs +2 -0
- package/dist/dev-runtime-CRAwY4ll.cjs.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +1206 -0
- package/dist/index.js.map +1 -0
- package/dist/jsx-dev-runtime.cjs +2 -0
- package/dist/jsx-dev-runtime.cjs.map +1 -0
- package/dist/jsx-dev-runtime.js +8 -0
- package/dist/jsx-dev-runtime.js.map +1 -0
- package/dist/jsx-runtime.cjs +2 -0
- package/dist/jsx-runtime.cjs.map +1 -0
- package/dist/jsx-runtime.js +8 -0
- package/dist/jsx-runtime.js.map +1 -0
- package/dist/render-manifest.cjs +2 -0
- package/dist/render-manifest.cjs.map +1 -0
- package/dist/render-manifest.js +14 -0
- package/dist/render-manifest.js.map +1 -0
- package/package.json +93 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("./dev-runtime-CRAwY4ll.cjs"),F=new WeakMap,oe=new WeakMap;let Ee=0;function Te(){return`store-${Date.now()}-${Math.random().toString(36).slice(2)}-${Ee++}`}const ve=new Map,Q=new WeakMap,T=[],U=()=>T[T.length-1];function Ne(){const e=U(),t=e?new Map(e):new Map;T.push(t)}function H(){T.pop()}function De(e,t){ve.set(e,t)}function je(e,t,r,n){const s=U();if(s)c.getRuntimeConfig().enableWarnings&&s.has(t)&&console.warn("[loly][store] shadowing scoped store detected; consider different store instance"),s.set(t,r);else{const o=new Map;o.set(t,r),T.push(o)}let i=F.get(e);i||(i=new Map,F.set(e,i)),i.set(t,r),oe.set(t,e),t.__storeId&&n!==void 0&&De(t.__storeId,n)}function q(e){const t=U();if(t!=null&&t.has(e))return console.log("[findScopedStore] Found in active stack"),t.get(e);const r=oe.get(e);if(r){const s=F.get(r);if(s!=null&&s.has(e))return console.log("[findScopedStore] Found in vnode context"),s.get(e)}const n=Q.get(e);if(n)return console.log("[findScopedStore] Found in global registry"),n;if(typeof window<"u"&&e.__storeId){const s=window.__LOLY_STORE_DATA__;if(s&&s[e.__storeId]){const i=s[e.__storeId],[o]=c.state(i);return Q.set(e,o),delete s[e.__storeId],o}}return null}function se(e){return q(e)}function ke(e,t){const[r,n]=c.state(e),s=t||Te();return t||console.warn("[loly][store] storeId is required for SSR/client serialization"),{__isStore:!0,__defaultValue:e,__globalSignal:r,__storeId:s,get(){const i=q(this);return i?i():r()},set(i){const o=q(this);if(o){const l=o.get();o.set(i),c.getRuntimeConfig().enableDevtools&&c.devLog("store","debug","store:update(scoped)",{prev:l,next:o.get()})}else{const l=r.get();n(i),c.getRuntimeConfig().enableDevtools&&c.devLog("store","debug","store:update(global)",{prev:l,next:r.get()})}},update(i){this.set(i(this.get()))},reset(){this.set(this.__defaultValue)}}}const K=new Map;function Oe(e,t){return K.set(e,t),t.__islandName=e,t}function ie(e){return K.get(e)}function Re(){return Array.from(K.keys())}function R(e){return!!e&&typeof e=="object"&&e.__kind==="for"}function Ve(e){const t=e.key??((s,i)=>i),n=Array.isArray(e.children)?e.children[0]:e.children;if(typeof n!="function")throw new Error("<For> expects a render function as its child");if(!c.isSignal(e.each)&&!c.isComputed(e.each))throw new Error("<For> each prop must be a signal or computed");return{__kind:"for",source:e.each,renderItem:n,getKey:t}}function Me(e,t,r){if(typeof t!="function")throw new Error("forBlock renderItem must be a function");return{__kind:"for",source:e,renderItem:t,getKey:r}}let ce=null;function L(e){ce=e}function N(){return ce}function v(){return{id:crypto.randomUUID(),onMount:[],onUnmount:[],cleanup:[]}}function E(e,t){e.__instance=t,t.vnode=e}function He(e){return()=>e()}function ae(e){var t;(t=N())==null||t.onMount.push(e)}function W(e){var t;(t=N())==null||t.onUnmount.push(e)}function Pe(e){var t;(t=N())==null||t.cleanup.push(e)}const k=new WeakMap;function C(e,t){(Array.isArray(e)?e:[e]).forEach(n=>{const s=k.get(n);s?s.push(t):k.set(n,[t])})}function Fe(e){const t=k.get(e);t&&t.length&&(k.delete(e),t.forEach(r=>{try{r()}catch(n){console.error("[loly] cleanup error",n)}}))}function le(e){Fe(e),e.childNodes.forEach(t=>le(t))}function ue(e,t=!0){e.forEach(r=>{var n;le(r),t&&((n=r.parentNode)==null||n.removeChild(r))})}function de(e,t){const r=[];A(e,t,r),r.forEach(n=>n())}function A(e,t,r){var o,l;if(Array.isArray(e)){const u=[];return c.normalizeChildren(e).forEach(a=>{u.push(...A(a,t,r))}),u}if(c.isSignal(e)||c.isComputed(e)){const u=document.createComment("loly:signal");t.appendChild(u);let a=[];const d=()=>(c.isSignal(e),e.get()),y=g=>{ue(a),a=[];const f=document.createDocumentFragment();A(g,f,r);const m=Array.from(f.childNodes);u.parentNode===t&&u.parentNode!==null?t.insertBefore(f,u):t.appendChild(f),a=m},h=()=>y(d());y(d());const p=(c.isSignal(e),e.subscribe)(h);return C(u,p),[u,...a]}if(typeof e=="function")return A(c.computed(e),t,r),[];if(typeof e=="string"||typeof e=="number"){const u=document.createTextNode(String(e));return t.appendChild(u),[u]}if(e==null||e===!1||e===!0)return[];if(R(e))return ze(e,t,r);if(!c.isVNode(e))return[];if(typeof e.type=="function"){Ne();const u=e.type.__isErrorBoundary===!0,a=v();E(e,a),c.getRuntimeConfig().enableDevtools&&e.__islandDirective&&c.devLog("island","info","island:activate",{name:(o=e.type)==null?void 0:o.name,directive:e.__islandDirective}),L(a);let d;try{d=e.type({...e.props,children:e.children})}catch(p){if(L(null),u){const g=e.props,f=p instanceof Error?p:new Error(String(p));(l=g.onError)==null||l.call(g,f,null);const m=g.fallback?g.fallback(f):null,_=m?A(m,t,r):[];return H(),_}throw H(),p}L(null);const y=(()=>{var p;if(u)try{return A(d,t,r)}catch(g){const f=e.props,m=g instanceof Error?g:new Error(String(g));(p=f.onError)==null||p.call(f,m,null);const _=f.fallback?f.fallback(m):null;return _?A(_,t,r):[]}return A(d,t,r)})(),h=y.length?y:[document.createComment("loly:empty")];if(y.length||h.forEach(p=>t.appendChild(p)),a.onMount.length&&r.push(...a.onMount),a.onUnmount.length||a.cleanup.length){let p=!1;C(h,()=>{p||(p=!0,a.onUnmount.forEach(f=>{try{f()}catch(m){console.error("[loly] onUnmount error",m)}}),a.cleanup.forEach(f=>{try{f()}catch(m){console.error("[loly] cleanup error",m)}}))})}return H(),h}if(e.type===c.Fragment){const u=[];return c.normalizeChildren(e.children).forEach(a=>{u.push(...A(a,t,r))}),u}const n=document.createElement(e.type),s=e.props.dangerouslySetInnerHTML;return s&&s.__html?n.innerHTML=s.__html:(fe(n,e.props),c.normalizeChildren(e.children).forEach(u=>{A(u,n,r)})),t.appendChild(n),[n]}function qe(e){return Object.entries(e).map(([t,r])=>`${t.replace(/[A-Z]/g,s=>`-${s.toLowerCase()}`)}:${r}`).join(";")}function fe(e,t){for(const[r,n]of Object.entries(t)){if(r==="children")continue;const s=r==="className"?"class":r;if(r.startsWith("on")&&typeof n=="function"){const i=r.slice(2).toLowerCase();e.addEventListener(i,n),C(e,()=>e.removeEventListener(i,n));continue}if(r==="value"&&(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement))if(c.isSignal(n)||c.isComputed(n)){c.getRuntimeConfig().enableWarnings&&console.warn("[loly][warn] Passing a signal directly as value=. Usa value={signal()} o bind via onInput");const i=()=>(c.isSignal(n),n.get());e.value=String(i()??"");const o=n.subscribe(()=>{e.value=String(i()??"")});C(e,o);continue}else{e.value=String(n??"");continue}if(r==="checked"&&e instanceof HTMLInputElement)if(c.isSignal(n)||c.isComputed(n)){const i=()=>(c.isSignal(n),n.get());e.checked=!!i();const o=n.subscribe(()=>{e.checked=!!i()});C(e,o);continue}else{e.checked=!!n;continue}if(r==="style"){const i=o=>{if(typeof o=="object"&&o!==null){const l=qe(o);e.setAttribute("style",l)}else o==null?e.removeAttribute("style"):e.setAttribute("style",String(o))};if(c.isSignal(n)||c.isComputed(n)){const o=()=>(c.isSignal(n),n.get());i(o());const l=n.subscribe(()=>i(o()));C(e,l);continue}if(typeof n=="object"&&n!==null){const o=n;if(Object.values(o).some(u=>typeof u=="function"||c.isSignal(u)||c.isComputed(u))){const u=c.computed(()=>{const y={};for(const[h,p]of Object.entries(o))c.isSignal(p)||c.isComputed(p)?y[h]=p.get():typeof p=="function"?y[h]=p():y[h]=p;return y}),a=()=>u.get();i(a());const d=u.subscribe(()=>i(a()));C(e,d);continue}}i(n);continue}if(s==="disabled"){const i=o=>{const l=!o||o==="false",u=e;l?(u.disabled=!1,e.removeAttribute("disabled")):(u.disabled=!0,e.setAttribute("disabled","true"))};if(c.isSignal(n)||c.isComputed(n)){const o=()=>(c.isSignal(n),n.get());i(o());const l=n.subscribe(()=>i(o()));C(e,l);continue}else{i(n);continue}}if(c.isSignal(n)||c.isComputed(n)){const i=()=>(c.isSignal(n),n.get());e.setAttribute(s,String(i()));const o=n.subscribe(()=>e.setAttribute(s,String(i())));C(e,o);continue}typeof n!="function"&&e.setAttribute(s,String(n))}}function ze(e,t,r){const n=document.createComment("loly:for:start"),s=document.createComment("loly:for:end");t.appendChild(n),t.appendChild(s);let i=[];const o=a=>{const d=new Map;i.forEach(p=>d.set(p.key,p));const y=[];let h=s;for(let p=a.length-1;p>=0;p--){const g=a[p],f=e.getKey(g,p),m=d.get(f);let _=[];if(m){_=m.nodes,d.delete(f);const b=_[0];b&&b.nextSibling!==h&&(h.parentNode===t&&h.parentNode!==null?_.forEach(S=>t.insertBefore(S,h)):_.forEach(S=>t.appendChild(S)))}else{const b=document.createDocumentFragment(),S=e.source;_=A(e.renderItem(g,{remove:()=>{if(c.isSignal(S)){const w=S.get(),$=w.filter((D,M)=>e.getKey(w[M],M)!==f);S.set($)}else console.warn("ctx.remove() is not supported when <For> uses a computed source. Handle removal manually.")},index:()=>S.get().findIndex(($,D)=>e.getKey($,D)===f)}),b,r),_=_.length?_:Array.from(b.childNodes),b.childNodes.length&&(h.parentNode===t&&h.parentNode!==null?t.insertBefore(b,h):t.appendChild(b))}h=_[0]??h,y.unshift({key:f,nodes:_,item:g})}d.forEach(p=>ue(p.nodes)),i=y},l=e.source.get();o(l);const u=e.source.subscribe(a=>{o(a)});return C(s,u),[n,s]}function Be(e){return e&&(e.startsWith("media:")||e==="idle"||e==="visible"||e==="load")?e:"load"}function Je(e,t,r){if(t==="load"){r();return}if(t==="idle"){"requestIdleCallback"in window?window.requestIdleCallback(r):setTimeout(r,0);return}if(t==="visible"){const n=new IntersectionObserver(s=>{s[0].isIntersecting&&(n.disconnect(),r())});n.observe(e);return}if(t.startsWith("media:")){const n=t.slice(6),s=window.matchMedia(n),i=()=>{s.removeEventListener("change",o),r()},o=l=>{l.matches&&i()};s.matches?i():s.addEventListener("change",o);return}r()}function pe(e=document){e.querySelectorAll("[data-loly-island]").forEach(r=>{if(r.hasAttribute("data-loly-booted"))return;const n=r.getAttribute("data-loly-island");if(!n)return;const s=ie(n);if(!s)return;r.setAttribute("data-loly-booted","true");const i=r.getAttribute("data-island-id");let o={};if(i&&typeof window<"u"){const a=window.__LOLY_ISLAND_DATA__;a&&a[i]&&(o=a[i],delete a[i])}const l=Be(r.getAttribute("data-client"));Je(r,l,()=>{r.innerHTML="";const a=c.createVNode(s,o,[]);de(a,r)})})}const x=e=>e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,"""),ye=e=>typeof e=="string"||typeof e=="number"||typeof e=="boolean"||e===null||e===void 0;let Ye=0;function ge(e){const t=[];for(const[r,n]of Object.entries(e)){if(r==="children"||r==="key"||r==="dangerouslySetInnerHTML"||r.startsWith("on")&&typeof n=="function")continue;const s=c.isSignal(n)||c.isComputed(n)?n.get():n;if(s===!1||s===null||s===void 0)continue;const i=r==="className"?"class":r;if(i==="style"&&typeof s=="object"&&s!==null){const o=Object.entries(s).map(([l,u])=>`${l.toString().replace(/[A-Z]/g,a=>`-${a.toLowerCase()}`)}:${u}`).join(";");t.push(`${i}="${x(o)}"`);continue}s===!0?t.push(`${i}`):t.push(`${i}="${x(String(s))}"`)}return t.length?` ${t.join(" ")}`:""}async function z(e){return typeof window>"u"?(await Promise.all(e.map(async s=>c.isSignal(s)||c.isComputed(s)?I(s.get()):I(s)))).join(""):(await Promise.all(e.map(I))).join("")}async function P(e){const t=e.type,r=v();E(e,r),L(r);const n=t({...e.props,children:e.children});c.isVNode(n)&&E(n,r),L(null);const s=O(n)?await n:n;return I(s)}function he(e){const t=(n,s)=>{if(s!==void 0&&typeof s!="function"&&typeof s!="symbol")return c.isSignal(s)?s.get():s},r={...e};delete r.children,delete r.key,delete r.__islandDirective;try{return JSON.parse(JSON.stringify(r,t))}catch{return{}}}function me(){return`island-${Date.now()}-${Math.random().toString(36).slice(2)}-${Ye++}`}function _e(e){return e.__islandName||e.name||"Island"}async function Ue(e){if(e.type===c.Fragment)return z(e.children);if(typeof e.type=="function"){if(e.__islandDirective){const o=_e(e.type),l=he(e.props),u=await P(e),a=e.__islandDirective,d=a?` data-client="${x(a)}"`:"",y=me(),h=JSON.stringify(y),p=JSON.stringify(l);return`${`<script>window.__LOLY_ISLAND_DATA__=window.__LOLY_ISLAND_DATA__||{};window.__LOLY_ISLAND_DATA__[${h}]=${p};<\/script>`}<div data-loly-island="${x(o)}" data-island-id="${x(y)}"${d}>${u}</div>`}if(e.type.__isStoreComponent){const o=e.props,l=o.store;if(l!=null&&l.__storeId&&o.initialData!==void 0){const u=JSON.stringify(l.__storeId),a=JSON.stringify(o.initialData),d=`<script>window.__LOLY_STORE_DATA__=window.__LOLY_STORE_DATA__||{};window.__LOLY_STORE_DATA__[${u}]=${a};<\/script>`,y=await P(e);return d+y}}return P(e)}const t=e.type,r=ge(e.props),n=e.props.dangerouslySetInnerHTML;if(n&&typeof n.__html=="string")return`<${t}${r}>${n.__html}</${t}>`;const s=await z(e.children);return`<${t}${r}>${s}</${t}>`}async function I(e){if(Array.isArray(e))return z(e);if(typeof e=="function"){const t=e(),r=O(t)?await t:t;return I(r)}if(R(e)){const t=e.source.get();return(await Promise.all(t.map((n,s)=>I(e.renderItem(n,{remove(){},index:()=>s}))))).join("")}return c.isSignal(e)||c.isComputed(e)?I(e.get()):ye(e)?e===!1||e===null||e===void 0?"":x(String(e)):c.isVNode(e)?Ue(e):""}async function G(e){return I(e)}function be(e,t={}){const{onAsyncTask:r}=t,n=new TextEncoder;let s=0;async function i(o,l,u,a){if(Array.isArray(o)){for(const d of c.normalizeChildren(o))await i(d,l);return}if(R(o)){const d=o.source.get();for(let y=0;y<d.length;y++)await i(o.renderItem(d[y],{remove(){},index:()=>y}),l);return}if(c.isSignal(o)||c.isComputed(o))return i(o.get(),l);if(ye(o)){if(o===!1||o===null||o===void 0)return;l.enqueue(n.encode(x(String(o))));return}if(c.isVNode(o)){if(o.type===c.Fragment||typeof o.type=="symbol"){for(const p of c.normalizeChildren(o.children))await i(p,l);return}if(typeof o.type=="function"){if(o.__islandDirective){const m=_e(o.type),_=he(o.props),b=v();E(o,b),L(b);const S=o.type({...o.props,children:o.children});c.isVNode(S)&&E(S,b),L(null);const w=me(),$=JSON.stringify(w),D=JSON.stringify(_),Z=`${`<script>window.__LOLY_ISLAND_DATA__=window.__LOLY_ISLAND_DATA__||{};window.__LOLY_ISLAND_DATA__[${$}]=${D};<\/script>`}<div data-loly-island="${x(m)}" data-island-id="${x(w)}"${o.__islandDirective?` data-client="${x(o.__islandDirective)}"`:""}>`;l.enqueue(n.encode(Z)),await i(S,l),l.enqueue(n.encode("</div>"));return}if(o.type.__isStoreComponent){const m=o.props,_=m.store;if(_!=null&&_.__storeId&&m.initialData!==void 0){const b=JSON.stringify(_.__storeId),S=JSON.stringify(m.initialData),w=`<script>window.__LOLY_STORE_DATA__=window.__LOLY_STORE_DATA__||{};window.__LOLY_STORE_DATA__[${b}]=${S};<\/script>`;l.enqueue(n.encode(w))}}const g=v();E(o,g),L(g);const f=o.type({...o.props,children:o.children});if(c.isVNode(f)&&E(f,g),L(null),O(f)){const m=`async-${s++}`;r&&r(m,()=>f,o.props),l.enqueue(n.encode(`<div data-loly-async="${x(m)}"><!-- placeholder --></div>`));return}await i(f,l);return}const d=o.type,y=ge(o.props),h=o.props.dangerouslySetInnerHTML;if(l.enqueue(n.encode(`<${d}${y}>`)),h&&typeof h.__html=="string")l.enqueue(n.encode(h.__html));else{const p=c.normalizeChildren(o.children);for(const g of p)if(O(g)){const f=`async-${s++}`;r&&r(f,()=>g,void 0),l.enqueue(n.encode(`<div data-loly-async="${x(f)}"><!-- placeholder --></div>`))}else await i(g,l)}l.enqueue(n.encode(`</${d}>`));return}}return new ReadableStream({async start(o){try{await i(e,o)}catch(l){o.error(l);return}o.close()}})}function O(e){return typeof e=="object"&&e!==null&&"then"in e&&typeof e.then=="function"}function Ke(e){if(!e)return document;if(typeof e=="string"){const t=document.querySelector(e);if(!t)throw new Error(`initLolyApplication: target not found: ${e}`);return t}return e}function We(e={}){const t=Ke(e.target);pe(t)}async function Se(e){const t=await e();return{html:await G(t)}}const we=e=>{const t=()=>Array.isArray(e.children)?e.children[0]??null:e.children??null,r=()=>{const s=t();return typeof s=="function"?s():s},n=()=>{var s;try{return r()}catch(i){const o=i instanceof Error?i:new Error(String(i));return(s=e.onError)==null||s.call(e,o,null),e.fallback?e.fallback(o):null}};return()=>n()};we.__isErrorBoundary=!0;function xe({store:e,initialData:t,children:r}){const n=N();if(!(n!=null&&n.vnode))throw new Error("Store component must be used inside a component");const s=t!==void 0?t:(()=>{const o=se(e);return o?o():e.get()})(),[i]=c.state(s);return je(n.vnode,e,i,t),r??null}xe.__isStoreComponent=!0;function Ge(e){const t=se(e);return t?{__isStore:!0,__defaultValue:e.__defaultValue,__globalSignal:e.__globalSignal,get:()=>t(),set:r=>t.set(r),update:r=>t.set(n=>r(n)),reset:()=>t.set(e.__defaultValue)}:e}const Xe=50;function Ze(){if(!c.getRuntimeConfig().enableDevtools)return null;const[t,r]=c.state(!1),[n,s]=c.state([]),[i,o]=c.state(!1);ae(()=>{let d=!1;const y=i.subscribe(g=>{d=g});let h=!1;const p=c.onDevtoolsEvent(g=>{if(g.scope!=="overlay"){if(g.scope==="signal"&&g.message==="signal:update"){const f=g.payload;if(Array.isArray(f.prev)&&Array.isArray(f.next)&&(f.prev.length>0||f.next.length>0)){const m=f.prev[0]||f.next[0];if(m&&typeof m=="object"&&"scope"in m&&"timestamp"in m)return}}if(!h&&!d){h=!0;try{s(f=>[...f,g].slice(-Xe))}finally{setTimeout(()=>{h=!1},0)}}}});W(()=>{p(),y()})});const l=()=>r(d=>!d),u=()=>o(d=>!d),a=()=>s([]);return c.jsxs("div",{style:{position:"fixed",right:"12px",bottom:"12px",zIndex:9999,fontFamily:"system-ui",fontSize:"12px"},children:[c.jsx("button",{onClick:l,style:{padding:"6px 10px",borderRadius:"6px",border:"1px solid #cbd5e1",background:"#111827",color:"#f8fafc",cursor:"pointer"},children:"Devtools"}),()=>t()&&c.jsxs("div",{style:{marginTop:"8px",width:"360px",maxHeight:"320px",overflow:"hidden",border:"1px solid #cbd5e1",borderRadius:"8px",background:"#0f172a",color:"#e2e8f0",boxShadow:"0 10px 30px rgba(0,0,0,0.35)"},children:[c.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px",padding:"8px 10px",borderBottom:"1px solid #1f2937"},children:[c.jsx("strong",{style:{fontSize:"12px"},children:"Devtools"}),c.jsx("span",{style:{flex:1}}),c.jsx("button",{onClick:u,style:ee(i()),children:i()?"Resume":"Pause"}),c.jsx("button",{onClick:a,style:ee(!1),children:"Clear"})]}),c.jsx("div",{style:{maxHeight:"260px",overflowY:"auto"},children:()=>n().length===0?c.jsx("div",{style:{padding:"12px",color:"#94a3b8"},children:"No events"}):n().slice().reverse().map((d,y)=>c.jsxs("div",{style:{padding:"8px 10px",borderBottom:"1px solid #1f2937"},children:[c.jsxs("div",{style:{display:"flex",gap:"6px",alignItems:"center"},children:[c.jsx("span",{style:Qe(d.level),children:d.level}),c.jsx("span",{style:et,children:d.scope}),c.jsx("span",{style:{color:"#9ca3af",fontSize:"11px"},children:new Date(d.timestamp).toLocaleTimeString()})]}),c.jsx("div",{style:{marginTop:"4px",color:"#e5e7eb"},children:d.message}),d.payload?c.jsx("pre",{style:{marginTop:"4px",fontSize:"11px",color:"#cbd5e1",whiteSpace:"pre-wrap"},children:JSON.stringify(d.payload,null,2)}):null]},y))})]})]})}const ee=e=>({padding:"4px 8px",borderRadius:"6px",border:"1px solid #334155",background:e?"#1e293b":"#111827",color:"#e2e8f0",cursor:"pointer",fontSize:"11px"}),Qe=e=>({fontSize:"10px",padding:"2px 6px",borderRadius:"999px",textTransform:"uppercase",background:e==="error"?"#7f1d1d":e==="warn"?"#854d0e":"#0f172a",color:"#e5e7eb"}),et={fontSize:"10px",padding:"2px 6px",borderRadius:"999px",background:"#1f2937",color:"#e5e7eb"};async function Ae(e){const{view:t,head:r="",styles:n="",scripts:s="",beforeApp:i="",afterApp:o="",appId:l="app"}=e,u=typeof t=="function"?await t():t,a=await G(u);return{html:`<!doctype html><html><head>${r}${n}</head><body>${i}<div id="${l}">${a}</div>${o}${s}</body></html>`}}function tt(e){const{view:t,head:r="",styles:n="",scripts:s="",beforeApp:i="",afterApp:o="",appId:l="app",onAsyncTask:u}=e,a=new TextEncoder;let d;if(typeof t=="function"){const y=t();d=y instanceof Promise?y:Promise.resolve(y)}else d=Promise.resolve(t);return new ReadableStream({async start(y){try{const h=`<!doctype html><html><head>${r}${n}</head><body>${i}<div id="${l}">`;y.enqueue(a.encode(h));const p=await d,f=be(p,{onAsyncTask:u}).getReader();for(;;){const{done:_,value:b}=await f.read();if(_)break;b&&y.enqueue(b)}f.releaseLock();const m=`</div>${o}${s}</body></html>`;y.enqueue(a.encode(m))}catch(h){y.error(h);return}y.close()}})}function nt(e){const t=new URL(e,"http://localhost");return{pathname:t.pathname||"/",search:t.search,hash:t.hash}}function rt(e){const{routes:t,styles:r="",scripts:n="",head:s="",appId:i="app",onNotFound:o}=e;return async function(u,a,d){var y,h,p,g,f,m,_;try{const b=u.path||u.url||"/",S=nt(b),w=V(S.pathname,t);if(!w){if(o){await o(u,a,d);return}if(typeof d=="function")return d();(y=a.status)==null||y.call(a,404),(h=a.end)==null||h.call(a,"Not found");return}const{html:$}=await Ae({view:w.route.factory({params:w.params,location:S}),head:s,styles:r,scripts:n,appId:i});(p=a.setHeader)==null||p.call(a,"Content-Type","text/html; charset=utf-8"),(g=a.status)==null||g.call(a,200),a.send?a.send($):(f=a.end)==null||f.call(a,$)}catch(b){if(typeof d=="function")return d(b);(m=a.status)==null||m.call(a,500),(_=a.end)==null||_.call(a,"Internal Server Error"),console.error("[loly] express handler error",b)}}}const[B,J]=c.state(Ce()),[ot,Y]=c.state({});let te=!1;function Ce(){if(typeof window>"u")return{pathname:"/",search:"",hash:""};const{pathname:e,search:t,hash:r}=window.location;return{pathname:e,search:t,hash:r}}function X(e){const t=new URL(e,"http://localhost");return{pathname:t.pathname||"/",search:t.search,hash:t.hash}}function st(e){if(e==="*")return{pattern:/^.*$/,keys:[]};const t=[],r=e.split("/").filter(Boolean).map(s=>{if(s==="*")return"(.*)";if(s.startsWith(":")){const i=s.slice(1);return t.push(i),"([^/]+)"}return s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")});return{pattern:new RegExp("^/"+r.join("/")+"/?$"),keys:t}}function it(e){return{list:Object.entries(e).map(([r,n])=>{const{pattern:s,keys:i}=st(r);return{path:r,pattern:s,keys:i,factory:n}})}}function V(e,t){for(const r of t.list){const n=r.pattern.exec(e);if(!n)continue;const s={};return r.keys.forEach((i,o)=>{s[i]=decodeURIComponent(n[o+1]??"")}),{route:r,params:s}}return null}function Le(e,t){if(!(typeof window>"u")&&t!=="preserve"){if(e.hash){const r=document.getElementById(e.hash.slice(1));if(r){r.scrollIntoView();return}}window.scrollTo({top:0})}}function Ie(e,t={}){if(typeof window>"u")return;const r=X(e);t.replace?window.history.replaceState({},"",e):window.history.pushState({},"",e),J(r),Le(r,t.scroll)}function ct(){return B}function at(){return ot}function lt({routes:e,url:t}){t&&typeof window>"u"&&J(X(t)),typeof window<"u"&&!te&&(te=!0,window.addEventListener("popstate",()=>{const o=Ce();J(o),Le(o)}));const[r,n]=c.state(null),s=async()=>{const o=B.get(),l=V(o.pathname,e);if(!l)return Y({}),null;Y(l.params);const u=l.route.factory({params:l.params,location:o});return u instanceof Promise?await u:u};s().then(o=>{o!=null&&n(o)}).catch(o=>{console.error("[loly-router] Error rendering route:",o),n(null)});const i=B.subscribe(()=>{s().then(o=>{o!=null&&n(o)}).catch(o=>{console.error("[loly-router] Error rendering route:",o),n(null)})});return W(()=>i()),r}function ut({to:e,replace:t,children:r,className:n}){return c.createVNode("a",{href:e,onClick:s=>{s.defaultPrevented||s.button!==0||s.metaKey||s.altKey||s.ctrlKey||s.shiftKey||(s.preventDefault(),Ie(e,{replace:t}))},className:n},[r])}function dt(e,t){const r=X(e),n=V(r.pathname,t);return n?(Y(n.params),Se(()=>n.route.factory({params:n.params,location:r}))):{html:""}}function ft(){const e=[];return{setTitle:i=>{const o=e.findIndex(l=>l.tag==="title");o>=0?e[o]={tag:"title",attrs:{},content:i}:e.push({tag:"title",attrs:{},content:i})},addMeta:i=>{const o=i.name??i.property;if(o){const l=e.findIndex(u=>u.tag==="meta"&&(u.attrs.name===o||u.attrs.property===o));if(l>=0){e[l]={tag:"meta",attrs:i};return}}e.push({tag:"meta",attrs:i})},addLink:i=>{const o=i.rel,l=i.href;if(o&&l){const u=e.findIndex(a=>a.tag==="link"&&a.attrs.rel===o&&a.attrs.href===l);if(u>=0){e[u]={tag:"link",attrs:i};return}}e.push({tag:"link",attrs:i})},toString:()=>e.map(i=>{if(i.tag==="title")return`<title>${ne(i.content??"")}</title>`;const o=Object.entries(i.attrs).map(([l,u])=>`${l}="${ne(u)}"`).join(" ");return`<${i.tag}${o?" "+o:""}>`}).join(""),entries:e}}function ne(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function j(e){var r,n;const t=[];return(r=e.css)==null||r.forEach(s=>{t.push(`<link rel="stylesheet" href="${re(s)}">`)}),(n=e.js)==null||n.forEach(s=>{t.push(`<script type="module" src="${re(s)}"><\/script>`)}),t.join("")}function re(e){return e.replace(/"/g,""")}function pt(e,t){if(yt(e)){const s=e[t];if(!s)return{styles:"",scripts:""};const i=s.css??[],o=s.file?[s.file]:[],l=j({css:i}),u=j({js:o});return{styles:l,scripts:u}}const r=e[t];return r?{styles:"",scripts:j({js:[r]})}:{styles:"",scripts:""}}function yt(e){if(!e||typeof e!="object")return!1;const t=Object.values(e)[0];return!!t&&typeof t=="object"&&"file"in t}function $e(e){try{return JSON.stringify(e)}catch{return"{}"}}function gt(e,t){const r=JSON.stringify(e),n=$e(t);return`<script>window.__LOLY_DATA__ = window.__LOLY_DATA__ || {}; window.__LOLY_DATA__[${r}] = ${n};<\/script>`}function ht(e){if(typeof window>"u")return;const t=window.__LOLY_DATA__;if(t)return t[e]}const mt=/defineIsland\s*\(\s*["'`](.+?)["'`]/g;function _t(e){const t=new Set;let r;for(;(r=mt.exec(e))!==null;)r[1]&&t.add(r[1]);return Array.from(t)}function bt(e=document){e.querySelectorAll("[data-loly-async]").forEach(r=>{const n=r.getAttribute("data-loly-async");n&&(r.hasAttribute("data-loly-async-activated")||(r.setAttribute("data-loly-async-activated","true"),fetch(`/__loly/async/${n}`).then(s=>{if(s.status===404)return r.remove(),null;if(!s.ok)throw new Error(`Failed to fetch async component: ${s.statusText}`);return s.json()}).then(s=>{if(s){if(s.error)throw new Error(s.error);if(!s.html)throw new Error("No HTML content received");r.innerHTML=s.html,r.removeAttribute("data-loly-async"),r.removeAttribute("data-loly-async-activated")}}).catch(s=>{s instanceof Error&&!s.message.includes("404")&&!s.message.includes("Not Found")&&(console.error(`[loly] Error activating async component ${n}:`,s),r.innerHTML='<span style="color: red;">Error loading content</span>',r.removeAttribute("data-loly-async"),r.removeAttribute("data-loly-async-activated"))})))})}exports.Fragment=c.Fragment;exports.computed=c.computed;exports.configureRuntime=c.configureRuntime;exports.createVNode=c.createVNode;exports.getRuntimeConfig=c.getRuntimeConfig;exports.h=c.h;exports.isComputed=c.isComputed;exports.isSignal=c.isSignal;exports.isVNode=c.isVNode;exports.jsx=c.jsx;exports.jsxDEV=c.jsx;exports.jsxs=c.jsxs;exports.normalizeChildren=c.normalizeChildren;exports.state=c.state;exports.DevtoolsOverlay=Ze;exports.ErrorBoundary=we;exports.For=Ve;exports.Link=ut;exports.Router=lt;exports.Store=xe;exports.activateAsyncComponents=bt;exports.addCleanup=Pe;exports.applyProps=fe;exports.attachInstanceToVNode=E;exports.bootIslands=pe;exports.buildAssetsTags=j;exports.buildAssetsTagsFromManifest=pt;exports.component=He;exports.createExpressHandler=rt;exports.createHead=ft;exports.createInstance=v;exports.createStore=ke;exports.defineIsland=Oe;exports.defineRoutes=it;exports.extractIslandsFromCode=_t;exports.forBlock=Me;exports.getCurrentInstance=N;exports.getIsland=ie;exports.initLolyApplication=We;exports.injectData=gt;exports.isForBlock=R;exports.listRegisteredIslands=Re;exports.matchRoute=V;exports.mount=de;exports.navigate=Ie;exports.onMount=ae;exports.onUnmount=W;exports.readData=ht;exports.renderApplication=Se;exports.renderRoute=dt;exports.renderToHtml=Ae;exports.renderToHtmlStream=tt;exports.renderToStream=be;exports.renderToString=G;exports.serializeData=$e;exports.setCurrentInstance=L;exports.useLocation=ct;exports.useParams=at;exports.useStore=Ge;
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/core/store.ts","../src/island/registry.ts","../src/runtime/list.ts","../src/runtime/instance.ts","../src/render/mount.ts","../src/island/client.ts","../src/render/ssr.ts","../src/render/init.ts","../src/runtime/error-boundary.ts","../src/runtime/store-context.tsx","../src/devtools/overlay.tsx","../src/render/html.ts","../src/router/express.ts","../src/router/index.ts","../src/render/head.ts","../src/render/assets.ts","../src/render/data-bridge.ts","../src/island/utils.ts","../src/async/client.ts"],"sourcesContent":["import { state, type Signal } from \"./signal\";\nimport type { VNode } from \"./vnode\";\nimport { devLog } from \"../devtools/logger\";\nimport { getRuntimeConfig } from \"../runtime/config\";\n\n/**\n * Store<T> expone la API básica de lectura/escritura/reset y conserva referencias\n * internas para reuso (valor inicial y signal global).\n */\nexport interface Store<T> {\n get(): T;\n set(value: T | ((prev: T) => T)): void;\n update(fn: (prev: T) => T): void;\n reset(): void;\n __isStore: true;\n __defaultValue: T;\n __globalSignal: Signal<T>;\n __storeId?: string; // Unique ID for SSR/client serialization\n}\n\n/**\n * Contextos scoped asociados a un vnode concreto (para depuración).\n */\nconst storeContexts = new WeakMap<VNode, Map<Store<any>, Signal<any>>>();\n\n/**\n * Inverse index: Store -> VNode for O(1) lookup instead of O(n).\n * This allows finding the vnode that has a specific store without iterating all vnodes.\n * Used when the context stack is no longer available but children need access.\n */\nconst storeToVNode = new WeakMap<Store<any>, VNode>();\n\n/**\n * Store ID counter for generating unique IDs during SSR.\n */\nlet storeIdCounter = 0;\n\n/**\n * Generate a unique store ID for SSR/client serialization.\n */\nfunction generateStoreId(): string {\n return `store-${Date.now()}-${Math.random().toString(36).slice(2)}-${storeIdCounter++}`;\n}\n\n/**\n * Registry of stores with initialData that need to be serialized during SSR.\n * Key: storeId, Value: initialData\n */\nconst storeDataRegistry = new Map<string, any>();\n\n/**\n * Global registry for client-side recreated store contexts.\n * Used when store context is recreated from serialized data.\n */\nconst globalStoreRegistry = new WeakMap<Store<any>, Signal<any>>();\n\n/**\n * Pila de contextos activos durante el render/mount de componentes.\n * Cada layer hereda del anterior y puede shadowear stores.\n */\nconst storeContextStack: Map<Store<any>, Signal<any>>[] = [];\n\nconst currentContext = () => storeContextStack[storeContextStack.length - 1];\n\nexport function pushStoreContextLayer(): void {\n const parent = currentContext();\n const layer = parent ? new Map(parent) : new Map<Store<any>, Signal<any>>();\n storeContextStack.push(layer);\n}\n\nexport function popStoreContextLayer(): void {\n storeContextStack.pop();\n}\n\n/**\n * Register store data for SSR serialization.\n */\nexport function registerStoreData(storeId: string, initialData: any): void {\n storeDataRegistry.set(storeId, initialData);\n}\n\n/**\n * Get store data from registry (for SSR).\n */\nexport function getStoreData(storeId: string): any | undefined {\n return storeDataRegistry.get(storeId);\n}\n\n/**\n * Registrar un store scoped en el contexto actual y asociarlo al vnode.\n */\nexport function registerScopedStore<T>(\n vnode: VNode, \n store: Store<T>, \n signal: Signal<T>,\n initialData?: T\n): void {\n const layer = currentContext();\n if (layer) {\n if (getRuntimeConfig().enableWarnings && layer.has(store)) {\n console.warn(\"[loly][store] shadowing scoped store detected; consider different store instance\");\n }\n layer.set(store, signal);\n } else {\n const newLayer = new Map<Store<any>, Signal<any>>();\n newLayer.set(store, signal);\n storeContextStack.push(newLayer);\n }\n\n let contexts = storeContexts.get(vnode);\n if (!contexts) {\n contexts = new Map();\n storeContexts.set(vnode, contexts);\n }\n contexts.set(store, signal);\n \n // Update inverse index for O(1) lookup when context stack is unavailable\n // If a vnode already exists for this store, the new one replaces it (shadowing)\n storeToVNode.set(store, vnode);\n \n // If store has ID and initialData, register for SSR serialization\n if (store.__storeId && initialData !== undefined) {\n registerStoreData(store.__storeId, initialData);\n }\n}\n\n/**\n * Find the store in the active context. If not found, search in the vnode\n * that has the context registered. This allows children to access the context\n * even after the Store component finishes rendering and the context stack is popped.\n */\nfunction findScopedStore<T>(store: Store<T>): Signal<T> | null {\n // First, search in the active stack (current component context)\n // This is O(1) and the most common case\n const layer = currentContext();\n if (layer?.has(store)) {\n console.log('[findScopedStore] Found in active stack');\n return layer.get(store)!;\n }\n \n // If not in the active stack, search in the vnode that has the context registered\n // This is necessary when the Store component has finished rendering but children\n // (especially islands) still need access to the context.\n // Note: This means that once a store is registered in a vnode, it will be found\n // even after the context layer is popped. This is the desired behavior for the\n // Store component use case, but means that manual push/pop in tests will not\n // fall back to global if the store was registered in a vnode.\n const vnode = storeToVNode.get(store);\n if (vnode) {\n const contexts = storeContexts.get(vnode);\n if (contexts?.has(store)) {\n console.log('[findScopedStore] Found in vnode context');\n return contexts.get(store)!;\n }\n }\n \n // Check global registry (for client-side recreated contexts)\n const globalSignal = globalStoreRegistry.get(store);\n if (globalSignal) {\n console.log('[findScopedStore] Found in global registry');\n return globalSignal;\n }\n \n // Client-side fallback: check for serialized store data and recreate context\n if (typeof window !== \"undefined\" && store.__storeId) {\n const storeData = (window as any).__LOLY_STORE_DATA__;\n if (storeData && storeData[store.__storeId]) {\n const initialData = storeData[store.__storeId];\n // Recreate the scoped signal with the serialized initialData\n const [scopedSignal] = state(initialData);\n // Register it in global registry for future lookups\n globalStoreRegistry.set(store, scopedSignal);\n // Clean up the serialized data after first use\n delete storeData[store.__storeId];\n return scopedSignal;\n }\n }\n \n return null;\n}\n\nexport function getScopedStoreSignal<T>(store: Store<T>): Signal<T> | null {\n const signal = findScopedStore(store);\n \n // If found via client-side serialized data, it's already registered in globalStoreRegistry\n // by findScopedStore, so we just return it\n return signal;\n}\n\nexport function createStore<T>(initial: T, storeId?: string): Store<T> {\n const [globalSignal, setGlobal] = state(initial);\n const id = storeId || generateStoreId();\n\n if(!storeId){\n console.warn('[loly][store] storeId is required for SSR/client serialization');\n }\n\n return {\n __isStore: true,\n __defaultValue: initial,\n __globalSignal: globalSignal,\n __storeId: id,\n get(): T {\n const scoped = findScopedStore(this);\n return scoped ? scoped() : globalSignal();\n },\n set(value: T | ((prev: T) => T)) {\n const scoped = findScopedStore(this);\n if (scoped) {\n const prev = scoped.get();\n scoped.set(value);\n if (getRuntimeConfig().enableDevtools) {\n devLog(\"store\", \"debug\", \"store:update(scoped)\", { prev, next: scoped.get() });\n }\n } else {\n const prev = globalSignal.get();\n setGlobal(value);\n if (getRuntimeConfig().enableDevtools) {\n devLog(\"store\", \"debug\", \"store:update(global)\", { prev, next: globalSignal.get() });\n }\n }\n },\n update(fn: (prev: T) => T) {\n this.set(fn(this.get()));\n },\n reset() {\n this.set(this.__defaultValue);\n }\n };\n}\n\n\n","import type { Component } from \"../core/vnode\";\r\n\r\nconst islands = new Map<string, Component>();\r\n\r\nexport function defineIsland(name: string, component: Component): Component {\r\n islands.set(name, component);\r\n (component as any).__islandName = name;\r\n return component;\r\n}\r\n\r\nexport function getIsland(name: string) {\r\n return islands.get(name);\r\n}\r\n\r\nexport function listRegisteredIslands(): string[] {\r\n return Array.from(islands.keys());\r\n}\r\n\r\n","import type { Signal, Computed } from \"../core/signal\";\r\nimport type { VChild } from \"../core/vnode\";\r\nimport { isSignal, isComputed } from \"../core/signal\";\r\n\r\nexport type Key = string | number;\r\nexport type KeyFn<T> = (item: T, idx: number) => Key;\r\nexport type RenderItem<T> = (item: T, ctx: { remove(): void; index(): number }) => VChild;\r\n\r\nexport interface ForBlock<T> {\r\n __kind: \"for\";\r\n source: Signal<T[]> | Computed<T[]>;\r\n renderItem: RenderItem<T>;\r\n getKey: KeyFn<T>;\r\n}\r\n\r\nexport function isForBlock(v: unknown): v is ForBlock<unknown> {\r\n return !!v && typeof v === \"object\" && (v as any).__kind === \"for\";\r\n}\r\n\r\nexport interface ForProps<T> {\r\n each: Signal<T[]> | Computed<T[]>;\r\n key?: KeyFn<T>;\r\n children: RenderItem<T>;\r\n}\r\n\r\nexport function For<T>(props: ForProps<T>): ForBlock<T> {\r\n const getKey: KeyFn<T> = props.key ?? ((item: any, idx) => idx);\r\n const child = Array.isArray(props.children) ? (props.children[0] as any) : props.children;\r\n const renderItem = child as RenderItem<T>;\r\n if (typeof renderItem !== \"function\") {\r\n throw new Error(\"<For> expects a render function as its child\");\r\n }\r\n // Ensure each is a signal or computed\r\n if (!isSignal(props.each) && !isComputed(props.each)) {\r\n throw new Error(\"<For> each prop must be a signal or computed\");\r\n }\r\n return {\r\n __kind: \"for\",\r\n source: props.each,\r\n renderItem,\r\n getKey\r\n };\r\n}\r\n\r\n// Imperative helper (non-JSX) for completeness.\r\nexport function forBlock<T>(\r\n source: Signal<T[]>,\r\n renderItem: RenderItem<T>,\r\n getKey: KeyFn<T>\r\n): ForBlock<T> {\r\n if (typeof renderItem !== \"function\") {\r\n throw new Error(\"forBlock renderItem must be a function\");\r\n }\r\n return {\r\n __kind: \"for\",\r\n source,\r\n renderItem,\r\n getKey\r\n };\r\n}\r\n\r\n","import type { VChild, VNode } from \"../core/vnode\";\r\n\r\nexport type LifecycleHook = () => void;\r\n\r\nexport interface ComponentInstance {\r\n id: string;\r\n onMount: LifecycleHook[];\r\n onUnmount: LifecycleHook[];\r\n cleanup: (() => void)[];\r\n vnode?: VNode;\r\n host?: Element | null;\r\n}\r\n\r\nlet currentInstance: ComponentInstance | null = null;\r\n\r\nexport function setCurrentInstance(instance: ComponentInstance | null) {\r\n currentInstance = instance;\r\n}\r\n\r\nexport function getCurrentInstance() {\r\n return currentInstance;\r\n}\r\n\r\nexport function createInstance(): ComponentInstance {\r\n return {\r\n id: crypto.randomUUID(),\r\n onMount: [],\r\n onUnmount: [],\r\n cleanup: []\r\n };\r\n}\r\n\r\nexport function attachInstanceToVNode(vnode: VNode, instance: ComponentInstance) {\r\n vnode.__instance = instance;\r\n instance.vnode = vnode;\r\n}\r\n\r\nexport function component<T extends VChild>(factory: () => T) {\r\n const wrapped = () => factory();\r\n return wrapped as () => T;\r\n}\r\n\r\nexport function onMount(fn: LifecycleHook) {\r\n getCurrentInstance()?.onMount.push(fn);\r\n}\r\n\r\nexport function onUnmount(fn: LifecycleHook) {\r\n getCurrentInstance()?.onUnmount.push(fn);\r\n}\r\n\r\nexport function addCleanup(fn: () => void) {\r\n getCurrentInstance()?.cleanup.push(fn);\r\n}\r\n\r\n","import { isSignal, isComputed, computed } from \"../core/signal\";\nimport {\n Component,\n Fragment,\n VChild,\n isVNode,\n normalizeChildren,\n} from \"../core/vnode\";\nimport { pushStoreContextLayer, popStoreContextLayer } from \"../core/store\";\nimport { isForBlock, type ForBlock } from \"../runtime/list\";\nimport {\n attachInstanceToVNode,\n createInstance,\n setCurrentInstance,\n type LifecycleHook,\n} from \"../runtime/instance\";\nimport { devLog } from \"../devtools/logger\";\nimport { getRuntimeConfig } from \"../runtime/config\";\n\ntype MountQueue = LifecycleHook[];\ntype CleanupFn = () => void;\n\nconst nodeCleanups = new WeakMap<Node, CleanupFn[]>();\n\nfunction registerCleanup(nodes: Node | Node[], fn: CleanupFn) {\n const list = Array.isArray(nodes) ? nodes : [nodes];\n list.forEach((node) => {\n const existing = nodeCleanups.get(node);\n if (existing) {\n existing.push(fn);\n } else {\n nodeCleanups.set(node, [fn]);\n }\n });\n}\n\nfunction runCleanup(node: Node) {\n const fns = nodeCleanups.get(node);\n if (fns && fns.length) {\n nodeCleanups.delete(node);\n fns.forEach((fn) => {\n try {\n fn();\n } catch (err) {\n console.error(\"[loly] cleanup error\", err);\n }\n });\n }\n}\n\nfunction runCleanupDeep(node: Node) {\n runCleanup(node);\n node.childNodes.forEach((child) => runCleanupDeep(child));\n}\n\nfunction unmountNodes(nodes: Node[], removeFromDom: boolean = true) {\n nodes.forEach((node) => {\n runCleanupDeep(node);\n if (removeFromDom) {\n node.parentNode?.removeChild(node);\n }\n });\n}\n\n/**\n * Monta un árbol VNode en un nodo padre. No hidrata ni reconcilia;\n * siempre crea nodos nuevos.\n */\nexport function mount(v: VChild, parent: Node) {\n const pendingMounts: MountQueue = [];\n mountNode(v, parent, pendingMounts);\n // Ejecutar hooks una vez que el árbol ya está en el DOM.\n pendingMounts.forEach((fn) => fn());\n}\n\nfunction mountNode(v: VChild, parent: Node, pendingMounts: MountQueue): Node[] {\n if (Array.isArray(v)) {\n const created: Node[] = [];\n normalizeChildren(v).forEach((child) => {\n created.push(...mountNode(child, parent, pendingMounts));\n });\n return created;\n }\n\n if (isSignal(v) || isComputed(v)) {\n const marker = document.createComment(\"loly:signal\");\n parent.appendChild(marker);\n let nodes: Node[] = [];\n\n const getValue = () => (isSignal(v) ? v.get() : v.get());\n\n const renderValue = (value: unknown) => {\n unmountNodes(nodes);\n nodes = [];\n\n const frag = document.createDocumentFragment();\n mountNode(value as VChild, frag, pendingMounts);\n const newNodes = Array.from(frag.childNodes);\n\n // Verificar que el marker todavía sea hijo del parent antes de insertar\n if (marker.parentNode === parent && marker.parentNode !== null) {\n parent.insertBefore(frag, marker);\n } else {\n // Si el marker fue removido, simplemente append al final\n // Esto puede pasar si el parent fue reemplazado o el marker fue removido\n parent.appendChild(frag);\n }\n\n nodes = newNodes;\n };\n\n const update = () => renderValue(getValue());\n\n renderValue(getValue());\n const unsubscribe = (isSignal(v) ? v.subscribe : v.subscribe)(update);\n registerCleanup(marker, unsubscribe);\n return [marker, ...nodes];\n }\n\n if (typeof v === \"function\") {\n mountNode(computed(v as () => VChild), parent, pendingMounts);\n return [];\n }\n\n if (typeof v === \"string\" || typeof v === \"number\") {\n const text = document.createTextNode(String(v));\n parent.appendChild(text);\n return [text];\n }\n\n if (v === null || v === undefined || v === false || v === true) return [];\n\n if (isForBlock(v)) {\n return mountForBlock(v, parent, pendingMounts);\n }\n\n if (!isVNode(v)) return [];\n\n if (typeof v.type === \"function\") {\n pushStoreContextLayer();\n const isErrorBoundary = (v.type as any).__isErrorBoundary === true;\n const instance = createInstance();\n attachInstanceToVNode(v, instance);\n if (getRuntimeConfig().enableDevtools && (v as any).__islandDirective) {\n devLog(\"island\", \"info\", \"island:activate\", { name: (v.type as any)?.name, directive: (v as any).__islandDirective });\n }\n\n setCurrentInstance(instance);\n let out: VChild;\n try {\n out = (v.type as Component)({\n ...(v.props as Record<string, unknown>),\n children: v.children,\n });\n } catch (err) {\n setCurrentInstance(null);\n if (isErrorBoundary) {\n const props = v.props as any;\n const error = err instanceof Error ? err : new Error(String(err));\n props.onError?.(error, null);\n const fb = props.fallback ? props.fallback(error) : null;\n const nodes = fb ? mountNode(fb, parent, pendingMounts) : [];\n popStoreContextLayer();\n return nodes;\n }\n popStoreContextLayer();\n throw err;\n }\n setCurrentInstance(null);\n\n const nodes = (() => {\n if (isErrorBoundary) {\n try {\n return mountNode(out, parent, pendingMounts);\n } catch (err) {\n const props = v.props as any;\n const error = err instanceof Error ? err : new Error(String(err));\n props.onError?.(error, null);\n const fb = props.fallback ? props.fallback(error) : null;\n return fb ? mountNode(fb, parent, pendingMounts) : [];\n }\n }\n return mountNode(out, parent, pendingMounts);\n })();\n const targetNodes = nodes.length\n ? nodes\n : [document.createComment(\"loly:empty\")];\n if (!nodes.length) {\n targetNodes.forEach((n) => parent.appendChild(n));\n }\n if (instance.onMount.length) {\n pendingMounts.push(...instance.onMount);\n }\n if (instance.onUnmount.length || instance.cleanup.length) {\n let ran = false;\n const runCleanupOnce = () => {\n if (ran) return;\n ran = true;\n instance.onUnmount.forEach((fn) => {\n try {\n fn();\n } catch (err) {\n console.error(\"[loly] onUnmount error\", err);\n }\n });\n instance.cleanup.forEach((fn) => {\n try {\n fn();\n } catch (err) {\n console.error(\"[loly] cleanup error\", err);\n }\n });\n };\n registerCleanup(targetNodes, runCleanupOnce);\n }\n popStoreContextLayer();\n return targetNodes;\n }\n\n if (v.type === Fragment) {\n const created: Node[] = [];\n normalizeChildren(v.children).forEach((child) => {\n created.push(...mountNode(child, parent, pendingMounts));\n });\n return created;\n }\n\n const el = document.createElement(v.type as string);\n \n // Handle dangerouslySetInnerHTML\n const innerHTML = v.props[\"dangerouslySetInnerHTML\"] as { __html?: string } | undefined;\n if (innerHTML && innerHTML.__html) {\n el.innerHTML = innerHTML.__html;\n } else {\n applyProps(el, v.props);\n normalizeChildren(v.children).forEach((child) => {\n mountNode(child, el, pendingMounts);\n });\n }\n \n parent.appendChild(el);\n const created: Node[] = [el];\n return created;\n}\n\nfunction styleObjectToString(style: Record<string, unknown>): string {\n return Object.entries(style)\n .map(([prop, val]) => {\n // Convert camelCase to kebab-case (e.g., backgroundColor -> background-color)\n const cssProp = prop.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);\n return `${cssProp}:${val}`;\n })\n .join(\";\");\n}\n\nexport function applyProps(el: HTMLElement, props: Record<string, unknown>) {\n for (const [key, value] of Object.entries(props)) {\n if (key === \"children\") continue;\n const attr = key === \"className\" ? \"class\" : key;\n\n if (key.startsWith(\"on\") && typeof value === \"function\") {\n const eventName = key.slice(2).toLowerCase();\n el.addEventListener(eventName, value as EventListener);\n registerCleanup(el, () =>\n el.removeEventListener(eventName, value as EventListener)\n );\n continue;\n }\n\n // Special handling for input value property (not attribute)\n if (\n key === \"value\" &&\n (el instanceof HTMLInputElement ||\n el instanceof HTMLTextAreaElement ||\n el instanceof HTMLSelectElement)\n ) {\n if (isSignal(value) || isComputed(value)) {\n if (getRuntimeConfig().enableWarnings) {\n console.warn(\"[loly][warn] Passing a signal directly as value=. Usa value={signal()} o bind via onInput\");\n }\n const getVal = () => (isSignal(value) ? value.get() : value.get());\n el.value = String(getVal() ?? \"\");\n const unsubscribe = value.subscribe(() => {\n el.value = String(getVal() ?? \"\");\n });\n registerCleanup(el, unsubscribe);\n continue;\n } else {\n el.value = String(value ?? \"\");\n continue;\n }\n }\n\n // Special handling for checked property on checkboxes/radios\n if (key === \"checked\" && el instanceof HTMLInputElement) {\n if (isSignal(value) || isComputed(value)) {\n const getVal = () => (isSignal(value) ? value.get() : value.get());\n el.checked = Boolean(getVal());\n const unsubscribe = value.subscribe(() => {\n el.checked = Boolean(getVal());\n });\n registerCleanup(el, unsubscribe);\n continue;\n } else {\n el.checked = Boolean(value);\n continue;\n }\n }\n\n // Special handling for style attribute (object to CSS string)\n // Special handling for style attribute (object to CSS string)\n if (key === \"style\") {\n const applyStyle = (val: unknown) => {\n if (typeof val === \"object\" && val !== null) {\n const styleString = styleObjectToString(\n val as Record<string, unknown>\n );\n el.setAttribute(\"style\", styleString);\n } else if (val === null || val === undefined) {\n el.removeAttribute(\"style\");\n } else {\n el.setAttribute(\"style\", String(val));\n }\n };\n\n if (isSignal(value) || isComputed(value)) {\n const getVal = () => (isSignal(value) ? value.get() : value.get());\n applyStyle(getVal());\n const unsubscribe = value.subscribe(() => applyStyle(getVal()));\n registerCleanup(el, unsubscribe);\n continue;\n }\n\n // NUEVO: Detectar si el objeto style contiene funciones o signals/computed\n if (typeof value === \"object\" && value !== null) {\n const styleObj = value as Record<string, unknown>;\n\n // Verificar si alguna propiedad es una función, signal o computed\n const hasReactiveContent = Object.values(styleObj).some(\n (prop) =>\n typeof prop === \"function\" || isSignal(prop) || isComputed(prop)\n );\n\n if (hasReactiveContent) {\n // Crear un computed que re-evalúe el objeto style cuando cualquier dependencia cambie\n const reactiveStyle = computed(() => {\n const result: Record<string, unknown> = {};\n for (const [prop, val] of Object.entries(styleObj)) {\n if (isSignal(val) || isComputed(val)) {\n // Si es un signal/computed, obtener su valor\n result[prop] = val.get();\n } else if (typeof val === \"function\") {\n // Si es una función, ejecutarla (capturará dependencias si accede a signals)\n result[prop] = val();\n } else {\n // Valor estático\n result[prop] = val;\n }\n }\n return result;\n });\n\n const getVal = () => reactiveStyle.get();\n applyStyle(getVal());\n const unsubscribe = reactiveStyle.subscribe(() =>\n applyStyle(getVal())\n );\n registerCleanup(el, unsubscribe);\n continue;\n }\n }\n\n // Caso estático normal\n applyStyle(value);\n continue;\n }\n\n // Special handling for disabled to avoid disabled=\"false\" locking controls\n if (attr === \"disabled\") {\n const applyDisabled = (val: unknown) => {\n const enabled = !val || val === \"false\";\n const asForm = el as\n | HTMLButtonElement\n | HTMLInputElement\n | HTMLTextAreaElement\n | HTMLSelectElement;\n if (enabled) {\n asForm.disabled = false;\n el.removeAttribute(\"disabled\");\n } else {\n asForm.disabled = true;\n el.setAttribute(\"disabled\", \"true\");\n }\n };\n\n if (isSignal(value) || isComputed(value)) {\n const getVal = () => (isSignal(value) ? value.get() : value.get());\n applyDisabled(getVal());\n const unsubscribe = value.subscribe(() => applyDisabled(getVal()));\n registerCleanup(el, unsubscribe);\n continue;\n } else {\n applyDisabled(value);\n continue;\n }\n }\n\n if (isSignal(value) || isComputed(value)) {\n const getVal = () => (isSignal(value) ? value.get() : value.get());\n el.setAttribute(attr, String(getVal()));\n const unsubscribe = value.subscribe(() =>\n el.setAttribute(attr, String(getVal()))\n );\n registerCleanup(el, unsubscribe);\n continue;\n }\n\n // Skip non-event function props (do not render as attributes)\n if (typeof value === \"function\") {\n continue;\n }\n\n el.setAttribute(attr, String(value));\n }\n}\n\nfunction mountForBlock<T>(\n block: ForBlock<T>,\n parent: Node,\n pendingMounts: MountQueue\n): Node[] {\n const start = document.createComment(\"loly:for:start\");\n const end = document.createComment(\"loly:for:end\");\n parent.appendChild(start);\n parent.appendChild(end);\n\n type Entry = { key: string | number; nodes: Node[]; item: T };\n let entries: Entry[] = [];\n\n const updateList = (items: T[]) => {\n const keyToEntry = new Map<Entry[\"key\"], Entry>();\n entries.forEach((e) => keyToEntry.set(e.key, e));\n\n const nextEntries: Entry[] = [];\n let ref: Node = end;\n\n // iterate backwards to keep stable insertion point\n for (let i = items.length - 1; i >= 0; i--) {\n const item = items[i];\n const key = block.getKey(item, i);\n const existing = keyToEntry.get(key);\n let nodes: Node[] = [];\n\n if (existing) {\n // Reuse existing nodes - no recreation for stable keys\n nodes = existing.nodes;\n keyToEntry.delete(key);\n\n // Update index context for moved items\n const firstNode = nodes[0];\n if (firstNode && firstNode.nextSibling !== ref) {\n // Item moved position, update DOM order\n if (ref.parentNode === parent && ref.parentNode !== null) {\n nodes.forEach((n) => parent.insertBefore(n, ref));\n } else {\n // Fallback: append nodes when ref is invalid\n nodes.forEach((n) => parent.appendChild(n));\n }\n }\n } else {\n // New item - create nodes\n const frag = document.createDocumentFragment();\n const sourceSignal = block.source;\n nodes = mountNode(\n block.renderItem(item, {\n remove: () => {\n // Remove item from source signal (only works with Signal, not Computed)\n if (isSignal(sourceSignal)) {\n const current = sourceSignal.get();\n const newList = current.filter((_, idx) => {\n const itemKey = block.getKey(current[idx], idx);\n return itemKey !== key;\n });\n sourceSignal.set(newList);\n } else {\n console.warn(\n \"ctx.remove() is not supported when <For> uses a computed source. Handle removal manually.\"\n );\n }\n },\n index: () => {\n // Return current index by finding position in current list\n const current = sourceSignal.get();\n return current.findIndex(\n (it, idx) => block.getKey(it, idx) === key\n );\n },\n }),\n frag,\n pendingMounts\n );\n nodes = nodes.length ? nodes : Array.from(frag.childNodes);\n if (frag.childNodes.length) {\n if (ref.parentNode === parent && ref.parentNode !== null) {\n parent.insertBefore(frag, ref);\n } else {\n // Fallback when ref is not attached to parent\n parent.appendChild(frag);\n }\n }\n }\n\n ref = nodes[0] ?? ref;\n nextEntries.unshift({ key, nodes, item });\n }\n\n // Remove items that are no longer in the list\n keyToEntry.forEach((entry) => unmountNodes(entry.nodes));\n entries = nextEntries;\n };\n\n // For computed, we need to evaluate it first to track dependencies\n // For signals, this is a no-op but ensures consistent behavior\n const initialItems = block.source.get();\n updateList(initialItems);\n\n // Subscribe to signal/computed changes\n // Note: For computed, this subscription will be notified when dependencies change\n // because the computed tracks dependencies during the initial get() call above\n const unsubscribe = block.source.subscribe((items) => {\n updateList(items);\n });\n registerCleanup(end, unsubscribe);\n\n // Note: Subscriptions remain active for the lifetime of the parent node.\n // In a future enhancement, we could track subscriptions and clean them up\n // when the parent is removed from the DOM.\n return [start, end];\n}\n","import { getIsland } from \"./registry\";\r\nimport { mount } from \"../render/mount\";\r\nimport { createVNode } from \"../core/vnode\";\r\n\r\ntype Directive = \"load\" | \"idle\" | \"visible\" | `media:${string}`;\r\n\r\nfunction parseDirective(value: string | null): Directive {\r\n if (!value) return \"load\";\r\n if (value.startsWith(\"media:\")) return value as Directive;\r\n if (value === \"idle\" || value === \"visible\" || value === \"load\") return value;\r\n return \"load\";\r\n}\r\n\r\nfunction scheduleMount(el: HTMLElement, directive: Directive, mountFn: () => void) {\r\n if (directive === \"load\") {\r\n mountFn();\r\n return;\r\n }\r\n\r\n if (directive === \"idle\") {\r\n if (\"requestIdleCallback\" in window) {\r\n (window as any).requestIdleCallback(mountFn);\r\n } else {\r\n setTimeout(mountFn, 0);\r\n }\r\n return;\r\n }\r\n\r\n if (directive === \"visible\") {\r\n const observer = new IntersectionObserver(entries => {\r\n const entry = entries[0];\r\n if (entry.isIntersecting) {\r\n observer.disconnect();\r\n mountFn();\r\n }\r\n });\r\n observer.observe(el);\r\n return;\r\n }\r\n\r\n if (directive.startsWith(\"media:\")) {\r\n const query = directive.slice(\"media:\".length);\r\n const mq = window.matchMedia(query);\r\n const run = () => {\r\n mq.removeEventListener(\"change\", onChange);\r\n mountFn();\r\n };\r\n const onChange = (event: MediaQueryListEvent) => {\r\n if (event.matches) {\r\n run();\r\n }\r\n };\r\n if (mq.matches) {\r\n run();\r\n } else {\r\n mq.addEventListener(\"change\", onChange);\r\n }\r\n return;\r\n }\r\n\r\n mountFn();\r\n}\r\n\r\nexport function bootIslands(root: ParentNode = document) {\r\n const nodes = root.querySelectorAll<HTMLElement>(\"[data-loly-island]\");\r\n\r\n nodes.forEach(el => {\r\n // Skip if already booted (has data-loly-booted attribute)\r\n if (el.hasAttribute(\"data-loly-booted\")) return;\r\n\r\n const name = el.getAttribute(\"data-loly-island\");\r\n if (!name) return;\r\n\r\n const Island = getIsland(name);\r\n if (!Island) return;\r\n\r\n // Mark as booted to prevent re-mounting\r\n el.setAttribute(\"data-loly-booted\", \"true\");\r\n\r\n const islandId = el.getAttribute(\"data-island-id\");\r\n let props: Record<string, unknown> = {};\r\n if (islandId && typeof window !== \"undefined\") {\r\n const store = (window as any).__LOLY_ISLAND_DATA__;\r\n if (store && store[islandId]) {\r\n props = store[islandId];\r\n // Cleanup after reading to avoid leaking memory in client navigations\r\n delete store[islandId];\r\n }\r\n }\r\n\r\n const directive = parseDirective(el.getAttribute(\"data-client\"));\r\n const mountFn = () => {\r\n el.innerHTML = \"\";\r\n const vnode = createVNode(Island as any, props, []);\r\n mount(vnode, el);\r\n };\r\n\r\n scheduleMount(el, directive, mountFn);\r\n });\r\n}\r\n\r\n","import { isSignal, isComputed, computed } from \"../core/signal\";\r\nimport { Component, Fragment, VChild, VNode, isVNode, normalizeChildren } from \"../core/vnode\";\r\nimport { isForBlock } from \"../runtime/list\";\r\nimport { createInstance, setCurrentInstance, attachInstanceToVNode } from \"../runtime/instance\";\r\n\r\nconst escapeText = (value: string) =>\r\n value.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\").replace(/\"/g, \""\");\r\n\r\nconst isPrimitive = (value: unknown): value is string | number | boolean | null | undefined =>\r\n typeof value === \"string\" ||\r\n typeof value === \"number\" ||\r\n typeof value === \"boolean\" ||\r\n value === null ||\r\n value === undefined;\r\n\r\nlet islandCounter = 0;\r\n\r\nfunction renderAttributes(props: Record<string, unknown>): string {\r\n const parts: string[] = [];\r\n for (const [key, rawValue] of Object.entries(props)) {\r\n if (key === \"children\" || key === \"key\" || key === \"dangerouslySetInnerHTML\") continue;\r\n if (key.startsWith(\"on\") && typeof rawValue === \"function\") continue;\r\n const value = isSignal(rawValue)\r\n ? rawValue.get()\r\n : isComputed(rawValue)\r\n ? rawValue.get()\r\n : rawValue;\r\n if (value === false || value === null || value === undefined) continue;\r\n const attrName = key === \"className\" ? \"class\" : key;\r\n if (attrName === \"style\" && typeof value === \"object\" && value !== null) {\r\n const styleString = Object.entries(value as Record<string, unknown>)\r\n .map(([prop, val]) => `${prop.toString().replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`)}:${val}`)\r\n .join(\";\");\r\n parts.push(`${attrName}=\"${escapeText(styleString)}\"`);\r\n continue;\r\n }\r\n if (value === true) {\r\n parts.push(`${attrName}`);\r\n } else {\r\n parts.push(`${attrName}=\"${escapeText(String(value))}\"`);\r\n }\r\n }\r\n return parts.length ? ` ${parts.join(\" \")}` : \"\";\r\n}\r\n\r\nasync function renderChildren(children: VChild[]): Promise<string> {\r\n // En SSR, renderizar signals directamente sin normalizar para evitar recursión\r\n const isSSR = typeof window === \"undefined\";\r\n if (isSSR) {\r\n // Renderizar cada child directamente, manejando signals inline\r\n const results = await Promise.all(children.map(async child => {\r\n if (isSignal(child)) {\r\n return renderNode(child.get() as VChild);\r\n }\r\n if (isComputed(child)) {\r\n return renderNode(child.get() as VChild);\r\n }\r\n return renderNode(child);\r\n }));\r\n return results.join(\"\");\r\n }\r\n const results = await Promise.all(children.map(renderNode));\r\n return results.join(\"\");\r\n}\r\n\r\nasync function renderComponent(node: VNode): Promise<string> {\r\n const component = node.type as Component;\r\n const instance = createInstance();\r\n attachInstanceToVNode(node, instance);\r\n setCurrentInstance(instance);\r\n const output = component({ ...(node.props as Record<string, unknown>), children: node.children });\r\n if (isVNode(output)) {\r\n attachInstanceToVNode(output, instance);\r\n }\r\n setCurrentInstance(null);\r\n \r\n // Resolve Promises before rendering (for RSCStrategy compatibility)\r\n const resolvedOutput = isPromiseLike(output) ? await (output as Promise<VChild>) : output;\r\n \r\n return renderNode(resolvedOutput as VChild);\r\n}\r\n\r\nfunction serializeIslandProps(props: Record<string, unknown>) {\r\n const replacer = (_key: string, value: unknown) => {\r\n if (value === undefined) return undefined;\r\n if (typeof value === \"function\") return undefined;\r\n if (typeof value === \"symbol\") return undefined;\r\n if (isSignal(value)) return value.get();\r\n return value;\r\n };\r\n\r\n const plain = { ...props };\r\n delete (plain as Record<string, unknown>).children;\r\n delete (plain as Record<string, unknown>).key;\r\n delete (plain as Record<string, unknown>).__islandDirective;\r\n\r\n try {\r\n return JSON.stringify(plain, replacer) ?? \"{}\";\r\n } catch {\r\n return \"{}\";\r\n }\r\n}\r\n\r\nfunction serializeIslandPropsToObject(props: Record<string, unknown>): Record<string, unknown> {\r\n const replacer = (_key: string, value: unknown) => {\r\n if (value === undefined) return undefined;\r\n if (typeof value === \"function\") return undefined;\r\n if (typeof value === \"symbol\") return undefined;\r\n if (isSignal(value)) return value.get();\r\n return value;\r\n };\r\n\r\n const plain = { ...props };\r\n delete (plain as Record<string, unknown>).children;\r\n delete (plain as Record<string, unknown>).key;\r\n delete (plain as Record<string, unknown>).__islandDirective;\r\n\r\n try {\r\n return JSON.parse(JSON.stringify(plain, replacer)) as Record<string, unknown>;\r\n } catch {\r\n return {};\r\n }\r\n}\r\n\r\nfunction generateIslandId(): string {\r\n return `island-${Date.now()}-${Math.random().toString(36).slice(2)}-${islandCounter++}`;\r\n}\r\n\r\ntype IslandComponent = Component & { __islandName?: string };\r\n\r\nfunction resolveIslandName(component: Component) {\r\n const islandName = (component as IslandComponent).__islandName;\r\n return islandName || (component as IslandComponent).name || \"Island\";\r\n}\r\n\r\nasync function renderElement(node: VNode): Promise<string> {\r\n if (node.type === Fragment) {\r\n return renderChildren(node.children);\r\n }\r\n\r\n if (typeof node.type === \"function\") {\r\n if (node.__islandDirective) {\r\n const islandName = resolveIslandName(node.type as Component);\r\n const propsObj = serializeIslandPropsToObject(node.props);\r\n const inner = await renderComponent(node);\r\n const directive = node.__islandDirective;\r\n const dataClient = directive ? ` data-client=\"${escapeText(directive)}\"` : \"\";\r\n const islandId = generateIslandId();\r\n const idJson = JSON.stringify(islandId);\r\n const propsJson = JSON.stringify(propsObj);\r\n const propsScript = `<script>window.__LOLY_ISLAND_DATA__=window.__LOLY_ISLAND_DATA__||{};window.__LOLY_ISLAND_DATA__[${idJson}]=${propsJson};</script>`;\r\n return `${propsScript}<div data-loly-island=\"${escapeText(islandName)}\" data-island-id=\"${escapeText(\r\n islandId\r\n )}\"${dataClient}>${inner}</div>`;\r\n }\r\n\r\n // Detect Store component and serialize initialData\r\n // Use property check instead of reference comparison for reliability\r\n const component = node.type as Component & { __isStoreComponent?: boolean };\r\n if (component.__isStoreComponent) {\r\n const props = node.props as any;\r\n const store = props.store;\r\n if (store?.__storeId && props.initialData !== undefined) {\r\n const storeIdJson = JSON.stringify(store.__storeId);\r\n const dataJson = JSON.stringify(props.initialData);\r\n const storeScript = `<script>window.__LOLY_STORE_DATA__=window.__LOLY_STORE_DATA__||{};window.__LOLY_STORE_DATA__[${storeIdJson}]=${dataJson};</script>`;\r\n // Inject the script before the Store component's rendered output\r\n const inner = await renderComponent(node);\r\n return storeScript + inner;\r\n }\r\n }\r\n\r\n return renderComponent(node);\r\n }\r\n\r\n const tag = node.type;\r\n const attrs = renderAttributes(node.props);\r\n const innerHTML = node.props[\"dangerouslySetInnerHTML\"] as { __html?: string } | undefined;\r\n\r\n if (innerHTML && typeof innerHTML.__html === \"string\") {\r\n return `<${tag}${attrs}>${innerHTML.__html}</${tag}>`;\r\n }\r\n\r\n const children = await renderChildren(node.children);\r\n return `<${tag}${attrs}>${children}</${tag}>`;\r\n}\r\n\r\nexport async function renderNode(node: VChild): Promise<string> {\r\n if (Array.isArray(node)) {\r\n // In SSR, arrays are already normalized when passed as children\r\n // Just render them directly without re-normalizing to avoid recursion\r\n return renderChildren(node);\r\n }\r\n\r\n if (typeof node === \"function\") {\r\n // In SSR, evaluate functions directly without creating computed signals\r\n // to avoid infinite recursion\r\n const result = (node as () => VChild)();\r\n // Handle Promises from functions\r\n const resolvedResult = isPromiseLike(result) ? await (result as Promise<VChild>) : result;\r\n return renderNode(resolvedResult as VChild);\r\n }\r\n\r\n if (isForBlock(node)) {\r\n const items = node.source.get();\r\n const results = await Promise.all(\r\n items.map((it, i: number) => renderNode(node.renderItem(it, { remove() {}, index: () => i })))\r\n );\r\n return results.join(\"\");\r\n }\r\n\r\n if (isSignal(node)) {\r\n return renderNode(node.get() as VChild);\r\n }\r\n\r\n if (isComputed(node)) {\r\n return renderNode(node.get() as VChild);\r\n }\r\n\r\n if (isPrimitive(node)) {\r\n if (node === false || node === null || node === undefined) return \"\";\r\n return escapeText(String(node));\r\n }\r\n\r\n if (isVNode(node)) {\r\n return renderElement(node);\r\n }\r\n\r\n return \"\";\r\n}\r\n\r\nexport async function renderToString(node: VChild): Promise<string> {\r\n return renderNode(node);\r\n}\r\n\r\nexport interface RenderToStreamOptions {\r\n /**\r\n * Callback to register async tasks (for async components).\r\n * Called when a Promise is encountered during rendering.\r\n */\r\n onAsyncTask?: (id: string, fn: () => Promise<VChild>, props?: Record<string, unknown>) => void;\r\n}\r\n\r\n// Streaming: emite el HTML de manera incremental.\r\n// Stream se cierra inmediatamente después del contenido síncrono.\r\n// Componentes async se registran vía onAsyncTask y se renderizan como placeholders.\r\nexport function renderToStream(\r\n node: VChild,\r\n options: RenderToStreamOptions = {}\r\n): ReadableStream<Uint8Array> {\r\n const { onAsyncTask } = options;\r\n const encoder = new TextEncoder();\r\n let asyncCounter = 0;\r\n\r\n async function writeNode(\r\n n: VChild,\r\n controller: ReadableStreamDefaultController<Uint8Array>,\r\n fallback?: string,\r\n asyncPath?: string\r\n ): Promise<void> {\r\n // Never await Promises at root level - always use placeholder system\r\n // Promises are only handled in components (output) and children (loop)\r\n\r\n if (Array.isArray(n)) {\r\n for (const child of normalizeChildren(n)) {\r\n await writeNode(child, controller, undefined, asyncPath);\r\n }\r\n return;\r\n }\r\n\r\n if (isForBlock(n)) {\r\n const items = n.source.get();\r\n for (let i = 0; i < items.length; i++) {\r\n await writeNode(n.renderItem(items[i], { remove() {}, index: () => i }), controller);\r\n }\r\n return;\r\n }\r\n\r\n if (isSignal(n)) {\r\n return writeNode(n.get() as VChild, controller, undefined, asyncPath);\r\n }\r\n\r\n if (isComputed(n)) {\r\n return writeNode(n.get() as VChild, controller, undefined, asyncPath);\r\n }\r\n\r\n if (isPrimitive(n)) {\r\n if (n === false || n === null || n === undefined) return;\r\n controller.enqueue(encoder.encode(escapeText(String(n))));\r\n return;\r\n }\r\n\r\n if (isVNode(n)) {\r\n if (n.type === Fragment || typeof n.type === \"symbol\") {\r\n for (const child of normalizeChildren(n.children)) {\r\n await writeNode(child, controller, undefined, asyncPath);\r\n }\r\n return;\r\n }\r\n\r\n if (typeof n.type === \"function\") {\r\n if (n.__islandDirective) {\r\n // Islands must still render inner HTML so activation can occur.\r\n const islandName = resolveIslandName(n.type as Component);\r\n const propsObj = serializeIslandPropsToObject(n.props);\r\n const instance = createInstance();\r\n attachInstanceToVNode(n, instance);\r\n setCurrentInstance(instance);\r\n const output = (n.type as Component)({ ...(n.props as Record<string, unknown>), children: n.children });\r\n if (isVNode(output)) {\r\n attachInstanceToVNode(output, instance);\r\n }\r\n setCurrentInstance(null);\r\n // Process output with writeNode to handle Promises in children\r\n const islandId = generateIslandId();\r\n const idJson = JSON.stringify(islandId);\r\n const propsJson = JSON.stringify(propsObj);\r\n const propsScript = `<script>window.__LOLY_ISLAND_DATA__=window.__LOLY_ISLAND_DATA__||{};window.__LOLY_ISLAND_DATA__[${idJson}]=${propsJson};</script>`;\r\n const islandStart = `${propsScript}<div data-loly-island=\"${escapeText(\r\n islandName\r\n )}\" data-island-id=\"${escapeText(islandId)}\"${\r\n n.__islandDirective ? ` data-client=\"${escapeText(n.__islandDirective)}\"` : \"\"\r\n }>`;\r\n controller.enqueue(encoder.encode(islandStart));\r\n await writeNode(output, controller, undefined, asyncPath);\r\n controller.enqueue(encoder.encode(\"</div>\"));\r\n return;\r\n }\r\n\r\n // Detect Store component and serialize initialData\r\n const component = n.type as Component & { __isStoreComponent?: boolean };\r\n if (component.__isStoreComponent) {\r\n const props = n.props as any;\r\n const store = props.store;\r\n if (store?.__storeId && props.initialData !== undefined) {\r\n const storeIdJson = JSON.stringify(store.__storeId);\r\n const dataJson = JSON.stringify(props.initialData);\r\n const storeScript = `<script>window.__LOLY_STORE_DATA__=window.__LOLY_STORE_DATA__||{};window.__LOLY_STORE_DATA__[${storeIdJson}]=${dataJson};</script>`;\r\n // Emit the script before the Store component's rendered output\r\n controller.enqueue(encoder.encode(storeScript));\r\n }\r\n }\r\n\r\n // Execute component and process output with writeNode to handle Promises\r\n const instance = createInstance();\r\n attachInstanceToVNode(n, instance);\r\n setCurrentInstance(instance);\r\n const output = (n.type as Component)({ ...(n.props as Record<string, unknown>), children: n.children });\r\n if (isVNode(output)) {\r\n attachInstanceToVNode(output, instance);\r\n }\r\n setCurrentInstance(null);\r\n \r\n // If component returns a Promise, register async task and emit placeholder\r\n if (isPromiseLike(output)) {\r\n const asyncId = `async-${asyncCounter++}`;\r\n // Register task in registry (if callback provided)\r\n if (onAsyncTask) {\r\n onAsyncTask(asyncId, () => output as Promise<VChild>, n.props as Record<string, unknown>);\r\n }\r\n // Emit placeholder with data-loly-async attribute\r\n controller.enqueue(encoder.encode(`<div data-loly-async=\"${escapeText(asyncId)}\"><!-- placeholder --></div>`));\r\n return; // Don't await - continue processing immediately\r\n }\r\n \r\n await writeNode(output, controller, undefined, asyncPath);\r\n return;\r\n }\r\n\r\n const tag = n.type;\r\n const attrs = renderAttributes(n.props);\r\n const innerHTML = n.props[\"dangerouslySetInnerHTML\"] as { __html?: string } | undefined;\r\n\r\n controller.enqueue(encoder.encode(`<${tag}${attrs}>`));\r\n if (innerHTML && typeof innerHTML.__html === \"string\") {\r\n controller.enqueue(encoder.encode(innerHTML.__html));\r\n } else {\r\n const children = normalizeChildren(n.children);\r\n \r\n // Process children: emit non-Promises immediately, handle Promises with placeholders\r\n for (const child of children) {\r\n if (isPromiseLike(child)) {\r\n const asyncId = `async-${asyncCounter++}`;\r\n // Register task in registry (if callback provided)\r\n if (onAsyncTask) {\r\n onAsyncTask(asyncId, () => child as Promise<VChild>, undefined);\r\n }\r\n // Emit placeholder with data-loly-async attribute\r\n controller.enqueue(encoder.encode(`<div data-loly-async=\"${escapeText(asyncId)}\"><!-- placeholder --></div>`));\r\n // Don't await - continue processing next children immediately\r\n } else {\r\n await writeNode(child, controller);\r\n }\r\n }\r\n }\r\n controller.enqueue(encoder.encode(`</${tag}>`));\r\n return;\r\n }\r\n }\r\n\r\n return new ReadableStream({\r\n async start(controller) {\r\n try {\r\n await writeNode(node, controller);\r\n // Stream closes immediately after sync content\r\n // Async components are registered via onAsyncTask and rendered as placeholders\r\n // Client will fetch and activate them\r\n } catch (err) {\r\n controller.error(err);\r\n return;\r\n }\r\n controller.close();\r\n }\r\n });\r\n}\r\n\r\nfunction isPromiseLike(value: unknown): value is Promise<unknown> {\r\n return typeof value === \"object\" && value !== null && \"then\" in value && typeof (value as Promise<unknown>).then === \"function\";\r\n}\r\n\r\n","import { bootIslands } from \"../island/client\";\r\nimport { renderToString } from \"./ssr\";\r\nimport type { VChild } from \"../core/vnode\";\r\n\r\ntype RenderFn = () => VChild | Promise<VChild>;\r\n\r\nexport interface InitIslandsOptions {\r\n target?: string | HTMLElement;\r\n}\r\n\r\nfunction resolveTarget(target?: string | HTMLElement): ParentNode {\r\n if (!target) return document;\r\n if (typeof target === \"string\") {\r\n const el = document.querySelector<HTMLElement>(target);\r\n if (!el) throw new Error(`initLolyApplication: target not found: ${target}`);\r\n return el;\r\n }\r\n return target;\r\n}\r\n\r\n/**\r\n * Cliente: busca islas y monta desde cero.\r\n */\r\nexport function initLolyApplication(options: InitIslandsOptions = {}) {\r\n const root = resolveTarget(options.target);\r\n bootIslands(root);\r\n}\r\n\r\n/**\r\n * Servidor: devuelve HTML serializado.\r\n */\r\nexport async function renderApplication(render: RenderFn) {\r\n const view = await render();\r\n return {\r\n html: await renderToString(view)\r\n };\r\n}\r\n\r\n","import type { VChild, Component } from \"../core/vnode\";\r\n\r\nexport interface ErrorBoundaryProps {\r\n fallback?: (error: Error) => VChild;\r\n onError?: (error: Error, info: unknown) => void;\r\n children?: VChild | VChild[];\r\n}\r\n\r\nexport const ErrorBoundary: Component<ErrorBoundaryProps> = (props) => {\r\n const getChild = (): VChild | null => {\r\n if (Array.isArray(props.children)) {\r\n return (props.children[0] as VChild) ?? null;\r\n }\r\n return (props.children as VChild) ?? null;\r\n };\r\n\r\n const renderChild = () => {\r\n const child = getChild();\r\n return typeof child === \"function\" ? (child as () => VChild)() : child;\r\n };\r\n\r\n const run = () => {\r\n try {\r\n return renderChild();\r\n } catch (err) {\r\n const error = err instanceof Error ? err : new Error(String(err));\r\n props.onError?.(error, null);\r\n if (props.fallback) return props.fallback(error);\r\n return null;\r\n }\r\n };\r\n\r\n // Return a function so downstream rendering happens inside the try/catch above.\r\n return () => run();\r\n};\r\n\r\n(ErrorBoundary as any).__isErrorBoundary = true;\r\n\r\n","import { state } from \"../core/signal\";\r\nimport { registerScopedStore, type Store, getScopedStoreSignal } from \"../core/store\";\r\nimport { getCurrentInstance } from \"./instance\";\r\nimport type { VChild } from \"../core/vnode\";\r\n\r\ninterface StoreProps<T> {\r\n store: Store<T>;\r\n initialData?: T; // Permite popular desde SSR o desde el padre\r\n children?: VChild | VChild[];\r\n}\r\n\r\nexport function Store<T>({ store, initialData, children }: StoreProps<T>): VChild {\r\n const instance = getCurrentInstance();\r\n if (!instance?.vnode) {\r\n throw new Error(\"Store component must be used inside a component\");\r\n }\r\n\r\n const initialValue = initialData !== undefined \r\n ? initialData \r\n : (() => {\r\n const parentScoped = getScopedStoreSignal(store);\r\n if (parentScoped) {\r\n return parentScoped();\r\n }\r\n const currentValue = store.get();\r\n return currentValue;\r\n })();\r\n\r\n const [scopedValue] = state(initialValue);\r\n \r\n registerScopedStore(instance.vnode, store, scopedValue, initialData);\r\n\r\n return (children as VChild) ?? null;\r\n}\r\n\r\n// Mark Store component for SSR detection\r\n(Store as any).__isStoreComponent = true;\r\n\r\n// Hook opcional para futuras extensiones (hoy es transparente)\r\nexport function useStore<T>(store: Store<T>): Store<T> {\r\n const scopedSignal = getScopedStoreSignal(store);\r\n if (!scopedSignal) {\r\n return store;\r\n }\r\n\r\n return {\r\n __isStore: true,\r\n __defaultValue: store.__defaultValue,\r\n __globalSignal: store.__globalSignal,\r\n get: () => scopedSignal(),\r\n set: (value: T | ((prev: T) => T)) => scopedSignal.set(value),\r\n update: (fn: (prev: T) => T) => scopedSignal.set((prev) => fn(prev)),\r\n reset: () => scopedSignal.set(store.__defaultValue),\r\n };\r\n}\r\n\r\n","import { state } from \"../core/signal\";\r\nimport type { VChild } from \"../core/vnode\";\r\nimport { onMount, onUnmount } from \"../runtime/instance\";\r\nimport { onDevtoolsEvent, type DevtoolsEvent } from \"./logger\";\r\nimport { getRuntimeConfig } from \"../runtime/config\";\r\n\r\nconst MAX_EVENTS = 50;\r\n\r\nexport function DevtoolsOverlay(): VChild {\r\n const cfg = getRuntimeConfig();\r\n if (!cfg.enableDevtools) return null;\r\n\r\n const [open, setOpen] = state(false);\r\n const [events, setEvents] = state<DevtoolsEvent[]>([]);\r\n const [paused, setPaused] = state(false);\r\n\r\n onMount(() => {\r\n // Capturar el valor de paused fuera del listener para evitar leer el signal dentro\r\n let isPaused = false;\r\n const unsubscribePaused = paused.subscribe((val) => {\r\n isPaused = val;\r\n });\r\n \r\n // Flag para evitar loops: no procesar eventos mientras estamos actualizando\r\n let isUpdating = false;\r\n \r\n const unsubscribe = onDevtoolsEvent((evt) => {\r\n // Ignorar eventos del overlay mismo para evitar loops\r\n if (evt.scope === \"overlay\") return;\r\n // Ignorar eventos de signal:update que son del signal events del overlay\r\n // (detectamos porque prev y next son arrays de DevtoolsEvent[])\r\n if (evt.scope === \"signal\" && evt.message === \"signal:update\") {\r\n const payload = evt.payload as { prev?: unknown; next?: unknown };\r\n if (Array.isArray(payload.prev) && Array.isArray(payload.next)) {\r\n // Si el array tiene elementos y son DevtoolsEvent, es el signal events del overlay\r\n if (payload.prev.length > 0 || payload.next.length > 0) {\r\n const firstItem = (payload.prev[0] || payload.next[0]) as DevtoolsEvent | undefined;\r\n if (firstItem && typeof firstItem === \"object\" && \"scope\" in firstItem && \"timestamp\" in firstItem) {\r\n return; // Es el signal events del overlay, ignorar\r\n }\r\n }\r\n }\r\n }\r\n // Ignorar si estamos actualizando (evita loops cuando setEvents dispara devLog)\r\n if (isUpdating) return;\r\n if (isPaused) return;\r\n \r\n isUpdating = true;\r\n try {\r\n setEvents((prev) => {\r\n const next = [...prev, evt].slice(-MAX_EVENTS);\r\n return next;\r\n });\r\n } finally {\r\n // Usar setTimeout para asegurar que el flag se resetee después de que se complete el update\r\n setTimeout(() => {\r\n isUpdating = false;\r\n }, 0);\r\n }\r\n });\r\n \r\n onUnmount(() => {\r\n unsubscribe();\r\n unsubscribePaused();\r\n });\r\n });\r\n\r\n const toggleOpen = () => setOpen((v) => !v);\r\n const togglePause = () => setPaused((v) => !v);\r\n const clear = () => setEvents([]);\r\n\r\n return (\r\n <div style={{ position: \"fixed\", right: \"12px\", bottom: \"12px\", zIndex: 9999, fontFamily: \"system-ui\", fontSize: \"12px\" }}>\r\n <button\r\n onClick={toggleOpen}\r\n style={{\r\n padding: \"6px 10px\",\r\n borderRadius: \"6px\",\r\n border: \"1px solid #cbd5e1\",\r\n background: \"#111827\",\r\n color: \"#f8fafc\",\r\n cursor: \"pointer\",\r\n }}\r\n >\r\n Devtools\r\n </button>\r\n\r\n {() => open() && (\r\n <div\r\n style={{\r\n marginTop: \"8px\",\r\n width: \"360px\",\r\n maxHeight: \"320px\",\r\n overflow: \"hidden\",\r\n border: \"1px solid #cbd5e1\",\r\n borderRadius: \"8px\",\r\n background: \"#0f172a\",\r\n color: \"#e2e8f0\",\r\n boxShadow: \"0 10px 30px rgba(0,0,0,0.35)\",\r\n }}\r\n >\r\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\", padding: \"8px 10px\", borderBottom: \"1px solid #1f2937\" }}>\r\n <strong style={{ fontSize: \"12px\" }}>Devtools</strong>\r\n <span style={{ flex: 1 }} />\r\n <button onClick={togglePause} style={btnStyle(paused())}>{paused() ? \"Resume\" : \"Pause\"}</button>\r\n <button onClick={clear} style={btnStyle(false)}>Clear</button>\r\n </div>\r\n <div style={{ maxHeight: \"260px\", overflowY: \"auto\" }}>\r\n {() => events().length === 0 ? (\r\n <div style={{ padding: \"12px\", color: \"#94a3b8\" }}>No events</div>\r\n ) : (\r\n events().slice().reverse().map((evt, idx) => (\r\n <div key={idx} style={{ padding: \"8px 10px\", borderBottom: \"1px solid #1f2937\" }}>\r\n <div style={{ display: \"flex\", gap: \"6px\", alignItems: \"center\" }}>\r\n <span style={pillStyle(evt.level)}>{evt.level}</span>\r\n <span style={pillScopeStyle}>{evt.scope}</span>\r\n <span style={{ color: \"#9ca3af\", fontSize: \"11px\" }}>{new Date(evt.timestamp).toLocaleTimeString()}</span>\r\n </div>\r\n <div style={{ marginTop: \"4px\", color: \"#e5e7eb\" }}>{evt.message}</div>\r\n {evt.payload ? (\r\n <pre style={{ marginTop: \"4px\", fontSize: \"11px\", color: \"#cbd5e1\", whiteSpace: \"pre-wrap\" }}>\r\n {JSON.stringify(evt.payload, null, 2)}\r\n </pre>\r\n ) : null}\r\n </div>\r\n ))\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nconst btnStyle = (active: boolean) => ({\r\n padding: \"4px 8px\",\r\n borderRadius: \"6px\",\r\n border: \"1px solid #334155\",\r\n background: active ? \"#1e293b\" : \"#111827\",\r\n color: \"#e2e8f0\",\r\n cursor: \"pointer\",\r\n fontSize: \"11px\",\r\n});\r\n\r\nconst pillStyle = (level: string) => ({\r\n fontSize: \"10px\",\r\n padding: \"2px 6px\",\r\n borderRadius: \"999px\",\r\n textTransform: \"uppercase\",\r\n background: level === \"error\" ? \"#7f1d1d\" : level === \"warn\" ? \"#854d0e\" : \"#0f172a\",\r\n color: \"#e5e7eb\",\r\n});\r\n\r\nconst pillScopeStyle = {\r\n fontSize: \"10px\",\r\n padding: \"2px 6px\",\r\n borderRadius: \"999px\",\r\n background: \"#1f2937\",\r\n color: \"#e5e7eb\",\r\n};\r\n\r\n","import { renderToString, renderToStream } from \"./ssr\";\r\nimport type { VChild } from \"../core/vnode\";\r\n\r\nexport interface RenderToHtmlOptions {\r\n view: VChild | (() => VChild | Promise<VChild>);\r\n head?: string;\r\n styles?: string; // concatenated <link> or <style>\r\n scripts?: string; // concatenated <script>\r\n beforeApp?: string;\r\n afterApp?: string;\r\n appId?: string;\r\n onAsyncTask?: (id: string, fn: () => Promise<VChild>, props?: Record<string, unknown>) => void;\r\n}\r\n\r\nexport async function renderToHtml(opts: RenderToHtmlOptions) {\r\n const {\r\n view,\r\n head = \"\",\r\n styles = \"\",\r\n scripts = \"\",\r\n beforeApp = \"\",\r\n afterApp = \"\",\r\n appId = \"app\",\r\n } = opts;\r\n\r\n const vnode = typeof view === \"function\" ? await (view as any)() : view;\r\n const body = await renderToString(vnode);\r\n const html = `<!doctype html><html><head>${head}${styles}</head><body>${beforeApp}<div id=\"${appId}\">${body}</div>${afterApp}${scripts}</body></html>`;\r\n return { html };\r\n}\r\n\r\n/**\r\n * Render a full HTML document using streaming\r\n * Similar to renderToHtml but returns a ReadableStream for progressive rendering\r\n */\r\nexport function renderToHtmlStream(opts: RenderToHtmlOptions): ReadableStream<Uint8Array> {\r\n const {\r\n view,\r\n head = \"\",\r\n styles = \"\",\r\n scripts = \"\",\r\n beforeApp = \"\",\r\n afterApp = \"\",\r\n appId = \"app\",\r\n onAsyncTask,\r\n } = opts;\r\n\r\n const encoder = new TextEncoder();\r\n\r\n // Resolve view if it's a function\r\n let viewResolved: Promise<VChild>;\r\n if (typeof view === \"function\") {\r\n const result = (view as () => VChild | Promise<VChild>)();\r\n viewResolved = result instanceof Promise ? result : Promise.resolve(result);\r\n } else {\r\n viewResolved = Promise.resolve(view);\r\n }\r\n\r\n // Concatenate streams sequentially\r\n return new ReadableStream({\r\n async start(controller) {\r\n try {\r\n // Part 1: DOCTYPE, HTML opening, head, body opening, app container opening\r\n const headerStart = `<!doctype html><html><head>${head}${styles}</head><body>${beforeApp}<div id=\"${appId}\">`;\r\n controller.enqueue(encoder.encode(headerStart));\r\n\r\n // Part 2: The actual content (from renderToStream)\r\n const vnode = await viewResolved;\r\n const contentStream = renderToStream(vnode, { onAsyncTask });\r\n const contentReader = contentStream.getReader();\r\n while (true) {\r\n const { done, value } = await contentReader.read();\r\n if (done) break;\r\n if (value) controller.enqueue(value);\r\n }\r\n contentReader.releaseLock();\r\n\r\n // Part 3: Closing tags\r\n const footer = `</div>${afterApp}${scripts}</body></html>`;\r\n controller.enqueue(encoder.encode(footer));\r\n } catch (err) {\r\n controller.error(err);\r\n return;\r\n }\r\n controller.close();\r\n },\r\n });\r\n}\r\n\r\n","import { renderToHtml } from \"../render/html\";\r\nimport type { Routes } from \"./index\";\r\nimport { matchRoute } from \"./index\";\r\n\r\ntype MaybeAsync<T> = T | Promise<T>;\r\n\r\nexport interface ExpressAdapterOptions {\r\n routes: Routes;\r\n styles?: string; // already-built <link> tags or CSS string\r\n scripts?: string; // already-built <script> tags\r\n head?: string; // custom head markup (e.g., from createHead)\r\n appId?: string;\r\n onNotFound?: (req: any, res: any, next?: any) => MaybeAsync<void>;\r\n}\r\n\r\nfunction normalizePath(path: string) {\r\n const url = new URL(path, \"http://localhost\");\r\n return { pathname: url.pathname || \"/\", search: url.search, hash: url.hash };\r\n}\r\n\r\n/**\r\n * Creates an Express-compatible handler to SSR a loly router.\r\n * No direct dependency on express types to keep the lib light.\r\n */\r\nexport function createExpressHandler(options: ExpressAdapterOptions) {\r\n const {\r\n routes,\r\n styles = \"\",\r\n scripts = \"\",\r\n head = \"\",\r\n appId = \"app\",\r\n onNotFound,\r\n } = options;\r\n\r\n return async function lolyExpressHandler(req: any, res: any, next?: any) {\r\n try {\r\n const path = req.path || req.url || \"/\";\r\n const loc = normalizePath(path);\r\n const match = matchRoute(loc.pathname, routes);\r\n if (!match) {\r\n if (onNotFound) {\r\n await onNotFound(req, res, next);\r\n return;\r\n }\r\n if (typeof next === \"function\") return next();\r\n res.status?.(404);\r\n res.end?.(\"Not found\");\r\n return;\r\n }\r\n\r\n const { html } = await renderToHtml({\r\n view: match.route.factory({ params: match.params, location: loc }),\r\n head,\r\n styles,\r\n scripts,\r\n appId,\r\n });\r\n\r\n res.setHeader?.(\"Content-Type\", \"text/html; charset=utf-8\");\r\n res.status?.(200);\r\n if (res.send) res.send(html);\r\n else res.end?.(html);\r\n } catch (err) {\r\n if (typeof next === \"function\") {\r\n return next(err);\r\n }\r\n res.status?.(500);\r\n res.end?.(\"Internal Server Error\");\r\n // eslint-disable-next-line no-console\r\n console.error(\"[loly] express handler error\", err);\r\n }\r\n };\r\n}\r\n","import { state, type Signal } from \"../core/signal\";\r\nimport { createVNode } from \"../core/vnode\";\r\nimport type { VChild } from \"../core/vnode\";\r\nimport { renderApplication } from \"../render/init\";\r\nimport { onUnmount } from \"../runtime/instance\";\r\n\r\ntype RouteFactory = (ctx: { params: Record<string, string>; location: LocationState }) => VChild;\r\n\r\nexport interface RouteEntry {\r\n path: string;\r\n pattern: RegExp;\r\n keys: string[];\r\n factory: RouteFactory;\r\n}\r\n\r\nexport interface Routes {\r\n list: RouteEntry[];\r\n}\r\n\r\nexport interface LocationState {\r\n pathname: string;\r\n search: string;\r\n hash: string;\r\n}\r\n\r\nexport interface NavigateOptions {\r\n replace?: boolean;\r\n scroll?: \"top\" | \"preserve\";\r\n}\r\n\r\nconst [locationSignal, setLocation] = state<LocationState>(getInitialLocation());\r\nconst [paramsSignal, setParams] = state<Record<string, string>>({});\r\nlet popstateRegistered = false;\r\n\r\nfunction getInitialLocation(): LocationState {\r\n if (typeof window === \"undefined\") {\r\n return { pathname: \"/\", search: \"\", hash: \"\" };\r\n }\r\n const { pathname, search, hash } = window.location;\r\n return { pathname, search, hash };\r\n}\r\n\r\nfunction normalizePath(path: string): LocationState {\r\n const url = new URL(path, \"http://localhost\");\r\n return { pathname: url.pathname || \"/\", search: url.search, hash: url.hash };\r\n}\r\n\r\nfunction compilePath(path: string): { pattern: RegExp; keys: string[] } {\r\n if (path === \"*\") return { pattern: /^.*$/, keys: [] };\r\n const keys: string[] = [];\r\n const parts = path\r\n .split(\"/\")\r\n .filter(Boolean)\r\n .map((segment) => {\r\n if (segment === \"*\") return \"(.*)\";\r\n if (segment.startsWith(\":\")) {\r\n const key = segment.slice(1);\r\n keys.push(key);\r\n return \"([^/]+)\";\r\n }\r\n return segment.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\r\n });\r\n const pattern = new RegExp(\"^/\" + parts.join(\"/\") + \"/?$\");\r\n return { pattern, keys };\r\n}\r\n\r\nexport function defineRoutes(defs: Record<string, RouteFactory>): Routes {\r\n const list = Object.entries(defs).map(([path, factory]) => {\r\n const { pattern, keys } = compilePath(path);\r\n return { path, pattern, keys, factory };\r\n });\r\n return { list };\r\n}\r\n\r\nexport function matchRoute(pathname: string, routes: Routes) {\r\n for (const route of routes.list) {\r\n const match = route.pattern.exec(pathname);\r\n if (!match) continue;\r\n const params: Record<string, string> = {};\r\n route.keys.forEach((key, idx) => {\r\n params[key] = decodeURIComponent(match[idx + 1] ?? \"\");\r\n });\r\n return { route, params };\r\n }\r\n return null;\r\n}\r\n\r\nfunction scrollToPosition(loc: LocationState, scroll?: \"top\" | \"preserve\") {\r\n if (typeof window === \"undefined\") return;\r\n if (scroll === \"preserve\") return;\r\n if (loc.hash) {\r\n const el = document.getElementById(loc.hash.slice(1));\r\n if (el) {\r\n el.scrollIntoView();\r\n return;\r\n }\r\n }\r\n window.scrollTo({ top: 0 });\r\n}\r\n\r\nexport function navigate(to: string, options: NavigateOptions = {}) {\r\n if (typeof window === \"undefined\") return;\r\n const next = normalizePath(to);\r\n if (options.replace) {\r\n window.history.replaceState({}, \"\", to);\r\n } else {\r\n window.history.pushState({}, \"\", to);\r\n }\r\n setLocation(next);\r\n scrollToPosition(next, options.scroll);\r\n}\r\n\r\nexport function useLocation(): Signal<LocationState> {\r\n return locationSignal;\r\n}\r\n\r\nexport function useParams(): Signal<Record<string, string>> {\r\n return paramsSignal;\r\n}\r\n\r\nexport function Router({ routes, url }: { routes: Routes; url?: string }) {\r\n // Set initial location for SSR if provided\r\n if (url && typeof window === \"undefined\") {\r\n setLocation(normalizePath(url));\r\n }\r\n\r\n if (typeof window !== \"undefined\" && !popstateRegistered) {\r\n popstateRegistered = true;\r\n window.addEventListener(\"popstate\", () => {\r\n const loc = getInitialLocation();\r\n setLocation(loc);\r\n scrollToPosition(loc);\r\n });\r\n }\r\n\r\n const [view, setView] = state<VChild | null>(null);\r\n\r\n const renderCurrent = async () => {\r\n const loc = locationSignal.get();\r\n const match = matchRoute(loc.pathname, routes);\r\n if (!match) {\r\n setParams({});\r\n return null;\r\n }\r\n setParams(match.params);\r\n const result = match.route.factory({ params: match.params, location: loc });\r\n // Handle async factories\r\n if (result instanceof Promise) {\r\n const resolved = await result;\r\n return resolved;\r\n }\r\n return result;\r\n };\r\n\r\n // Initial render\r\n renderCurrent().then((v) => {\r\n if (v !== null && v !== undefined) {\r\n setView(v);\r\n }\r\n }).catch((err) => {\r\n console.error(\"[loly-router] Error rendering route:\", err);\r\n setView(null);\r\n });\r\n\r\n // subscribe to location changes\r\n const unsubscribe = locationSignal.subscribe(() => {\r\n renderCurrent().then((v) => {\r\n if (v !== null && v !== undefined) {\r\n setView(v);\r\n }\r\n }).catch((err) => {\r\n console.error(\"[loly-router] Error rendering route:\", err);\r\n setView(null);\r\n });\r\n });\r\n onUnmount(() => unsubscribe());\r\n\r\n return view;\r\n}\r\n\r\nexport function Link({\r\n to,\r\n replace,\r\n children,\r\n className,\r\n}: {\r\n to: string;\r\n replace?: boolean;\r\n children: VChild;\r\n className?: string;\r\n}) {\r\n return createVNode(\"a\", {\r\n href: to,\r\n onClick: (e: MouseEvent) => {\r\n if (\r\n e.defaultPrevented ||\r\n e.button !== 0 ||\r\n e.metaKey ||\r\n e.altKey ||\r\n e.ctrlKey ||\r\n e.shiftKey\r\n ) {\r\n return;\r\n }\r\n e.preventDefault();\r\n navigate(to, { replace });\r\n },\r\n className,\r\n }, [children]);\r\n}\r\n\r\nexport function renderRoute(path: string, routes: Routes) {\r\n const loc = normalizePath(path);\r\n const match = matchRoute(loc.pathname, routes);\r\n if (!match) return { html: \"\" };\r\n setParams(match.params);\r\n return renderApplication(() => match.route.factory({ params: match.params, location: loc }));\r\n}\r\n\r\nexport { createExpressHandler } from \"./express\";\r\n\r\n","export interface HeadEntry {\r\n tag: \"title\" | \"meta\" | \"link\";\r\n attrs: Record<string, string>;\r\n content?: string;\r\n}\r\n\r\nexport interface HeadCollector {\r\n setTitle(title: string): void;\r\n addMeta(attrs: Record<string, string>): void;\r\n addLink(attrs: Record<string, string>): void;\r\n toString(): string;\r\n entries: HeadEntry[];\r\n}\r\n\r\nexport function createHead(): HeadCollector {\r\n const entries: HeadEntry[] = [];\r\n\r\n const setTitle = (title: string) => {\r\n // Replace existing title\r\n const idx = entries.findIndex((e) => e.tag === \"title\");\r\n if (idx >= 0) {\r\n entries[idx] = { tag: \"title\", attrs: {}, content: title };\r\n } else {\r\n entries.push({ tag: \"title\", attrs: {}, content: title });\r\n }\r\n };\r\n\r\n const addMeta = (attrs: Record<string, string>) => {\r\n // dedupe by name/property if present\r\n const key = attrs.name ?? attrs.property;\r\n if (key) {\r\n const idx = entries.findIndex((e) => e.tag === \"meta\" && (e.attrs.name === key || e.attrs.property === key));\r\n if (idx >= 0) {\r\n entries[idx] = { tag: \"meta\", attrs };\r\n return;\r\n }\r\n }\r\n entries.push({ tag: \"meta\", attrs });\r\n };\r\n\r\n const addLink = (attrs: Record<string, string>) => {\r\n // dedupe by rel+href if present\r\n const rel = attrs.rel;\r\n const href = attrs.href;\r\n if (rel && href) {\r\n const idx = entries.findIndex((e) => e.tag === \"link\" && e.attrs.rel === rel && e.attrs.href === href);\r\n if (idx >= 0) {\r\n entries[idx] = { tag: \"link\", attrs };\r\n return;\r\n }\r\n }\r\n entries.push({ tag: \"link\", attrs });\r\n };\r\n\r\n const toString = () =>\r\n entries\r\n .map((e) => {\r\n if (e.tag === \"title\") return `<title>${escapeHtml(e.content ?? \"\")}</title>`;\r\n const attrs = Object.entries(e.attrs)\r\n .map(([k, v]) => `${k}=\"${escapeHtml(v)}\"`)\r\n .join(\" \");\r\n return `<${e.tag}${attrs ? \" \" + attrs : \"\"}>`;\r\n })\r\n .join(\"\");\r\n\r\n return { setTitle, addMeta, addLink, toString, entries };\r\n}\r\n\r\nfunction escapeHtml(value: string) {\r\n return value.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\").replace(/\"/g, \""\");\r\n}\r\n\r\n","export interface AssetsTagsInput {\r\n css?: string[];\r\n js?: string[];\r\n}\r\n\r\nexport function buildAssetsTags(input: AssetsTagsInput): string {\r\n const tags: string[] = [];\r\n input.css?.forEach((href) => {\r\n tags.push(`<link rel=\"stylesheet\" href=\"${escapeAttr(href)}\">`);\r\n });\r\n input.js?.forEach((src) => {\r\n tags.push(`<script type=\"module\" src=\"${escapeAttr(src)}\"></script>`);\r\n });\r\n return tags.join(\"\");\r\n}\r\n\r\nfunction escapeAttr(v: string) {\r\n return v.replace(/\"/g, \""\");\r\n}\r\n\r\ntype ViteManifest = Record<\r\n string,\r\n {\r\n file: string;\r\n css?: string[];\r\n isEntry?: boolean;\r\n }\r\n>;\r\n\r\ntype WebpackManifest = Record<string, string>;\r\n\r\nexport function buildAssetsTagsFromManifest(\r\n manifest: ViteManifest | WebpackManifest,\r\n entry: string\r\n): { styles: string; scripts: string } {\r\n // Vite manifest: map entry -> { file, css }\r\n if (isViteManifest(manifest)) {\r\n const found = manifest[entry];\r\n\r\n if (!found) return { styles: \"\", scripts: \"\" };\r\n const css = found.css ?? [];\r\n const js = found.file ? [found.file] : [];\r\n const styles = buildAssetsTags({ css });\r\n const scripts = buildAssetsTags({ js });\r\n return { styles, scripts };\r\n }\r\n\r\n // Webpack manifest: map entry -> file path\r\n const file = manifest[entry];\r\n if (!file) return { styles: \"\", scripts: \"\" };\r\n // Webpack manifest usually doesn't list CSS separately; assume JS only\r\n const scripts = buildAssetsTags({ js: [file] });\r\n return { styles: \"\", scripts };\r\n}\r\n\r\nfunction isViteManifest(manifest: unknown): manifest is ViteManifest {\r\n if (!manifest || typeof manifest !== \"object\") return false;\r\n // Heuristic: vite manifest entries are objects with \"file\" prop\r\n const first = Object.values(manifest as Record<string, any>)[0];\r\n return !!first && typeof first === \"object\" && \"file\" in first;\r\n}\r\n\r\n","export function serializeData(data: unknown): string {\r\n try {\r\n return JSON.stringify(data);\r\n } catch {\r\n return \"{}\";\r\n }\r\n}\r\n\r\nexport function injectData(key: string, data: unknown): string {\r\n const safeKey = JSON.stringify(key);\r\n const safeData = serializeData(data);\r\n return `<script>window.__LOLY_DATA__ = window.__LOLY_DATA__ || {}; window.__LOLY_DATA__[${safeKey}] = ${safeData};</script>`;\r\n}\r\n\r\nexport function readData<T = unknown>(key: string): T | undefined {\r\n if (typeof window === \"undefined\") return undefined;\r\n const store = (window as any).__LOLY_DATA__;\r\n if (!store) return undefined;\r\n return store[key] as T;\r\n}\r\n\r\n","import { getIsland, listRegisteredIslands as listIslands } from \"./registry\";\r\n\r\n// Regex simple para detectar defineIsland(\"Name\", ...)\r\nconst ISLAND_REGEX = /defineIsland\\s*\\(\\s*[\"'`](.+?)[\"'`]/g;\r\n\r\nexport function extractIslandsFromCode(code: string): string[] {\r\n const names = new Set<string>();\r\n let match: RegExpExecArray | null;\r\n while ((match = ISLAND_REGEX.exec(code)) !== null) {\r\n if (match[1]) names.add(match[1]);\r\n }\r\n return Array.from(names);\r\n}\r\n\r\n// Re-export from registry\r\nexport { listIslands as listRegisteredIslands };\r\n\r\n","/**\r\n * Activate async components by detecting placeholders, fetching resolved content,\r\n * and replacing placeholders with resolved HTML\r\n */\r\nexport function activateAsyncComponents(root: ParentNode = document): void {\r\n const placeholders = root.querySelectorAll<HTMLElement>(\"[data-loly-async]\");\r\n \r\n placeholders.forEach((placeholder) => {\r\n const asyncId = placeholder.getAttribute(\"data-loly-async\");\r\n if (!asyncId) return;\r\n\r\n // Skip if already activated\r\n if (placeholder.hasAttribute(\"data-loly-async-activated\")) return;\r\n placeholder.setAttribute(\"data-loly-async-activated\", \"true\");\r\n\r\n // Fetch async content from endpoint\r\n fetch(`/__loly/async/${asyncId}`)\r\n .then((res) => {\r\n // If task not found (404), it was likely resolved during SPA navigation\r\n // In SPA navigation, RSCStrategy resolves async components on the server\r\n // So these placeholders from initial SSR are stale and should be removed\r\n if (res.status === 404) {\r\n placeholder.remove();\r\n return null;\r\n }\r\n \r\n if (!res.ok) {\r\n throw new Error(`Failed to fetch async component: ${res.statusText}`);\r\n }\r\n return res.json();\r\n })\r\n .then((data: { html: string | null; error: string | null } | null) => {\r\n // If data is null, it was a 404 and placeholder was removed\r\n if (!data) return;\r\n \r\n if (data.error) {\r\n throw new Error(data.error);\r\n }\r\n if (!data.html) {\r\n throw new Error(\"No HTML content received\");\r\n }\r\n\r\n // Parse HTML string and insert into placeholder\r\n // Note: This replaces the placeholder with the resolved HTML\r\n // In Loly's model, we replace HTML deterministically (no reconciliation)\r\n placeholder.innerHTML = data.html;\r\n \r\n // Remove the placeholder wrapper attributes\r\n placeholder.removeAttribute(\"data-loly-async\");\r\n placeholder.removeAttribute(\"data-loly-async-activated\");\r\n })\r\n .catch((error) => {\r\n // Only log and show error for non-404 errors (404s are handled above)\r\n if (error instanceof Error && !error.message.includes(\"404\") && !error.message.includes(\"Not Found\")) {\r\n console.error(`[loly] Error activating async component ${asyncId}:`, error);\r\n // Show error state for other errors\r\n placeholder.innerHTML = `<span style=\"color: red;\">Error loading content</span>`;\r\n placeholder.removeAttribute(\"data-loly-async\");\r\n placeholder.removeAttribute(\"data-loly-async-activated\");\r\n }\r\n });\r\n });\r\n}\r\n\r\n"],"names":["storeContexts","storeToVNode","storeIdCounter","generateStoreId","storeDataRegistry","globalStoreRegistry","storeContextStack","currentContext","pushStoreContextLayer","parent","layer","popStoreContextLayer","registerStoreData","storeId","initialData","registerScopedStore","vnode","store","signal","getRuntimeConfig","newLayer","contexts","findScopedStore","globalSignal","storeData","scopedSignal","state","getScopedStoreSignal","createStore","initial","setGlobal","id","scoped","value","prev","devLog","fn","islands","defineIsland","name","component","getIsland","listRegisteredIslands","isForBlock","v","For","props","getKey","item","idx","renderItem","isSignal","isComputed","forBlock","source","currentInstance","setCurrentInstance","instance","getCurrentInstance","createInstance","attachInstanceToVNode","factory","onMount","_a","onUnmount","addCleanup","nodeCleanups","registerCleanup","nodes","node","existing","runCleanup","fns","err","runCleanupDeep","child","unmountNodes","removeFromDom","mount","pendingMounts","mountNode","created","normalizeChildren","marker","getValue","renderValue","frag","newNodes","update","unsubscribe","computed","text","mountForBlock","isVNode","isErrorBoundary","out","error","_b","fb","targetNodes","n","ran","Fragment","el","innerHTML","applyProps","styleObjectToString","style","prop","val","m","key","attr","eventName","getVal","applyStyle","styleString","styleObj","reactiveStyle","result","applyDisabled","enabled","asForm","block","start","end","entries","updateList","items","keyToEntry","e","nextEntries","ref","i","firstNode","sourceSignal","current","newList","_","it","entry","initialItems","parseDirective","scheduleMount","directive","mountFn","observer","query","mq","run","onChange","event","bootIslands","root","Island","islandId","createVNode","escapeText","isPrimitive","islandCounter","renderAttributes","parts","rawValue","attrName","renderChildren","children","renderNode","renderComponent","output","resolvedOutput","isPromiseLike","serializeIslandPropsToObject","replacer","_key","plain","generateIslandId","resolveIslandName","renderElement","islandName","propsObj","inner","dataClient","idJson","propsJson","storeIdJson","dataJson","storeScript","tag","attrs","resolvedResult","renderToString","renderToStream","options","onAsyncTask","encoder","asyncCounter","writeNode","controller","fallback","asyncPath","islandStart","asyncId","resolveTarget","target","initLolyApplication","renderApplication","render","view","ErrorBoundary","getChild","renderChild","Store","initialValue","parentScoped","scopedValue","useStore","MAX_EVENTS","DevtoolsOverlay","open","setOpen","events","setEvents","paused","setPaused","isPaused","unsubscribePaused","isUpdating","onDevtoolsEvent","evt","payload","firstItem","toggleOpen","togglePause","clear","jsx","jsxs","btnStyle","pillStyle","pillScopeStyle","active","level","renderToHtml","opts","head","styles","scripts","beforeApp","afterApp","appId","body","renderToHtmlStream","viewResolved","headerStart","contentReader","done","footer","normalizePath","path","url","createExpressHandler","routes","onNotFound","req","res","next","loc","match","matchRoute","html","_c","_d","_e","_f","_g","locationSignal","setLocation","getInitialLocation","paramsSignal","setParams","popstateRegistered","pathname","search","hash","compilePath","keys","segment","defineRoutes","defs","pattern","route","params","scrollToPosition","scroll","navigate","to","useLocation","useParams","Router","setView","renderCurrent","Link","replace","className","renderRoute","createHead","title","rel","href","escapeHtml","k","buildAssetsTags","input","tags","escapeAttr","src","buildAssetsTagsFromManifest","manifest","isViteManifest","found","css","js","file","first","serializeData","data","injectData","safeKey","safeData","readData","ISLAND_REGEX","extractIslandsFromCode","code","names","activateAsyncComponents","placeholder"],"mappings":"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"}
|