@hozu/runtime-client 0.9.0 → 0.11.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.
@@ -0,0 +1 @@
1
+ var I=function(f,t){return typeof f=="string"&&/^\.\.?\//.test(f)?f.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(d,a,o,i,e){return a?t?".jsx":".js":o&&(!i||!e)?d:o+i+"."+e.toLowerCase()+"js"}):f},O=Symbol.for("hozu.fetchFail");function j(f,t,d=f,a=""){let o=[],i=a||"(root)",e=f;typeof e.$ref=="string"&&(e=e.$ref.split("/").slice(1).reduce((r,p)=>r?.[p],d)??{});let h=e.anyOf??e.oneOf;if(Array.isArray(h)){for(let r of h){let p=j(r,t,d,a);if(!p.issues.length)return p}return{issues:[`${i}: matches none of the allowed shapes`],value:t}}"const"in e&&t!==e.const&&o.push(`${i}: expected ${JSON.stringify(e.const)}`),Array.isArray(e.enum)&&!e.enum.includes(t)&&o.push(`${i}: expected one of ${e.enum.join(", ")}`);let b=e.type===void 0?[]:Array.isArray(e.type)?e.type:[e.type],k=r=>r==="null"?t===null:r==="array"?Array.isArray(t):r==="integer"?Number.isInteger(t):r==="object"?typeof t=="object"&&t!==null&&!Array.isArray(t):typeof t===r;if(b.length&&!b.some(k))return{issues:[`${i}: expected ${b.join(" or ")}`],value:t};if(typeof t=="string"&&(e.minLength!==void 0&&t.length<e.minLength&&o.push(`${i}: too short`),e.maxLength!==void 0&&t.length>e.maxLength&&o.push(`${i}: too long`),e.pattern&&!new RegExp(e.pattern).test(t)&&o.push(`${i}: does not match ${e.pattern}`)),typeof t=="number"&&(e.minimum!==void 0&&t<e.minimum&&o.push(`${i}: below ${e.minimum}`),e.maximum!==void 0&&t>e.maximum&&o.push(`${i}: above ${e.maximum}`)),Array.isArray(t)){if(!e.items)return{issues:o,value:t};let r=t.map((p,c)=>{let g=j(e.items,p,d,`${a}${a?".":""}${c}`);return o.push(...g.issues),g.value});return{issues:o,value:r}}if(typeof t=="object"&&t!==null&&e.properties){let r=t,p={};for(let c of e.required??[])c in r||o.push(`${a}${a?".":""}${c}: required`);for(let[c,g]of Object.entries(e.properties))if(c in r){let n=j(g,r[c],d,`${a}${a?".":""}${c}`);o.push(...n.issues),p[c]=n.value}if(e.additionalProperties&&typeof e.additionalProperties=="object")for(let c of Object.keys(r))c in p||(p[c]=r[c]);return{issues:o,value:p}}return{issues:o,value:t}}var x=f=>({ok:!1,error:"Unexpected",data:{message:f}});function S(f,t,d,a,o=i=>import(I(i))){let i=f.effects??{},e=new Map,h=new Set;globalThis.addEventListener?.("pagehide",()=>{for(let n of h)n.abort()});let b=n=>{let u=e.get(n);if(!u){let s=f.fetches?.[n];u=s?o(s):Promise.reject(new Error(`No fetch bundle for ${n}`)),e.set(n,u)}return u},k=(n,u)=>(i[n]?.tags??[]).map(s=>s.param?`${s.tag}(${a.stringify(a.compile(s.param,t)({input:u}))})`:s.tag);async function r(n,u){let s=i[n];if(!s)return x(`${n} does not run in the browser`);let l=j(s.input,u);if(l.issues.length)return s.kind==="mutation"?{ok:!1,error:"Invalid",data:{message:l.issues.join("; "),fields:{}}}:x(`Invalid input: ${l.issues.join("; ")}`);let $=n.indexOf("."),m=new AbortController;h.add(m);try{let y=(await b(n.slice(0,$)))[n.slice($+1)];if(typeof y!="function")return x(`fetch.ts exports no ${n.slice($+1)}`);let w=await y(l.value,{fail:(E,L)=>{throw{[O]:{error:E,data:L}}},signal:m.signal,env:f.env??{}}),A=j(s.output,w);return A.issues.length?x(`${n} returned a value that does not match its output: ${A.issues.join("; ")}`):{ok:!0,value:A.value}}catch(y){let w=y?.[O];return w?{ok:!1,error:w.error,data:w.data??null}:x(y instanceof Error?y.message:String(y))}finally{h.delete(m)}}let p=n=>i[n]?.kind==="query";async function c(n){let u=!1;for(let s of[...d.data.keys()]){let l=Object.keys(i).find(m=>p(m)&&s.startsWith(m)&&'{["tfn0123456789-'.includes(s[m.length]??""));if(!l)continue;let $=JSON.parse(s.slice(l.length));k(l,$).some(m=>n.includes(m))&&(d.data.set(s,await r(l,$)),d.versions.set(s,(d.versions.get(s)??0)+1),u=!0)}return u}async function g(n,u){let s=await r(n,u);return{result:s,changed:s.ok?await c(k(n,u)):!1}}return{run:r,mutate:g,reread:c,runs:n=>n in i}}export{j as checked,S as createRunner};
@@ -1 +1 @@
1
- function D(t,e){let n=t;for(let o of e){if(typeof n=="string"&&o==="length")return n.length;if(n===null||typeof n!="object")return null;n=n[o]}return n===void 0?null:n}function W(t,e,n,o=0){if(o===e.length)return n;let s=e[o];if(Array.isArray(t)){let f=t.slice();return f[Number(s)]=W(t[Number(s)]??null,e,n,o+1),f}let a=t!==null&&typeof t=="object"?t:{};return{...a,[s]:W(a[s]??null,e,n,o+1)}}function H(t,e){if(t===e)return!0;if(t===null||e===null||typeof t!="object"||typeof e!="object")return!1;if(Array.isArray(t)){if(!Array.isArray(e)||t.length!==e.length)return!1;for(let o=0;o<t.length;o++)if(!H(t[o],e[o]))return!1;return!0}if(Array.isArray(e))return!1;let n=Object.keys(t);if(n.length!==Object.keys(e).length)return!1;for(let o of n)if(!Object.hasOwn(e,o)||!H(t[o],e[o]))return!1;return!0}var ft=(t,e,n)=>{let[o="",s=""]=t.split("?"),a=o.replace(/\/:([A-Za-z]\w*)[?*+]?/g,(y,O)=>[D(e,[O])??[]].flat().map(j=>`/${encodeURIComponent(String(j))}`).join(""))||"/",f=s.split("&"),d="";if(n&&typeof n=="object")for(let y of Object.keys(n).sort()){let O=n[y],h=`${encodeURIComponent(y)}=${encodeURIComponent(String(O))}`;O!==null&&typeof O!="object"&&!f.includes(h)&&(d+=`${d&&"&"}${h}`)}return d?`${a}?${d}`:a};var et=class extends Error{name="CompileError"};function V(t,e){if("literal"in t||"formRef"in t){let a="literal"in t?t.literal:t.formRef;return()=>a}if("object"in t){let a=Object.entries(t.object).map(([f,d])=>[f,V(d,e)]);return f=>{let d={};for(let[y,O]of a)d[y]=O(f);return d}}if("fn"in t){let a=e[t.fn];if(!a)throw new et(`No implementation bound for fn ${t.fn}`);let f=V(t.arg,e);return d=>a(f(d))}if("link"in t){let a=t.link,f=V(t.params,e),d=V(t.search,e);return y=>ft(y.routes?.[a]??"",f(y),d(y))}if("test"in t){let a=st(t.test,e);return f=>a(f)}if("endpoint"in t){let a=t.endpoint,f=V(t.input??{literal:null},e);return d=>ft(d.routes?.[a]??"",null,f(d))}let n=t,{path:o}=n;if(n.ref==="binding"){let a=n.depth;return o.length?f=>D(f.bindings?.[a],o):f=>f.bindings?.[a]??null}if(n.ref==="dom"){let[a,...f]=o;return d=>d.dom&&a?D(d.dom(a),f)??(a==="formAll"?[]:null):null}let s=n.ref;return o.length===0?a=>a[s]??null:a=>D(a[s],o)}var Z=t=>typeof t=="number"||typeof t=="string"?t:Number.NaN;function st(t,e){switch(t.op){case"and":{let n=t.args.map(o=>st(o,e));return o=>n.every(s=>s(o))}case"or":{let n=t.args.map(o=>st(o,e));return o=>n.some(s=>s(o))}case"not":{let n=st(t.arg,e);return o=>!n(o)}case"fn":{let n=V({fn:t.fn,arg:t.arg},e);return o=>n(o)===!0}default:{let n=V(t.left,e),o=V(t.right,e);switch(t.op){case"eq":return s=>H(n(s),o(s));case"neq":return s=>!H(n(s),o(s));case"lt":return s=>Z(n(s))<Z(o(s));case"lte":return s=>Z(n(s))<=Z(o(s));case"gt":return s=>Z(n(s))>Z(o(s));default:return s=>Z(n(s))>=Z(o(s))}}}}function Ut(t,e){let{path:n}=t,o=V(t.value,e);switch(t.op){case"set":return(s,a)=>W(s,n,o({...a,context:s}));case"append":return(s,a)=>{let f=D(s,n);return W(s,n,[...Array.isArray(f)?f:[],o({...a,context:s})])};case"inc":return(s,a)=>W(s,n,Number(D(s,n)??0)+Number(o({...a,context:s})));case"removeWhere":{let s=t.key;return(a,f)=>{let d=D(a,n),y=o({...f,context:a}),O=Array.isArray(d)?d:[];return W(a,n,O.filter(h=>!H(s===null?h:h!==null&&typeof h=="object"&&!Array.isArray(h)?h[s]:null,y)))}}}}var qt=(t,e)=>n=>t({...n,routes:e});function gt(t,e={},n={}){let o=t.machine;if(!o)throw new et(`Feature ${t.id} has no machine`);let s=Object.keys(o.states),a=new Map(s.map((h,j)=>[h,j])),f=h=>{let j=a.get(h);if(j===void 0)throw new et(`Unknown state "${h}" in ${t.id}`);return j},d=[],y=(h,j)=>(d.push(j),{id:j,guard:h.guard?st(h.guard,e):null,target:f(h.target),assign:h.assign.map(T=>Ut(T,e)),navigate:h.navigate?qt(V(h.navigate,e),n):null}),O=s.map(h=>{let j=o.states[h],T=new Map;for(let[A,$]of Object.entries(j.on))T.set(A,$.map((I,R)=>y(I,`${h}/on/${A}/${R}`)));let B=new Map;j.after.forEach((A,$)=>{let I=y(A.transition,`${h}/after/${$}`);B.set(A.ms,[...B.get(A.ms)??[],I])});let M=j.invoke;return{name:h,final:j.final,on:T,invoke:M&&{effect:M.effect,input:V(M.input,e),done:M.done.map((A,$)=>y(A,`${h}/invoke/done/${$}`)),failed:new Map(Object.entries(M.failed).map(([A,$])=>[A,$.map((I,R)=>y(I,`${h}/invoke/failed/${A}/${R}`))]))},after:B,timers:[...B.keys()].sort((A,$)=>A-$)}});return{feature:t.id,initial:f(o.initial),initialContext:o.initialContext,states:O,index:a,transitions:d}}function vt(t,e,n,o,s){let a=t.states[e];a.invoke&&s.push({type:"invoke",entry:o,effect:a.invoke.effect,input:a.invoke.input({context:n})});for(let f of a.timers)s.push({type:"timer",entry:o,ms:f})}function jt(t,e,n,o=1){let s=t.index.get(e);if(s===void 0)throw new Error(`Unknown state "${e}" in ${t.feature}`);let a=[];return vt(t,s,n,o,a),{snapshot:{state:e,context:n,entry:o},effects:a,taken:null}}var yt=t=>jt(t,t.states[t.initial].name,t.initialContext),nt=t=>({snapshot:t,effects:[],taken:null});function ut(t,e,n,o){if(!n)return nt(e);for(let s of n){if(s.guard&&!s.guard(o))continue;let a=e.context;for(let y of s.assign)a=y(a,o);let f=e.entry+1,d=s.navigate===null?[]:[{type:"navigate",url:String(s.navigate(o))}];return vt(t,s.target,a,f,d),{snapshot:{state:t.states[s.target].name,context:a,entry:f},effects:d,taken:s.id}}return nt(e)}function ht(t,e,n){let o=t.states[t.index.get(e.state)??-1];if(!o||o.final)return nt(e);let s=e.context;switch(n.type){case"event":return ut(t,e,o.on.get(n.event),{context:s,event:n.payload});case"done":return n.entry!==e.entry||!o.invoke?nt(e):ut(t,e,o.invoke.done,{context:s,result:n.result});case"failed":{if(n.entry!==e.entry||!o.invoke)return nt(e);let a=o.invoke.failed,f=a.has(n.error),d=f?n.data:{message:Dt(n.data,n.error)};return ut(t,e,a.get(f?n.error:"Unexpected"),{context:s,error:d})}case"timer":return n.entry!==e.entry?nt(e):ut(t,e,o.after.get(n.ms),{context:s})}}function Dt(t,e){return t!==null&&typeof t=="object"&&!Array.isArray(t)&&typeof t.message=="string"?t.message:e}function Nt(t,e){let n=Object.create(null),o=Object.create(null),s=(a,f)=>{let d=typeof f=="string"?f:f.name,y=o[a];y?y.push(d):(o[a]=[d],n[a]=d)};for(let[a,f]of t)s(a,f);return e&&s(...e),{first:n,all:o}}var pt="http://www.w3.org/2000/svg",Ft=new Set(["contenteditable","draggable","spellcheck"]),G=t=>t==null?"":typeof t=="object"?JSON.stringify(t):String(t);function $t(t,e){return e==null?null:typeof e=="boolean"?t.startsWith("aria-")||t.startsWith("data-")||Ft.has(t)?String(e):e?"":null:G(e)}var At=new Set(["value","checked","selected","muted"]),xt=new Set(["scroll","wheel","touchstart","touchmove","touchend","pointermove","mousemove"]),Ot=t=>typeof t=="number"&&!Number.isNaN(t)?t:null,it=new Map,zt=t=>t?[...t].map(e=>{let n=`u${it.size+1}`;return it.set(n,e),{name:e.name,size:e.size,type:e.type,token:n}}):[],bt=t=>e=>{let n=t.target;switch(e){case"value":return typeof n?.value=="string"?n.value:"";case"checked":return n?.checked===!0;case"valueAsNumber":return Ot(n?.valueAsNumber);case"files":return zt(n?.files??t.dataTransfer?.files);case"form":case"formAll":{let o=t.target,s=o.ownerDocument.defaultView,a=Nt(new(s?.FormData??FormData)(o,t.submitter));return e==="form"?a.first:a.all}case"open":return n?.open===!0;case"returnValue":return typeof n?.returnValue=="string"?n.returnValue:"";default:{let o=e in t?t[e]:n?.[e];return typeof o=="number"?Ot(o):typeof o=="string"||typeof o=="boolean"?o:null}}},Ct=(t,e)=>t?e.length?`${t} ${e.join(" ")}`:t:e.join(" ");var _t=JSON.stringify;function mt(t){if(t===null)return"null";switch(typeof t){case"string":return _t(t);case"boolean":return t?"true":"false";case"number":if(!Number.isFinite(t))throw new TypeError(`Non-finite number ${t} is not valid JSON`);return Object.is(t,-0)?"0":String(t);case"object":{if(Array.isArray(t))return`[${t.map(mt).join(",")}]`;let e=t,n=Object.keys(e).sort(),o="{";for(let s=0;s<n.length;s++){let a=n[s],f=e[a];if(f===void 0)throw new TypeError(`Undefined value at key "${a}"`);o+=`${s?",":""}${_t(a)}:${mt(f)}`}return`${o}}`}default:throw new TypeError(`Value of type ${typeof t} is not valid JSON`)}}var kt=t=>{switch(t.op){case"and":case"or":return t.args.some(kt);case"not":return kt(t.arg);case"fn":return Q(t.arg);default:return Q(t.left)||Q(t.right)}},Q=t=>"ref"in t?t.ref==="context"||t.ref==="binding":"object"in t?Object.values(t.object).some(Q):"fn"in t?Q(t.arg):"test"in t&&kt(t.test),Tt=(t,e)=>t+mt(e),Bt=t=>t instanceof Map?{data:t,versions:new Map}:t;var rt=(t,e)=>t!==null&&t.nodeType===8&&t.data===e;function K(t,e){let n=[t],o=t;for(;o!==e&&(o=o.nextSibling,!!o);)n.push(o);return n}function wt(t,e){let n=t.next?t.next.previousSibling:t.parent.lastChild;return e(),[n?n.nextSibling:t.parent.firstChild,t.next?t.next.previousSibling:t.parent.lastChild]}function Et(t,e){for(;t.nextSibling&&t.nextSibling!==e;)t.nextSibling.remove()}function Mt(t,e){let{machine:n,fns:o={},params:s=null,search:a=null,routes:f={}}=e,{data:d}=Bt(e.payload),y=[],O=new Set,h=n?e.snapshot?null:yt(n):null,j=e.snapshot??h?.snapshot??null,T=[],B=new Set,M=new Set,A=new WeakMap,$=(r,l,i)=>{let x=A.get(r);return x||(x=V(r,o),A.set(r,x)),x({context:j?.context??null,bindings:l,params:s,search:a,routes:f,...i?{dom:i}:{}})},I=(r,l,i,x)=>{let k=$(l,i);x(k),Q(l)&&r.push(()=>{let u=$(l,i);u!==k&&(k=u,x(u))})},R=(r,l)=>{if(r.claim&&rt(r.next,l)){let i=r.next;return r.next=i.nextSibling,i}return r.parent.insertBefore(t.createComment(l),r.next)},X=r=>{if(!r.claim||!rt(r.next,"["))return;let l=0;for(;r.next;){let i=r.next;if(r.next=i.nextSibling,rt(i,"["))l++;else if(rt(i,"]")&&--l===0)return}},U=(r,l,i,x,k)=>{switch(r.kind){case"text":{let u;i.claim&&i.next?.nodeType===3?(u=i.next,i.next=u.nextSibling):u=i.parent.insertBefore(t.createTextNode(""),i.next),i.claim&&rt(i.next,"")&&(i.next=i.next.nextSibling),I(x,r.value,l,g=>{let c=G(g);u.data!==c&&(u.data=c)});return}case"el":{let u=r.tag,g=u==="svg"?pt:k,c,p=i.claim&&i.next?.nodeType===1&&i.next.localName===u;p?(c=i.next,i.next=c.nextSibling):(c=g?t.createElementNS(g,u):t.createElement(u),r.class&&c.setAttribute("class",r.class),i.parent.insertBefore(c,i.next));for(let m in r.attrs){let w=r.attrs[m],q=At.has(m)&&m in c;p&&!Q(w)||I(x,w,l,F=>{if(q){let z=c,lt=m==="value"?G(F):F===!0;z[m]!==lt&&(z[m]=lt);return}let P=$t(m,F);P===null?c.removeAttribute(m):c.getAttribute(m)!==P&&c.setAttribute(m,P)})}at(c,r,l,x);for(let m in r.on){let w=r.on[m];c.addEventListener(m,q=>{m==="submit"&&q.preventDefault(),J({type:"event",event:w.event,payload:$(w.payload,l,bt(q))})},xt.has(m)?{passive:!0}:void 0)}if(u==="textarea")return;let b={parent:c,next:p?c.firstChild:null,claim:p},N=u==="foreignObject"?null:g;for(let m of r.children)U(m,l,b,x,N);return}case"when":{let u=()=>j?r.states.includes(j.state):!1;E(i,x,u,(g,c)=>{if(u())for(let p of r.children)U(p,l,g,c,k)},r.motion);return}case"query":{let u=l;E(i,x,()=>{let c=Tt(r.query,$(r.input,l)),p=d.get(c);return p&&u!==l&&u.splice(0,u.length,...l,p.ok?p.value:p.data),`${c}|${p?p.ok?"ready":r.failed[p.error]?p.error:"Unexpected":""}`},(c,p)=>{let b=$(r.input,l),N=Tt(r.query,b),m=d.get(N);if(u=l,!m){c.claim||ot(N,r.query,b),r.pending&&U(r.pending,l,c,p,k);return}let w=m.ok?r.ready:r.failed[m.error]??r.failed.Unexpected;u=[...l,m.ok?m.value:m.data],w&&U(w,u,c,p,k)});return}case"each":C(r,l,i,x,k);return;case"component":St(r,l,i,x);return;case"if":{let u=()=>$({test:r.test},l)===!0;E(i,x,u,(g,c)=>{let p=u()?r.ifTrue:r.ifFalse;for(let b of p)U(b,l,g,c,k)},r.motion);return}case"html":{let u=R(i,"["),g;if(i.claim){for(;i.next&&!rt(i.next,"]");)i.next=i.next.nextSibling;g=i.next??i.parent.appendChild(t.createComment("]")),i.next=g.nextSibling}else g=R(i,"]");let c=i.claim?G($(r.value,l)):null;I(x,r.value,l,p=>{let b=G(p);if(b===c)return;c=b,Et(u,g);let N=t.createElement("template");N.innerHTML=b,g.parentNode.insertBefore(N.content,g)});return}case"global":{let u=R(i,"g"),g=r.target==="window"?t.defaultView:t,c=[];for(let p in r.on){let b=r.on[p],N=w=>J({type:"event",event:b.event,payload:$(b.payload,l,bt(w))}),m=xt.has(p)?{passive:!0}:void 0;g.addEventListener(p,N,m),c.push(()=>g.removeEventListener(p,N))}M.add({el:u,stop:()=>c.forEach(p=>p())});return}default:X(i)}},at=(r,l,i,x)=>{let k=Object.entries(l.toggle);if(k.length){let u=()=>{let c=[];for(let[p,b]of k)$(b,i)===!0&&c.push(p);return Ct(l.class,c)},g=u();r.getAttribute("class")!==g&&r.setAttribute("class",g),k.some(([,c])=>Q(c))&&x.push(()=>{let c=u();c!==g&&(g=c,r.setAttribute("class",c))})}for(let u in l.vars)I(x,l.vars[u],i,g=>{let c=r.style;g===null||g===""?c.removeProperty(u):c.getPropertyValue(u)!==G(g)&&c.setProperty(u,G(g))})},St=(r,l,i,x)=>{let k=r.use.component,u=e.components?.[k],g=u?.tag??"div",c,p=i.claim&&i.next?.nodeType===1&&i.next.localName===g;if(p?(c=i.next,i.next=c.nextSibling):(c=t.createElement(g),r.class&&c.setAttribute("class",r.class),i.parent.insertBefore(c,i.next)),at(c,r,l,x),!p||r.children.length){let b={parent:c,next:p?c.firstChild:null,claim:p};for(let N of r.children)U(N,l,b,x,null)}u||console.error(`Hozu: component ${k} has no client code (bundleComponents)`),!(!u||!e.loadComponent||!e.mountComponent)&&e.mountComponent({el:c,ref:u,name:k,doc:t,props:()=>$(r.props,l),emit:(b,N)=>{let m=r.on[b];m&&J({type:"event",event:m.event,payload:$(m.payload,l,w=>w==="detail"?N:null)})},load:e.loadComponent,watch:b=>x.push(b),own:b=>M.add({el:c,stop:b}),same:H})},Y=new Set,ot=(r,l,i)=>{!e.onQuery||Y.has(r)||(Y.add(r),e.onQuery(l,i).then(x=>{Y.delete(r),d.set(r,x);for(let k of T)k();S()}))},S=()=>{for(let r=T.length-1;r>=0;r--)B.delete(T[r])&&T.splice(r,1);for(let r of M)r.el.isConnected||(r.stop(),M.delete(r))},E=(r,l,i,x,k=null)=>{let u=R(r,"["),g=i(),c=[];x(r,c);let p=R(r,"]");l.push(()=>{let b=i();if(b===g){for(let q of c)q();return}g=b,c=[];let N=e.motion;if(!k||!N||N.reduced(t)){Et(u,p),x({parent:p.parentNode,next:p,claim:!1},c);return}N.leave(u.nextSibling===p?[]:K(u.nextSibling,p.previousSibling),k);let[m,w]=wt({parent:p.parentNode,next:p,claim:!1},()=>x({parent:p.parentNode,next:p,claim:!1},c));m&&w&&m!==p&&N.enter(K(m,w),k)})},C=(r,l,i,x,k)=>{let u=R(i,"["),g=m=>{let w=r.key===null?m:D(m,[r.key]);return typeof w=="string"?`s${w}`:JSON.stringify(w)},c=()=>{let m=$(r.source,l);return Array.isArray(m)?m:[]},p=(m,w)=>{let q=[...l,m],F=[],[P,z]=wt(w,()=>U(r.item,q,w,F,k));return{key:g(m),value:m,scope:q,block:F,first:P,last:z}},b=c().map(m=>p(m,i)),N=R(i,"]");x.push(()=>{let m=e.motion,w=r.motion&&m&&!m.reduced(t)?r.motion:null,q=w?new Map(b.flatMap(v=>v.first.nodeType===1?[[v,v.first.getBoundingClientRect()]]:[])):null,F=new Map(b.map(v=>[v.key,v])),P=new Set,z=[];for(let v of c()){let L=g(v),tt=F.get(L);if(tt){F.delete(L),tt.value=v,tt.scope.splice(0,tt.scope.length,...l,v);for(let ct of tt.block)ct();z.push(tt)}else{let ct=p(v,{parent:t.createDocumentFragment(),next:null,claim:!1});P.add(ct),z.push(ct)}}for(let v of F.values())if(w)m.leave(K(v.first,v.last),w);else for(let L of K(v.first,v.last))L.remove();let lt=N.parentNode,dt=u.nextSibling??N;for(let v of z)if(v.first===dt)dt=v.last.nextSibling??N;else for(let L of K(v.first,v.last))lt.insertBefore(L,dt);if(b=z,!!w)for(let v of z)if(P.has(v))m.enter(K(v.first,v.last),w);else{let L=q?.get(v);L&&m.flip(v.first,L,w)}})},_=r=>{for(let l of r.effects)if(l.type==="navigate")e.onNavigate?.(l.url);else if(l.type==="timer"){let i=setTimeout(()=>{O.delete(i),J({type:"timer",entry:l.entry,ms:l.ms})},l.ms);O.add(i)}else e.onInvoke?.(l.effect,l.input).then(i=>J(i.ok?{type:"done",entry:l.entry,result:i.value}:{type:"failed",entry:l.entry,error:i.error,data:i.data}))};function J(r){if(!n||!j)return;let l=ht(n,j,r);if(l.taken){j=l.snapshot;for(let i of T)i();S(),_(l)}}return{attach(r,l,i,x,k){let u={parent:r,next:l,claim:k},g=r.namespaceURI===pt?pt:null,c=[],[p,b]=wt(u,()=>U(i,x,u,c,g));p&&b&&y.push([p,b]);let N=p?.isConnected===!0,m=()=>{if(N&&!p.isConnected)B.add(m);else for(let w of c)w()};T.push(m)},start(){h&&_(h),h=null},sync:()=>{for(let r of T)r();S()},dispatch:J,snapshot:()=>j,destroy:()=>{for(let r of O)clearTimeout(r);O.clear();for(let r of M)r.stop();M.clear(),T.length=0;for(let[r,l]of y)for(let i of K(r,l))i.remove();y.length=0}}}var It=function(t,e){return typeof t=="string"&&/^\.\.?\//.test(t)?t.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(n,o,s,a,f){return o?e?".jsx":".js":s&&(!a||!f)?n:s+a+"."+f.toLowerCase()+"js"}):t},Jt=t=>t.islands.flatMap(([e,n,...o])=>{let s=t.ids[e],a=s.slice(0,s.indexOf("."));return o.map(f=>({feature:a,node:s,scope:[...Array(n).fill(null),...f]}))}),Rt=t=>new URL(t,import.meta.url),Lt=async(t,e,n)=>{let o=JSON.stringify({effect:t,input:e,keys:n}),s=it.size?await(await import("./chunk-7HUHKEFT.js")).encode(o,e,it):o;return await(await fetch(Rt("effect"),{method:"POST",headers:typeof s=="string"?{"content-type":"application/json"}:{},body:s})).json()},Ht=async(t,e)=>await(await fetch(Rt("query"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({query:t,input:e})})).json(),Pt=async t=>(await import(It(t))).default,Wt=async t=>(await import(It(t))).fns;async function Vt(t,{transport:e=Lt,query:n=Ht,live:o,loadFns:s=Wt,loadComponent:a=Pt}={}){let f=new Map,d=t.getElementById("hozu-payload");if(!d?.textContent)return f;let y=JSON.parse(d.textContent),O={data:new Map(y.data),versions:new Map},h=y.fns?await s(y.fns):{},{components:j,routes:T}=y,B=y.motion?await import("./chunk-HGZ7KQUC.js"):void 0,M=Object.keys(j).length?(await import("./chunk-G6LC6QZB.js")).mountComponent:void 0;y.visible&&import("./chunk-DRLGN2D4.js").then(S=>S.watch(t));let A=new Map,$=(S,E)=>{let C=S+JSON.stringify(E),_=A.get(C);return _||(_=n(S,E).finally(()=>A.delete(C)),A.set(C,_)),_},I=Object.entries(y.live??{}),R=async S=>{if(X)return void U.push(...S);let E=I.filter(([,C])=>C.tags.some(_=>S.includes(_)));for(let[C,_]of E)O.data.set(C,await n(_.query,_.input));if(E.length)for(let C of f.values())C.sync()},X=0,U=[],at=async(S,E)=>{X++;let{result:C,refreshed:_,session:J}=await e(S,E,[...O.data.keys()]).finally(()=>X--);J&&(O.data.clear(),U=[]);for(let[r,l]of _)O.data.set(r,l),O.versions.set(r,(O.versions.get(r)??0)+1);if(_.length||J)for(let r of f.values())r.sync();return!X&&U.length&&R(U.splice(0)),C},St=null;for(let[S,E]of Object.entries(y.features)){let C=y.snapshots?.[S];f.set(S,Mt(t,{machine:E?gt({id:S,machine:E},h,T):null,payload:O,params:y.params,search:y.search,...C?{snapshot:C}:{},fns:h,components:j,routes:T,motion:B,mountComponent:M,loadComponent:a,onQuery:$,onInvoke:at,onNavigate:_=>t.defaultView?.location.assign(_)}))}let Y=[],ot=t.createTreeWalker(t.body??t,128);for(;ot.nextNode();)ot.currentNode.data==="i"&&Y.push(ot.currentNode);Jt(y).forEach((S,E)=>{let C=Y[E],_=y.nodes[S.node];C?.parentNode&&_&&f.get(S.feature)?.attach(C.parentNode,C.nextSibling,_,S.scope,!0)});for(let S of f.values())S.sync();for(let S of f.values())S.start();return I.length&&(o??(await import("./chunk-627YWRJ6.js")).liveStream(t))(R,I.flatMap(([,S])=>S.tags)),t.documentElement.setAttribute("data-hozu-ready",""),f}Vt(document);
1
+ var St=JSON.stringify;function et(t){if(t===null)return"null";switch(typeof t){case"string":return St(t);case"boolean":return t?"true":"false";case"number":if(!Number.isFinite(t))throw new TypeError(`Non-finite number ${t} is not valid JSON`);return Object.is(t,-0)?"0":String(t);case"object":{if(Array.isArray(t))return`[${t.map(et).join(",")}]`;let e=t,r=Object.keys(e).sort(),o="{";for(let s=0;s<r.length;s++){let a=r[s],u=e[a];if(u===void 0)throw new TypeError(`Undefined value at key "${a}"`);o+=`${s?",":""}${St(a)}:${et(u)}`}return`${o}}`}default:throw new TypeError(`Value of type ${typeof t} is not valid JSON`)}}function q(t,e){let r=t;for(let o of e){if(typeof r=="string"&&o==="length")return r.length;if(r===null||typeof r!="object")return null;r=r[o]}return r===void 0?null:r}function Z(t,e,r,o=0){if(o===e.length)return r;let s=e[o];if(Array.isArray(t)){let u=t.slice();return u[Number(s)]=Z(t[Number(s)]??null,e,r,o+1),u}let a=t!==null&&typeof t=="object"?t:{};return{...a,[s]:Z(a[s]??null,e,r,o+1)}}function J(t,e){if(t===e)return!0;if(t===null||e===null||typeof t!="object"||typeof e!="object")return!1;if(Array.isArray(t)){if(!Array.isArray(e)||t.length!==e.length)return!1;for(let o=0;o<t.length;o++)if(!J(t[o],e[o]))return!1;return!0}if(Array.isArray(e))return!1;let r=Object.keys(t);if(r.length!==Object.keys(e).length)return!1;for(let o of r)if(!Object.hasOwn(e,o)||!J(t[o],e[o]))return!1;return!0}var ut=(t,e,r)=>{let[o="",s=""]=t.split("?"),a=o.replace(/\/:([A-Za-z]\w*)[?*+]?/g,(j,b)=>[q(e,[b])??[]].flat().map(N=>`/${encodeURIComponent(String(N))}`).join(""))||"/",u=s.split("&"),d="";if(r&&typeof r=="object")for(let j of Object.keys(r).sort()){let b=r[j],y=`${encodeURIComponent(j)}=${encodeURIComponent(String(b))}`;b!==null&&typeof b!="object"&&!u.includes(y)&&(d+=`${d&&"&"}${y}`)}return d?`${a}?${d}`:a};var nt=class extends Error{name="CompileError"};function E(t,e){if("literal"in t||"formRef"in t){let a="literal"in t?t.literal:t.formRef;return()=>a}if("object"in t){let a=Object.entries(t.object).map(([u,d])=>[u,E(d,e)]);return u=>{let d={};for(let[j,b]of a)d[j]=b(u);return d}}if("fn"in t){let a=e[t.fn];if(!a)throw new nt(`No implementation bound for fn ${t.fn}`);let u=E(t.arg,e);return d=>a(u(d))}if("link"in t){let a=t.link,u=E(t.params,e),d=E(t.search,e);return j=>ut(j.routes?.[a]??"",u(j),d(j))}if("test"in t){let a=at(t.test,e);return u=>a(u)}if("endpoint"in t){let a=t.endpoint,u=E(t.input??{literal:null},e);return d=>ut(d.routes?.[a]??"",null,u(d))}let r=t,{path:o}=r;if(r.ref==="binding"){let a=r.depth;return o.length?u=>q(u.bindings?.[a],o):u=>u.bindings?.[a]??null}if(r.ref==="dom"){let[a,...u]=o;return d=>d.dom&&a?q(d.dom(a),u)??(a==="formAll"?[]:null):null}let s=r.ref;return o.length===0?a=>a[s]??null:a=>q(a[s],o)}var P=t=>typeof t=="number"||typeof t=="string"?t:Number.NaN;function at(t,e){switch(t.op){case"and":{let r=t.args.map(o=>at(o,e));return o=>r.every(s=>s(o))}case"or":{let r=t.args.map(o=>at(o,e));return o=>r.some(s=>s(o))}case"not":{let r=at(t.arg,e);return o=>!r(o)}case"fn":{let r=E({fn:t.fn,arg:t.arg},e);return o=>r(o)===!0}default:{let r=E(t.left,e),o=E(t.right,e);switch(t.op){case"eq":return s=>J(r(s),o(s));case"neq":return s=>!J(r(s),o(s));case"lt":return s=>P(r(s))<P(o(s));case"lte":return s=>P(r(s))<=P(o(s));case"gt":return s=>P(r(s))>P(o(s));default:return s=>P(r(s))>=P(o(s))}}}}function Ut(t,e){let{path:r}=t,o=E(t.value,e);switch(t.op){case"set":return(s,a)=>Z(s,r,o({...a,context:s}));case"append":return(s,a)=>{let u=q(s,r);return Z(s,r,[...Array.isArray(u)?u:[],o({...a,context:s})])};case"inc":return(s,a)=>Z(s,r,Number(q(s,r)??0)+Number(o({...a,context:s})));case"removeWhere":{let s=t.key;return(a,u)=>{let d=q(a,r),j=o({...u,context:a}),b=Array.isArray(d)?d:[];return Z(a,r,b.filter(y=>!J(s===null?y:y!==null&&typeof y=="object"&&!Array.isArray(y)?y[s]:null,j)))}}}}var qt=(t,e)=>r=>t({...r,routes:e});function gt(t,e={},r={}){let o=t.machine;if(!o)throw new nt(`Feature ${t.id} has no machine`);let s=Object.keys(o.states),a=new Map(s.map((y,N)=>[y,N])),u=y=>{let N=a.get(y);if(N===void 0)throw new nt(`Unknown state "${y}" in ${t.id}`);return N},d=[],j=(y,N)=>(d.push(N),{id:N,guard:y.guard?at(y.guard,e):null,target:u(y.target),assign:y.assign.map(C=>Ut(C,e)),navigate:y.navigate?qt(E(y.navigate,e),r):null}),b=s.map(y=>{let N=o.states[y],C=new Map;for(let[A,k]of Object.entries(N.on))C.set(A,k.map((V,I)=>j(V,`${y}/on/${A}/${I}`)));let D=new Map;N.after.forEach((A,k)=>{let V=j(A.transition,`${y}/after/${k}`);D.set(A.ms,[...D.get(A.ms)??[],V])});let M=N.invoke;return{name:y,final:N.final,on:C,invoke:M&&{effect:M.effect,input:E(M.input,e),done:M.done.map((A,k)=>j(A,`${y}/invoke/done/${k}`)),failed:new Map(Object.entries(M.failed).map(([A,k])=>[A,k.map((V,I)=>j(V,`${y}/invoke/failed/${A}/${I}`))]))},after:D,timers:[...D.keys()].sort((A,k)=>A-k)}});return{feature:t.id,initial:u(o.initial),initialContext:o.initialContext,states:b,index:a,transitions:d}}function jt(t,e,r,o,s){let a=t.states[e];a.invoke&&s.push({type:"invoke",entry:o,effect:a.invoke.effect,input:a.invoke.input({context:r})});for(let u of a.timers)s.push({type:"timer",entry:o,ms:u})}function Ot(t,e,r,o=1){let s=t.index.get(e);if(s===void 0)throw new Error(`Unknown state "${e}" in ${t.feature}`);let a=[];return jt(t,s,r,o,a),{snapshot:{state:e,context:r,entry:o},effects:a,taken:null}}var yt=t=>Ot(t,t.states[t.initial].name,t.initialContext),rt=t=>({snapshot:t,effects:[],taken:null});function pt(t,e,r,o){if(!r)return rt(e);for(let s of r){if(s.guard&&!s.guard(o))continue;let a=e.context;for(let j of s.assign)a=j(a,o);let u=e.entry+1,d=s.navigate===null?[]:[{type:"navigate",url:String(s.navigate(o))}];return jt(t,s.target,a,u,d),{snapshot:{state:t.states[s.target].name,context:a,entry:u},effects:d,taken:s.id}}return rt(e)}function ht(t,e,r){let o=t.states[t.index.get(e.state)??-1];if(!o||o.final)return rt(e);let s=e.context;switch(r.type){case"event":return pt(t,e,o.on.get(r.event),{context:s,event:r.payload});case"done":return r.entry!==e.entry||!o.invoke?rt(e):pt(t,e,o.invoke.done,{context:s,result:r.result});case"failed":{if(r.entry!==e.entry||!o.invoke)return rt(e);let a=o.invoke.failed,u=a.has(r.error),d=u?r.data:{message:Dt(r.data,r.error)};return pt(t,e,a.get(u?r.error:"Unexpected"),{context:s,error:d})}case"timer":return r.entry!==e.entry?rt(e):pt(t,e,o.after.get(r.ms),{context:s})}}function Dt(t,e){return t!==null&&typeof t=="object"&&!Array.isArray(t)&&typeof t.message=="string"?t.message:e}function Nt(t,e){let r=Object.create(null),o=Object.create(null),s=(a,u)=>{let d=typeof u=="string"?u:u.name,j=o[a];j?j.push(d):(o[a]=[d],r[a]=d)};for(let[a,u]of t)s(a,u);return e&&s(...e),{first:r,all:o}}var mt="http://www.w3.org/2000/svg",zt=new Set(["contenteditable","draggable","spellcheck"]),W=t=>t==null?"":typeof t=="object"?JSON.stringify(t):String(t);function $t(t,e){return e==null?null:typeof e=="boolean"?t.startsWith("aria-")||t.startsWith("data-")||zt.has(t)?String(e):e?"":null:W(e)}var At=new Set(["value","checked","selected","muted"]),xt=new Set(["scroll","wheel","touchstart","touchmove","touchend","pointermove","mousemove"]),_t=t=>typeof t=="number"&&!Number.isNaN(t)?t:null,lt=new Map,Bt=t=>t?[...t].map(e=>{let r=`u${lt.size+1}`;return lt.set(r,e),{name:e.name,size:e.size,type:e.type,token:r}}):[],bt=t=>e=>{let r=t.target;switch(e){case"value":return typeof r?.value=="string"?r.value:"";case"checked":return r?.checked===!0;case"valueAsNumber":return _t(r?.valueAsNumber);case"files":return Bt(r?.files??t.dataTransfer?.files);case"form":case"formAll":{let o=t.target,s=o.ownerDocument.defaultView,a=Nt(new(s?.FormData??FormData)(o,t.submitter));return e==="form"?a.first:a.all}case"open":return r?.open===!0;case"returnValue":return typeof r?.returnValue=="string"?r.returnValue:"";default:{let o=e in t?t[e]:r?.[e];return typeof o=="number"?_t(o):typeof o=="string"||typeof o=="boolean"?o:null}}},Tt=(t,e)=>t?e.length?`${t} ${e.join(" ")}`:t:e.join(" ");var kt=t=>{switch(t.op){case"and":case"or":return t.args.some(kt);case"not":return kt(t.arg);case"fn":return G(t.arg);default:return G(t.left)||G(t.right)}},G=t=>"ref"in t?t.ref==="context"||t.ref==="binding":"object"in t?Object.values(t.object).some(G):"fn"in t?G(t.arg):"test"in t&&kt(t.test),Ct=(t,e)=>t+et(e),Ft=t=>t instanceof Map?{data:t,versions:new Map}:t;var ot=(t,e)=>t!==null&&t.nodeType===8&&t.data===e;function K(t,e){let r=[t],o=t;for(;o!==e&&(o=o.nextSibling,!!o);)r.push(o);return r}function wt(t,e){let r=t.next?t.next.previousSibling:t.parent.lastChild;return e(),[r?r.nextSibling:t.parent.firstChild,t.next?t.next.previousSibling:t.parent.lastChild]}function Et(t,e){for(;t.nextSibling&&t.nextSibling!==e;)t.nextSibling.remove()}function Mt(t,e){let{machine:r,fns:o={},params:s=null,search:a=null,routes:u={}}=e,{data:d}=Ft(e.payload),j=[],b=new Set,y=r?e.snapshot?null:yt(r):null,N=e.snapshot??y?.snapshot??null,C=[],D=new Set,M=new Set,A=new WeakMap,k=(n,l,i)=>{let g=A.get(n);return g||(g=E(n,o),A.set(n,g)),g({context:N?.context??null,bindings:l,params:s,search:a,routes:u,...i?{dom:i}:{}})},V=(n,l,i,g)=>{let w=k(l,i);g(w),G(l)&&n.push(()=>{let f=k(l,i);f!==w&&(w=f,g(f))})},I=(n,l)=>{if(n.claim&&ot(n.next,l)){let i=n.next;return n.next=i.nextSibling,i}return n.parent.insertBefore(t.createComment(l),n.next)},st=n=>{if(!n.claim||!ot(n.next,"["))return;let l=0;for(;n.next;){let i=n.next;if(n.next=i.nextSibling,ot(i,"["))l++;else if(ot(i,"]")&&--l===0)return}},R=(n,l,i,g,w)=>{switch(n.kind){case"text":{let f;i.claim&&i.next?.nodeType===3?(f=i.next,i.next=f.nextSibling):f=i.parent.insertBefore(t.createTextNode(""),i.next),i.claim&&ot(i.next,"")&&(i.next=i.next.nextSibling),V(g,n.value,l,h=>{let c=W(h);f.data!==c&&(f.data=c)});return}case"el":{let f=n.tag,h=f==="svg"?mt:w,c,p=i.claim&&i.next?.nodeType===1&&i.next.localName===f;p?(c=i.next,i.next=c.nextSibling):(c=h?t.createElementNS(h,f):t.createElement(f),n.class&&c.setAttribute("class",n.class),i.parent.insertBefore(c,i.next));for(let m in n.attrs){let v=n.attrs[m],U=At.has(m)&&m in c;p&&!G(v)||V(g,v,l,z=>{if(U){let B=c,ct=m==="value"?W(z):z===!0;B[m]!==ct&&(B[m]=ct);return}let L=$t(m,z);L===null?c.removeAttribute(m):c.getAttribute(m)!==L&&c.setAttribute(m,L)})}F(c,n,l,g);for(let m in n.on){let v=n.on[m];c.addEventListener(m,U=>{m==="submit"&&U.preventDefault(),_({type:"event",event:v.event,payload:k(v.payload,l,bt(U))})},xt.has(m)?{passive:!0}:void 0)}if(f==="textarea")return;let x={parent:c,next:p?c.firstChild:null,claim:p},$=f==="foreignObject"?null:h;for(let m of n.children)R(m,l,x,g,$);return}case"when":{let f=()=>N?n.states.includes(N.state):!1;Q(i,g,f,(h,c)=>{if(f())for(let p of n.children)R(p,l,h,c,w)},n.motion);return}case"query":{let f=l;Q(i,g,()=>{let c=Ct(n.query,k(n.input,l)),p=d.get(c);return p&&f!==l&&f.splice(0,f.length,...l,p.ok?p.value:p.data),`${c}|${p?p.ok?"ready":n.failed[p.error]?p.error:"Unexpected":""}`},(c,p)=>{let x=k(n.input,l),$=Ct(n.query,x),m=d.get($);if(f=l,!m){(!c.claim||e.readsInBrowser?.(n.query))&&vt($,n.query,x),n.pending&&R(n.pending,l,c,p,w);return}let v=m.ok?n.ready:n.failed[m.error]??n.failed.Unexpected;f=[...l,m.ok?m.value:m.data],v&&R(v,f,c,p,w)});return}case"each":S(n,l,i,g,w);return;case"component":X(n,l,i,g);return;case"if":{let f=()=>k({test:n.test},l)===!0;Q(i,g,f,(h,c)=>{let p=f()?n.ifTrue:n.ifFalse;for(let x of p)R(x,l,h,c,w)},n.motion);return}case"html":{let f=I(i,"["),h;if(i.claim){for(;i.next&&!ot(i.next,"]");)i.next=i.next.nextSibling;h=i.next??i.parent.appendChild(t.createComment("]")),i.next=h.nextSibling}else h=I(i,"]");let c=i.claim?W(k(n.value,l)):null;V(g,n.value,l,p=>{let x=W(p);if(x===c)return;c=x,Et(f,h);let $=t.createElement("template");$.innerHTML=x,h.parentNode.insertBefore($.content,h)});return}case"global":{let f=I(i,"g"),h=n.target==="window"?t.defaultView:t,c=[];for(let p in n.on){let x=n.on[p],$=v=>_({type:"event",event:x.event,payload:k(x.payload,l,bt(v))}),m=xt.has(p)?{passive:!0}:void 0;h.addEventListener(p,$,m),c.push(()=>h.removeEventListener(p,$))}M.add({el:f,stop:()=>c.forEach(p=>p())});return}default:st(i)}},F=(n,l,i,g)=>{let w=Object.entries(l.toggle);if(w.length){let f=()=>{let c=[];for(let[p,x]of w)k(x,i)===!0&&c.push(p);return Tt(l.class,c)},h=f();n.getAttribute("class")!==h&&n.setAttribute("class",h),w.some(([,c])=>G(c))&&g.push(()=>{let c=f();c!==h&&(h=c,n.setAttribute("class",c))})}for(let f in l.vars)V(g,l.vars[f],i,h=>{let c=n.style;h===null||h===""?c.removeProperty(f):c.getPropertyValue(f)!==W(h)&&c.setProperty(f,W(h))})},X=(n,l,i,g)=>{let w=n.use.component,f=e.components?.[w],h=f?.tag??"div",c,p=i.claim&&i.next?.nodeType===1&&i.next.localName===h;if(p?(c=i.next,i.next=c.nextSibling):(c=t.createElement(h),n.class&&c.setAttribute("class",n.class),i.parent.insertBefore(c,i.next)),F(c,n,l,g),!p||n.children.length){let x={parent:c,next:p?c.firstChild:null,claim:p};for(let $ of n.children)R($,l,x,g,null)}f||console.error(`Hozu: component ${w} has no client code (bundleComponents)`),!(!f||!e.loadComponent||!e.mountComponent)&&e.mountComponent({el:c,ref:f,name:w,doc:t,props:()=>k(n.props,l),emit:(x,$)=>{let m=n.on[x];m&&_({type:"event",event:m.event,payload:k(m.payload,l,v=>v==="detail"?$:null)})},load:e.loadComponent,watch:x=>g.push(x),own:x=>M.add({el:c,stop:x}),same:J})},it=new Set,vt=(n,l,i)=>{!e.onQuery||it.has(n)||(it.add(n),e.onQuery(l,i).then(g=>{it.delete(n),d.set(n,g);for(let w of C)w();Y()}))},Y=()=>{for(let n=C.length-1;n>=0;n--)D.delete(C[n])&&C.splice(n,1);for(let n of M)n.el.isConnected||(n.stop(),M.delete(n))},Q=(n,l,i,g,w=null)=>{let f=I(n,"["),h=i(),c=[];g(n,c);let p=I(n,"]");l.push(()=>{let x=i();if(x===h){for(let U of c)U();return}h=x,c=[];let $=e.motion;if(!w||!$||$.reduced(t)){Et(f,p),g({parent:p.parentNode,next:p,claim:!1},c);return}$.leave(f.nextSibling===p?[]:K(f.nextSibling,p.previousSibling),w);let[m,v]=wt({parent:p.parentNode,next:p,claim:!1},()=>g({parent:p.parentNode,next:p,claim:!1},c));m&&v&&m!==p&&$.enter(K(m,v),w)})},S=(n,l,i,g,w)=>{let f=I(i,"["),h=m=>{let v=n.key===null?m:q(m,[n.key]);return typeof v=="string"?`s${v}`:JSON.stringify(v)},c=()=>{let m=k(n.source,l);return Array.isArray(m)?m:[]},p=(m,v)=>{let U=[...l,m],z=[],[L,B]=wt(v,()=>R(n.item,U,v,z,w));return{key:h(m),value:m,scope:U,block:z,first:L,last:B}},x=c().map(m=>p(m,i)),$=I(i,"]");g.push(()=>{let m=e.motion,v=n.motion&&m&&!m.reduced(t)?n.motion:null,U=v?new Map(x.flatMap(O=>O.first.nodeType===1?[[O,O.first.getBoundingClientRect()]]:[])):null,z=new Map(x.map(O=>[O.key,O])),L=new Set,B=[];for(let O of c()){let H=h(O),tt=z.get(H);if(tt){z.delete(H),tt.value=O,tt.scope.splice(0,tt.scope.length,...l,O);for(let ft of tt.block)ft();B.push(tt)}else{let ft=p(O,{parent:t.createDocumentFragment(),next:null,claim:!1});L.add(ft),B.push(ft)}}for(let O of z.values())if(v)m.leave(K(O.first,O.last),v);else for(let H of K(O.first,O.last))H.remove();let ct=$.parentNode,dt=f.nextSibling??$;for(let O of B)if(O.first===dt)dt=O.last.nextSibling??$;else for(let H of K(O.first,O.last))ct.insertBefore(H,dt);if(x=B,!!v)for(let O of B)if(L.has(O))m.enter(K(O.first,O.last),v);else{let H=U?.get(O);H&&m.flip(O.first,H,v)}})},T=n=>{for(let l of n.effects)if(l.type==="navigate")e.onNavigate?.(l.url);else if(l.type==="timer"){let i=setTimeout(()=>{b.delete(i),_({type:"timer",entry:l.entry,ms:l.ms})},l.ms);b.add(i)}else e.onInvoke?.(l.effect,l.input).then(i=>_(i.ok?{type:"done",entry:l.entry,result:i.value}:{type:"failed",entry:l.entry,error:i.error,data:i.data}))};function _(n){if(!r||!N)return;let l=ht(r,N,n);if(l.taken){N=l.snapshot;for(let i of C)i();Y(),T(l)}}return{attach(n,l,i,g,w){let f={parent:n,next:l,claim:w},h=n.namespaceURI===mt?mt:null,c=[],[p,x]=wt(f,()=>R(i,g,f,c,h));p&&x&&j.push([p,x]);let $=p?.isConnected===!0,m=()=>{if($&&!p.isConnected)D.add(m);else for(let v of c)v()};C.push(m)},start(){y&&T(y),y=null},sync:()=>{for(let n of C)n();Y()},dispatch:_,snapshot:()=>N,destroy:()=>{for(let n of b)clearTimeout(n);b.clear();for(let n of M)n.stop();M.clear(),C.length=0;for(let[n,l]of j)for(let i of K(n,l))i.remove();j.length=0}}}var Vt=function(t,e){return typeof t=="string"&&/^\.\.?\//.test(t)?t.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(r,o,s,a,u){return o?e?".jsx":".js":s&&(!a||!u)?r:s+a+"."+u.toLowerCase()+"js"}):t},Ht=t=>t.islands.flatMap(([e,r,...o])=>{let s=t.ids[e],a=s.slice(0,s.indexOf("."));return o.map(u=>({feature:a,node:s,scope:[...Array(r).fill(null),...u]}))}),It=t=>new URL(t,import.meta.url),Jt=async(t,e,r)=>{let o=JSON.stringify({effect:t,input:e,keys:r}),s=lt.size?await(await import("./chunk-7HUHKEFT.js")).encode(o,e,lt):o;return await(await fetch(It("effect"),{method:"POST",headers:typeof s=="string"?{"content-type":"application/json"}:{},body:s})).json()},Lt=async(t,e)=>await(await fetch(It("query"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({query:t,input:e})})).json(),Zt=async t=>(await import(Vt(t))).default,Pt=async t=>(await import(Vt(t))).fns;async function Rt(t,{transport:e=Jt,query:r=Lt,live:o,loadFns:s=Pt,loadComponent:a=Zt,loadFetch:u}={}){let d=new Map,j=t.getElementById("hozu-payload");if(!j?.textContent)return d;let b=JSON.parse(j.textContent),y={data:new Map(b.data),versions:new Map},N=b.fns?await s(b.fns):{},{components:C,routes:D}=b,M=b.motion?await import("./chunk-HGZ7KQUC.js"):void 0,A=Object.keys(C).length?(await import("./chunk-G6LC6QZB.js")).mountComponent:void 0;b.visible&&import("./chunk-DRLGN2D4.js").then(S=>S.watch(t));let k=b.effects?(await import("./chunk-CE5MSQHF.js")).createRunner(b,N,y,{stringify:et,compile:E},u):null,V=new Map,I=(S,T)=>{let _=S+JSON.stringify(T),n=V.get(_);return n||(n=(k?.runs(S)?k.run(S,T):r(S,T)).finally(()=>V.delete(_)),V.set(_,n)),n},st=Object.entries(b.live??{}),R=async S=>{if(F)return void X.push(...S);let T=st.filter(([,_])=>_.tags.some(n=>S.includes(n)));for(let[_,n]of T)y.data.set(_,await r(n.query,n.input));if(T.length)for(let _ of d.values())_.sync()},F=0,X=[],it=async(S,T)=>{if(k?.runs(S)){F++;let{result:g,changed:w}=await k.mutate(S,T).finally(()=>F--);if(w)for(let f of d.values())f.sync();return g}F++;let{result:_,refreshed:n,session:l,tags:i}=await e(S,T,[...y.data.keys()]).finally(()=>F--);if(i&&k&&await k.reread(i))for(let g of d.values())g.sync();l&&(y.data.clear(),X=[]);for(let[g,w]of n)y.data.set(g,w),y.versions.set(g,(y.versions.get(g)??0)+1);if(n.length||l)for(let g of d.values())g.sync();return!F&&X.length&&R(X.splice(0)),_},vt=null;for(let[S,T]of Object.entries(b.features)){let _=b.snapshots?.[S];d.set(S,Mt(t,{machine:T?gt({id:S,machine:T},N,D):null,payload:y,params:b.params,search:b.search,..._?{snapshot:_}:{},fns:N,components:C,routes:D,motion:M,mountComponent:A,loadComponent:a,onQuery:I,onInvoke:it,...k?{readsInBrowser:n=>k.runs(n)}:{},onNavigate:n=>t.defaultView?.location.assign(n)}))}let Y=[],Q=t.createTreeWalker(t.body??t,128);for(;Q.nextNode();)Q.currentNode.data==="i"&&Y.push(Q.currentNode);Ht(b).forEach((S,T)=>{let _=Y[T],n=b.nodes[S.node];_?.parentNode&&n&&d.get(S.feature)?.attach(_.parentNode,_.nextSibling,n,S.scope,!0)});for(let S of d.values())S.sync();for(let S of d.values())S.start();return st.length&&(o??(await import("./chunk-627YWRJ6.js")).liveStream(t))(R,st.flatMap(([,S])=>S.tags)),t.documentElement.setAttribute("data-hozu-ready",""),d}Rt(document);
@@ -239,6 +239,172 @@ var init_visible = __esm({
239
239
  }
240
240
  });
241
241
 
242
+ // packages/runtime-client/dist/fetch.js
243
+ var fetch_exports = {};
244
+ __export(fetch_exports, {
245
+ checked: () => checked,
246
+ createRunner: () => createRunner
247
+ });
248
+ function checked(schema, value, root = schema, at = "") {
249
+ const issues = [];
250
+ const where = at || "(root)";
251
+ let s = schema;
252
+ if (typeof s.$ref === "string")
253
+ s = s.$ref.split("/").slice(1).reduce((o, k) => o?.[k], root) ?? {};
254
+ const alternatives = s.anyOf ?? s.oneOf;
255
+ if (Array.isArray(alternatives)) {
256
+ for (const alt of alternatives) {
257
+ const r = checked(alt, value, root, at);
258
+ if (!r.issues.length)
259
+ return r;
260
+ }
261
+ return { issues: [`${where}: matches none of the allowed shapes`], value };
262
+ }
263
+ if ("const" in s && value !== s.const)
264
+ issues.push(`${where}: expected ${JSON.stringify(s.const)}`);
265
+ if (Array.isArray(s.enum) && !s.enum.includes(value))
266
+ issues.push(`${where}: expected one of ${s.enum.join(", ")}`);
267
+ const types = s.type === void 0 ? [] : Array.isArray(s.type) ? s.type : [s.type];
268
+ const is = (t) => t === "null" ? value === null : t === "array" ? Array.isArray(value) : t === "integer" ? Number.isInteger(value) : t === "object" ? typeof value === "object" && value !== null && !Array.isArray(value) : typeof value === t;
269
+ if (types.length && !types.some(is))
270
+ return { issues: [`${where}: expected ${types.join(" or ")}`], value };
271
+ if (typeof value === "string") {
272
+ if (s.minLength !== void 0 && value.length < s.minLength)
273
+ issues.push(`${where}: too short`);
274
+ if (s.maxLength !== void 0 && value.length > s.maxLength)
275
+ issues.push(`${where}: too long`);
276
+ if (s.pattern && !new RegExp(s.pattern).test(value))
277
+ issues.push(`${where}: does not match ${s.pattern}`);
278
+ }
279
+ if (typeof value === "number") {
280
+ if (s.minimum !== void 0 && value < s.minimum)
281
+ issues.push(`${where}: below ${s.minimum}`);
282
+ if (s.maximum !== void 0 && value > s.maximum)
283
+ issues.push(`${where}: above ${s.maximum}`);
284
+ }
285
+ if (Array.isArray(value)) {
286
+ if (!s.items)
287
+ return { issues, value };
288
+ const out = value.map((x, i) => {
289
+ const r = checked(s.items, x, root, `${at}${at ? "." : ""}${i}`);
290
+ issues.push(...r.issues);
291
+ return r.value;
292
+ });
293
+ return { issues, value: out };
294
+ }
295
+ if (typeof value === "object" && value !== null && s.properties) {
296
+ const v = value;
297
+ const out = {};
298
+ for (const key of s.required ?? [])
299
+ if (!(key in v))
300
+ issues.push(`${at}${at ? "." : ""}${key}: required`);
301
+ for (const [key, sub] of Object.entries(s.properties))
302
+ if (key in v) {
303
+ const r = checked(sub, v[key], root, `${at}${at ? "." : ""}${key}`);
304
+ issues.push(...r.issues);
305
+ out[key] = r.value;
306
+ }
307
+ if (s.additionalProperties && typeof s.additionalProperties === "object") {
308
+ for (const key of Object.keys(v))
309
+ if (!(key in out))
310
+ out[key] = v[key];
311
+ }
312
+ return { issues, value: out };
313
+ }
314
+ return { issues, value };
315
+ }
316
+ function createRunner(payload, fns, shared, tools, load = (url) => import(__rewriteRelativeImportExtension(
317
+ /* @vite-ignore */
318
+ url
319
+ ))) {
320
+ const effects = payload.effects ?? {};
321
+ const modules = /* @__PURE__ */ new Map();
322
+ const controllers = /* @__PURE__ */ new Set();
323
+ globalThis.addEventListener?.("pagehide", () => {
324
+ for (const c of controllers)
325
+ c.abort();
326
+ });
327
+ const moduleOf = (feature) => {
328
+ let m = modules.get(feature);
329
+ if (!m) {
330
+ const url = payload.fetches?.[feature];
331
+ m = url ? load(url) : Promise.reject(new Error(`No fetch bundle for ${feature}`));
332
+ modules.set(feature, m);
333
+ }
334
+ return m;
335
+ };
336
+ const tagsOf = (ref, input) => (effects[ref]?.tags ?? []).map((t) => t.param ? `${t.tag}(${tools.stringify(tools.compile(t.param, fns)({ input }))})` : t.tag);
337
+ async function run(ref, input) {
338
+ const e = effects[ref];
339
+ if (!e)
340
+ return unexpected(`${ref} does not run in the browser`);
341
+ const given = checked(e.input, input);
342
+ if (given.issues.length)
343
+ return e.kind === "mutation" ? { ok: false, error: "Invalid", data: { message: given.issues.join("; "), fields: {} } } : unexpected(`Invalid input: ${given.issues.join("; ")}`);
344
+ const dot = ref.indexOf(".");
345
+ const controller = new AbortController();
346
+ controllers.add(controller);
347
+ try {
348
+ const impl = (await moduleOf(ref.slice(0, dot)))[ref.slice(dot + 1)];
349
+ if (typeof impl !== "function")
350
+ return unexpected(`fetch.ts exports no ${ref.slice(dot + 1)}`);
351
+ const value = await impl(given.value, {
352
+ fail: (error, data) => {
353
+ throw { [FETCH_FAIL]: { error, data } };
354
+ },
355
+ signal: controller.signal,
356
+ env: payload.env ?? {}
357
+ });
358
+ const out = checked(e.output, value);
359
+ return out.issues.length ? unexpected(`${ref} returned a value that does not match its output: ${out.issues.join("; ")}`) : { ok: true, value: out.value };
360
+ } catch (error) {
361
+ const marked = error?.[FETCH_FAIL];
362
+ if (marked)
363
+ return { ok: false, error: marked.error, data: marked.data ?? null };
364
+ return unexpected(error instanceof Error ? error.message : String(error));
365
+ } finally {
366
+ controllers.delete(controller);
367
+ }
368
+ }
369
+ const isQuery = (ref) => effects[ref]?.kind === "query";
370
+ async function reread(tags) {
371
+ let changed = false;
372
+ for (const key of [...shared.data.keys()]) {
373
+ const ref = Object.keys(effects).find((r) => isQuery(r) && key.startsWith(r) && '{["tfn0123456789-'.includes(key[r.length] ?? ""));
374
+ if (!ref)
375
+ continue;
376
+ const input = JSON.parse(key.slice(ref.length));
377
+ if (!tagsOf(ref, input).some((t) => tags.includes(t)))
378
+ continue;
379
+ shared.data.set(key, await run(ref, input));
380
+ shared.versions.set(key, (shared.versions.get(key) ?? 0) + 1);
381
+ changed = true;
382
+ }
383
+ return changed;
384
+ }
385
+ async function mutate(ref, input) {
386
+ const result = await run(ref, input);
387
+ return { result, changed: result.ok ? await reread(tagsOf(ref, input)) : false };
388
+ }
389
+ return { run, mutate, reread, runs: (ref) => ref in effects };
390
+ }
391
+ var __rewriteRelativeImportExtension, FETCH_FAIL, unexpected;
392
+ var init_fetch = __esm({
393
+ "packages/runtime-client/dist/fetch.js"() {
394
+ "use strict";
395
+ __rewriteRelativeImportExtension = function(path, preserveJsx) {
396
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
397
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function(m, tsx, d, ext, cm) {
398
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : d + ext + "." + cm.toLowerCase() + "js";
399
+ });
400
+ }
401
+ return path;
402
+ };
403
+ FETCH_FAIL = /* @__PURE__ */ Symbol.for("hozu.fetchFail");
404
+ unexpected = (message) => ({ ok: false, error: "Unexpected", data: { message } });
405
+ }
406
+ });
407
+
242
408
  // packages/runtime-client/dist/dev.js
243
409
  var dev_exports = {};
244
410
  __export(dev_exports, {
@@ -313,6 +479,40 @@ var init_live = __esm({
313
479
  }
314
480
  });
315
481
 
482
+ // packages/core/dist/canonical/stringify.js
483
+ var quote = JSON.stringify;
484
+ function canonicalStringify(value) {
485
+ if (value === null)
486
+ return "null";
487
+ switch (typeof value) {
488
+ case "string":
489
+ return quote(value);
490
+ case "boolean":
491
+ return value ? "true" : "false";
492
+ case "number":
493
+ if (!Number.isFinite(value))
494
+ throw new TypeError(`Non-finite number ${value} is not valid JSON`);
495
+ return Object.is(value, -0) ? "0" : String(value);
496
+ case "object": {
497
+ if (Array.isArray(value))
498
+ return `[${value.map(canonicalStringify).join(",")}]`;
499
+ const obj = value;
500
+ const keys = Object.keys(obj).sort();
501
+ let out = "{";
502
+ for (let i = 0; i < keys.length; i++) {
503
+ const key = keys[i];
504
+ const v = obj[key];
505
+ if (v === void 0)
506
+ throw new TypeError(`Undefined value at key "${key}"`);
507
+ out += `${i ? "," : ""}${quote(key)}:${canonicalStringify(v)}`;
508
+ }
509
+ return `${out}}`;
510
+ }
511
+ default:
512
+ throw new TypeError(`Value of type ${typeof value} is not valid JSON`);
513
+ }
514
+ }
515
+
316
516
  // packages/machine/dist/data.js
317
517
  function getIn(value, path) {
318
518
  let current = value;
@@ -706,40 +906,6 @@ var domField = (e) => (field) => {
706
906
  };
707
907
  var classText = (base, active) => base ? active.length ? `${base} ${active.join(" ")}` : base : active.join(" ");
708
908
 
709
- // packages/core/dist/canonical/stringify.js
710
- var quote = JSON.stringify;
711
- function canonicalStringify(value) {
712
- if (value === null)
713
- return "null";
714
- switch (typeof value) {
715
- case "string":
716
- return quote(value);
717
- case "boolean":
718
- return value ? "true" : "false";
719
- case "number":
720
- if (!Number.isFinite(value))
721
- throw new TypeError(`Non-finite number ${value} is not valid JSON`);
722
- return Object.is(value, -0) ? "0" : String(value);
723
- case "object": {
724
- if (Array.isArray(value))
725
- return `[${value.map(canonicalStringify).join(",")}]`;
726
- const obj = value;
727
- const keys = Object.keys(obj).sort();
728
- let out = "{";
729
- for (let i = 0; i < keys.length; i++) {
730
- const key = keys[i];
731
- const v = obj[key];
732
- if (v === void 0)
733
- throw new TypeError(`Undefined value at key "${key}"`);
734
- out += `${i ? "," : ""}${quote(key)}:${canonicalStringify(v)}`;
735
- }
736
- return `${out}}`;
737
- }
738
- default:
739
- throw new TypeError(`Value of type ${typeof value} is not valid JSON`);
740
- }
741
- }
742
-
743
909
  // packages/runtime-client/dist/mount.js
744
910
  var guardReads = (g) => {
745
911
  switch (g.op) {
@@ -865,6 +1031,8 @@ function createApp(doc, options) {
865
1031
  c.next = el.nextSibling;
866
1032
  } else {
867
1033
  el = space ? doc.createElementNS(space, tag) : doc.createElement(tag);
1034
+ if (true)
1035
+ el.setAttribute("data-hz", node.id);
868
1036
  if (node.class)
869
1037
  el.setAttribute("class", node.class);
870
1038
  c.parent.insertBefore(el, c.next);
@@ -930,7 +1098,7 @@ function createApp(doc, options) {
930
1098
  const result = payload.get(k);
931
1099
  bound = scope;
932
1100
  if (!result) {
933
- if (!cc.claim)
1101
+ if (!cc.claim || options.readsInBrowser?.(node.query))
934
1102
  request(k, node.query, input);
935
1103
  if (node.pending)
936
1104
  render(node.pending, scope, cc, inner, ns);
@@ -1041,6 +1209,8 @@ function createApp(doc, options) {
1041
1209
  c.next = el.nextSibling;
1042
1210
  } else {
1043
1211
  el = doc.createElement(tag);
1212
+ if (true)
1213
+ el.setAttribute("data-hz", node.id);
1044
1214
  if (node.class)
1045
1215
  el.setAttribute("class", node.class);
1046
1216
  c.parent.insertBefore(el, c.next);
@@ -1268,7 +1438,7 @@ function createApp(doc, options) {
1268
1438
  }
1269
1439
 
1270
1440
  // packages/runtime-client/dist/hydrate.js
1271
- var __rewriteRelativeImportExtension = function(path, preserveJsx) {
1441
+ var __rewriteRelativeImportExtension2 = function(path, preserveJsx) {
1272
1442
  if (typeof path === "string" && /^\.\.?\//.test(path)) {
1273
1443
  return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function(m, tsx, d, ext, cm) {
1274
1444
  return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : d + ext + "." + cm.toLowerCase() + "js";
@@ -1300,15 +1470,15 @@ var fetchQuery = async (query, input) => {
1300
1470
  });
1301
1471
  return await response.json();
1302
1472
  };
1303
- var importComponent = async (url) => (await import(__rewriteRelativeImportExtension(
1473
+ var importComponent = async (url) => (await import(__rewriteRelativeImportExtension2(
1304
1474
  /* @vite-ignore */
1305
1475
  url
1306
1476
  ))).default;
1307
- var importFns = async (url) => (await import(__rewriteRelativeImportExtension(
1477
+ var importFns = async (url) => (await import(__rewriteRelativeImportExtension2(
1308
1478
  /* @vite-ignore */
1309
1479
  url
1310
1480
  ))).fns;
1311
- async function hydrate(doc, { transport = fetchTransport, query = fetchQuery, live, loadFns = importFns, loadComponent = importComponent } = {}) {
1481
+ async function hydrate(doc, { transport = fetchTransport, query = fetchQuery, live, loadFns = importFns, loadComponent = importComponent, loadFetch } = {}) {
1312
1482
  const apps = /* @__PURE__ */ new Map();
1313
1483
  const script = doc.getElementById("hozu-payload");
1314
1484
  if (!script?.textContent)
@@ -1321,12 +1491,19 @@ async function hydrate(doc, { transport = fetchTransport, query = fetchQuery, li
1321
1491
  const mountComponent2 = Object.keys(components).length ? (await Promise.resolve().then(() => (init_component(), component_exports))).mountComponent : void 0;
1322
1492
  if (payload.visible)
1323
1493
  void Promise.resolve().then(() => (init_visible(), visible_exports)).then((m) => m.watch(doc));
1494
+ const local = payload.effects ? (await Promise.resolve().then(() => (init_fetch(), fetch_exports))).createRunner(payload, fns, shared, { stringify: canonicalStringify, compile: compileValue }, loadFetch) : null;
1324
1495
  const inflight = /* @__PURE__ */ new Map();
1325
1496
  const onQuery = (q, input) => {
1497
+ if (true) {
1498
+ const held = payload.devState;
1499
+ if (held && "query" in held && held.query === q)
1500
+ return new Promise(() => {
1501
+ });
1502
+ }
1326
1503
  const key = q + JSON.stringify(input);
1327
1504
  let pending = inflight.get(key);
1328
1505
  if (!pending) {
1329
- pending = query(q, input).finally(() => inflight.delete(key));
1506
+ pending = (local?.runs(q) ? local.run(q, input) : query(q, input)).finally(() => inflight.delete(key));
1330
1507
  inflight.set(key, pending);
1331
1508
  }
1332
1509
  return pending;
@@ -1345,8 +1522,21 @@ async function hydrate(doc, { transport = fetchTransport, query = fetchQuery, li
1345
1522
  let busy = 0;
1346
1523
  let queued = [];
1347
1524
  const onInvoke = async (effect, input) => {
1525
+ if (local?.runs(effect)) {
1526
+ busy++;
1527
+ const { result: result2, changed } = await local.mutate(effect, input).finally(() => busy--);
1528
+ if (changed)
1529
+ for (const app of apps.values())
1530
+ app.sync();
1531
+ return result2;
1532
+ }
1348
1533
  busy++;
1349
- const { result, refreshed, session } = await transport(effect, input, [...shared.data.keys()]).finally(() => busy--);
1534
+ const { result, refreshed, session, tags } = await transport(effect, input, [
1535
+ ...shared.data.keys()
1536
+ ]).finally(() => busy--);
1537
+ if (tags && local && await local.reread(tags))
1538
+ for (const app of apps.values())
1539
+ app.sync();
1350
1540
  if (session) {
1351
1541
  shared.data.clear();
1352
1542
  queued = [];
@@ -1381,6 +1571,7 @@ async function hydrate(doc, { transport = fetchTransport, query = fetchQuery, li
1381
1571
  loadComponent,
1382
1572
  onQuery,
1383
1573
  onInvoke,
1574
+ ...local ? { readsInBrowser: (q) => local.runs(q) } : {},
1384
1575
  onNavigate: (url) => doc.defaultView?.location.assign(url)
1385
1576
  }));
1386
1577
  }
@@ -0,0 +1,30 @@
1
+ import type { Json, ValueExpr } from '@hozu/core/ir';
2
+ import type { PagePayload } from './hydrate.ts';
3
+ import type { Result, Store } from './mount.ts';
4
+ type S = Record<string, any>;
5
+ /**
6
+ * Checks a value against the subset of JSON Schema the IR emits, and returns it with undeclared object keys
7
+ * removed (as a schema parse strips them on the server).
8
+ */
9
+ export declare function checked(schema: S, value: unknown, root?: S, at?: string): {
10
+ issues: string[];
11
+ value: unknown;
12
+ };
13
+ /** Runs a page's browser-run effects (ADR 0049): loads each feature's fetch bundle once, checks every boundary. */
14
+ export declare function createRunner(payload: PagePayload, fns: Record<string, never>, shared: Store,
15
+ /** From the initial bundle, so this chunk shares no module with it (budget P7). */
16
+ tools: {
17
+ stringify: (value: unknown) => string;
18
+ compile: (v: ValueExpr, fns: Record<string, never>) => (scope: never) => Json;
19
+ }, load?: (url: string) => Promise<Record<string, unknown>>): {
20
+ run: (ref: string, input: Json) => Promise<Result>;
21
+ mutate: (ref: string, input: Json) => Promise<{
22
+ result: Result;
23
+ changed: boolean;
24
+ }>;
25
+ reread: (tags: string[]) => Promise<boolean>;
26
+ runs: (ref: string) => boolean;
27
+ };
28
+ export type Runner = ReturnType<typeof createRunner>;
29
+ export {};
30
+ //# sourceMappingURL=fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../src/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAI/C,KAAK,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AAE5B;;;GAGG;AACH,wBAAgB,OAAO,CACrB,MAAM,EAAE,CAAC,EACT,KAAK,EAAE,OAAO,EACd,IAAI,GAAE,CAAU,EAChB,EAAE,SAAK,GACN;IAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAkEtC;AAID,mHAAmH;AACnH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAC1B,MAAM,EAAE,KAAK;AACb,mFAAmF;AACnF,KAAK,EAAE;IACL,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAA;IACrC,OAAO,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;CAC9E,EACD,IAAI,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAA2C;eAqBzE,MAAM,SAAS,IAAI,KAAG,OAAO,CAAC,MAAM,CAAC;kBAmDlC,MAAM,SAAS,IAAI,KAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;mBAhBlE,MAAM,EAAE,KAAG,OAAO,CAAC,OAAO,CAAC;gBAoBb,MAAM;EACjD;AAED,MAAM,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAA"}