diff --git a/site/examples/uce-starter/README.md b/site/examples/uce-starter/README.md index 9cad9a4..7296fd7 100644 --- a/site/examples/uce-starter/README.md +++ b/site/examples/uce-starter/README.md @@ -33,3 +33,9 @@ The example uses query-string routing in the same style as the PHP starter, but Direct requests to `/examples/uce-starter/index.uce` still work, but self-links are canonicalized back to `/examples/uce-starter/`. The demo account pages use a small file-backed user store under `/tmp/uce-starter-data/` with session-based login state. + + +## Optional Datastar Assets + +This starter vendors Datastar v1.0.2 as `js/datastar.js` for future server-rendered interactive islands. It is not loaded by the default page shell. `lib/datastar.uce` contains small Datastar SSE formatting helpers, and `views/datastar-example.uce` is an unlinked opt-in example route. + diff --git a/site/examples/uce-starter/js/datastar.js b/site/examples/uce-starter/js/datastar.js new file mode 100644 index 0000000..94b7a88 --- /dev/null +++ b/site/examples/uce-starter/js/datastar.js @@ -0,0 +1,9 @@ +// Datastar v1.0.2 +var U="datastar-fetch",ge="datastar-prop-change",mt="datastar-ready",Ke="datastar-scope-children",ee="datastar-signal-patch";var L=Object.hasOwn??Object.prototype.hasOwnProperty.call;var z=e=>e!==null&&typeof e=="object"&&(Object.getPrototypeOf(e)===Object.prototype||Object.getPrototypeOf(e)===null),gt=e=>{for(let t in e)if(L(e,t))return!1;return!0},te=(e,t)=>{for(let n in e){let r=e[n];z(r)||Array.isArray(r)?te(r,t):e[n]=t(r)}},xe=e=>{let t={};for(let[n,r]of e){let s=n.split("."),i=s.pop(),o=s.reduce((a,c)=>a[c]??={},t);o[i]=r}return t};var Ne=[],ze=[],ke=0,Pe=0,Qe=0,he,J,Oe=0,x=()=>{ke++},N=()=>{--ke||(bt(),Q())},P=e=>{he={t:J,c:he},J=e},O=()=>{J=he?.t,he=he?.c},ye=e=>sn.bind(0,{previousValue:e,t:e,e:1}),Ze=Symbol("computed"),_e=e=>{let t=on.bind(0,{e:17,getter:e});return t[Ze]=1,t},A=e=>{let t={d:e,e:2};J&&Xe(t,J),P(t),x();try{t.d()}finally{N(),O()}return St.bind(0,t)},bt=()=>{for(;Pe"getter"in e?vt(e):Et(e,e.t),vt=e=>{P(e),At(e);try{let t=e.t;return t!==(e.t=e.getter(t))}finally{O(),Rt(e)}},Et=(e,t)=>(e.e=1,e.previousValue!==(e.previousValue=t)),Ye=e=>{let t=e.e;if(!(t&64)){e.e=t|64;let n=e.r;n?Ye(n.o):ze[Qe++]=e}},Tt=(e,t)=>{if(t&16||t&32&&wt(e.s,e)){P(e),At(e),x();try{e.d()}finally{N(),O(),Rt(e)}return}t&32&&(e.e=t&-33);let n=e.s;for(;n;){let r=n.l,s=r.e;s&64&&Tt(r,r.e=s&-65),n=n.i}},sn=(e,...t)=>{if(t.length){if(e.t!==(e.t=t[0])){e.e=17;let r=e.r;return r&&(an(r),ke||bt()),!0}return!1}let n=e.t;if(e.e&16&&Et(e,n)){let r=e.r;r&&He(r)}return J&&Xe(e,J),n},on=e=>{let t=e.e;if(t&16||t&32&&wt(e.s,e)){if(vt(e)){let n=e.r;n&&He(n)}}else t&32&&(e.e=t&-33);return J&&Xe(e,J),e.t},St=e=>{let t=e.s;for(;t;)t=Fe(t,e);let n=e.r;n&&Fe(n),e.e=0},Xe=(e,t)=>{let n=t.a;if(n&&n.l===e)return;let r=n?n.i:t.s;if(r&&r.l===e){r.p=Oe,t.a=r;return}let s=e.m;if(s&&s.p===Oe&&s.o===t)return;let i=t.a=e.m={p:Oe,l:e,o:t,u:n,i:r,f:s};r&&(r.u=i),n?n.i=i:t.s=i,s?s.n=i:e.r=i},Fe=(e,t=e.o)=>{let n=e.l,r=e.u,s=e.i,i=e.n,o=e.f;if(s?s.u=r:t.a=r,r?r.i=s:t.s=s,i?i.f=o:n.m=o,o)o.n=i;else if(!(n.r=i))if("getter"in n){let a=n.s;if(a){n.e=17;do a=Fe(a,n);while(a)}}else"previousValue"in n||St(n);return s},an=e=>{let t=e.n,n;e:for(;;){let r=e.o,s=r.e;if(s&60?s&12?s&4?!(s&48)&&cn(e,r)?(r.e=s|40,s&=1):s=0:r.e=s&-9|32:s=0:r.e=s|32,s&2&&Ye(r),s&1){let i=r.r;if(i){let o=(e=i).n;o&&(n={t,c:n},t=o);continue}}if(e=t){t=e.n;continue}for(;n;)if(e=n.t,n=n.c,e){t=e.n;continue e}break}},At=e=>{Oe++,e.a=void 0,e.e=e.e&-57|4},Rt=e=>{let t=e.a,n=t?t.i:e.s;for(;n;)n=Fe(n,e);e.e&=-5},wt=(e,t)=>{let n,r=0,s=!1;e:for(;;){let i=e.l,o=i.e;if(t.e&16)s=!0;else if((o&17)===17){if(yt(i)){let a=i.r;a.n&&He(a),s=!0}}else if((o&33)===33){(e.n||e.f)&&(n={t:e,c:n}),e=i.s,t=i,++r;continue}if(!s){let a=e.i;if(a){e=a;continue}}for(;r--;){let a=t.r,c=a.n;if(c?(e=n.t,n=n.c):e=a,s){if(yt(t)){c&&He(a),t=e.o;continue}s=!1}else t.e&=-33;if(t=e.o,e.i){e=e.i;continue e}}return s}},He=e=>{do{let t=e.o,n=t.e;(n&48)===32&&(t.e=n|16,n&2&&Ye(t))}while(e=e.n)},cn=(e,t)=>{let n=t.a;for(;n;){if(n===e)return!0;n=n.u}return!1},oe=e=>{let t=ne,n=e.split(".");for(let r of n){if(t==null||!L(t,r))return;t=t[r]}return t},Ce=(e,t="")=>{let n=Array.isArray(e);if(n||z(e)){let r=n?[]:{};for(let i in e)r[i]=ye(Ce(e[i],`${t+i}.`));let s=ye(0);return new Proxy(r,{get(i,o){if(!(o==="toJSON"&&!L(r,o)))return n&&o in Array.prototype?(s(),r[o]):typeof o=="symbol"?r[o]:((!L(r,o)||r[o]()==null)&&(r[o]=ye(""),Q(t+o,""),s(s()+1)),r[o]())},set(i,o,a){let c=t+o;if(n&&o==="length"){let l=r[o]-a;if(r[o]=a,l>0){let u={};for(let f=a;f{if(e!==void 0&&t!==void 0&&Ne.push([e,t]),!ke&&Ne.length){let n=xe(Ne);Ne.length=0,document.dispatchEvent(new CustomEvent(ee,{detail:n}))}},D=(e,{ifMissing:t}={})=>{x();for(let n in e)e[n]==null?t||delete ne[n]:Mt(e[n],n,ne,"",t);N()},E=(e,t)=>D(xe(e),t),Mt=(e,t,n,r,s)=>{if(z(e)){L(n,t)&&(z(n[t])||Array.isArray(n[t]))||(n[t]={});for(let i in e)e[i]==null?s||delete n[t][i]:Mt(e[i],i,n[t],`${r+t}.`,s)}else s&&L(n,t)||(n[t]=e)},ht=e=>typeof e=="string"?RegExp(e.replace(/^\/|\/$/g,"")):e,q=({include:e=/.*/,exclude:t=/(?!)/}={},n=ne)=>{let r=ht(e),s=ht(t),i=[],o=[[n,""]];for(;o.length;){let[a,c]=o.pop();for(let l in a){let u=c+l;z(a[l])?o.push([a[l],`${u}.`]):r.test(u)&&!s.test(u)&&i.push([u,oe(u)])}}return xe(i)},ne=Ce({});var Z=e=>e instanceof HTMLElement||e instanceof SVGElement||e instanceof MathMLElement;var ae=e=>e.replace(/([A-Z]+)([A-Z][a-z])/g,"$1-$2").replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/([a-z])([0-9]+)/gi,"$1-$2").replace(/([0-9]+)([a-z])/gi,"$1-$2").replace(/[\s_]+/g,"-").toLowerCase(),Lt=e=>ae(e).replace(/-./g,t=>t[1].toUpperCase()),xt=e=>ae(e).replace(/-/g,"_");var ln=/^(?:(?:async\s+)?function\b|(?:async\s*)?(?:\([^)]*\)|[A-Za-z_$][\w$]*)\s*=>)/,ce=(e,t={})=>{let{reviveFunctionStrings:n=!1}=t;try{return n?JSON.parse(e,(r,s)=>{if(typeof s!="string")return s;let i=s.trim();if(!ln.test(i))return s;try{let o=Function(`return (${i})`)();return typeof o=="function"?o:s}catch{return s}}):JSON.parse(e)}catch{return Function(`return (${e})`)()}},Nt={camel:e=>e.replace(/-[a-z]/g,t=>t[1].toUpperCase()),snake:e=>e.replace(/-/g,"_"),pascal:e=>e[0].toUpperCase()+Nt.camel(e.slice(1))},C=(e,t,n="camel")=>{for(let r of t.get("case")||[n])e=Nt[r]?.(e)||e;return e},K=e=>`data-${e}`,et=e=>e;var un="https://data-star.dev/errors",be=(e,t,n={})=>{Object.assign(n,e);let r=new Error,s=xt(t),i=new URLSearchParams({metadata:JSON.stringify(n)}).toString(),o=JSON.stringify(n,null,2);return r.message=`${t} +More info: ${un}/${s}?${i} +Context: ${o}`,r},ve=new Map,tt=new Map,Ct=new Map,Ft=new Proxy({},{get:(e,t)=>ve.get(t)?.apply,has:(e,t)=>ve.has(t),ownKeys:()=>Reflect.ownKeys(ve),set:()=>!1,deleteProperty:()=>!1}),Te=new Map,Ie=[],nt=new Set,Ee=new Set,Pt=!1,p=e=>{Ie.push(e),Ie.length===1&&setTimeout(()=>{for(let n of Ie)nt.add(n.name),tt.set(n.name,n);Ie.length=0;let t=Ee.size?[...Ee]:[document.documentElement];for(let n of t)hn(n,!Ee.has(n));nt.clear()})},V=e=>{ve.set(e.name,e)};document.addEventListener(U,e=>{let t=Ct.get(e.detail.type);t&&t.apply({error:be.bind(0,{plugin:{type:"watcher",name:t.name},element:{id:e.target.id,tag:e.target.tagName}})},e.detail.argsRaw)});var Se=e=>{Ct.set(e.name,e)},Ot=e=>{for(let t of e){let n=Te.get(t);if(n&&Te.delete(t))for(let r of n.values())for(let s of r.values())s()}},Ht=K("ignore"),fn=`[${Ht}]`,kt=e=>e.hasAttribute(`${Ht}__self`)||!!e.closest(fn),De=(e,t)=>{for(let n of e)if(!kt(n)){let r=new Set;for(let s in n.dataset){let i=s.replace(/[A-Z]/g,"-$&").toLowerCase();r.add(i),rt(n,i,n.dataset[s],t)}for(let s of Array.from(n.attributes)){if(!s.name.startsWith("data-"))continue;let i=s.name.slice(5);r.has(i)||rt(n,i,s.value,t)}}},dn=e=>{for(let{target:t,type:n,attributeName:r,addedNodes:s,removedNodes:i}of e)if(n==="childList"){for(let o of i)Z(o)&&(Ot([o]),Ot(o.querySelectorAll("*")));for(let o of s)Z(o)&&(De([o]),De(o.querySelectorAll("*")))}else if(n==="attributes"&&r.startsWith("data-")&&Z(t)&&!kt(t)){let o=r.slice(5),a=et(o);if(!a)continue;let c=t.getAttribute(r);if(c===null){let l=Te.get(t);if(l){let u=l.get(a);if(u){for(let f of u.values())f();l.delete(a)}}}else rt(t,o,c)}},pn=new MutationObserver(dn),mn=e=>{let[t,...n]=e.split("__"),[r,s]=t.split(/:(.+)/),i=new Map;for(let o of n){let[a,...c]=o.split(".");i.set(a,new Set(c))}return{pluginName:r,key:s,mods:i}},gn=()=>Ee.has(document.documentElement),yn=()=>{Pt||!gn()||(Pt=!0,document.dispatchEvent(new Event(mt)))},hn=(e=document.documentElement,t=!0)=>{Z(e)&&De([e],!0),De(e.querySelectorAll("*"),!0),t&&(pn.observe(e,{subtree:!0,childList:!0,attributes:!0}),Ee.add(e),yn())};var rt=(e,t,n,r)=>{let s=et(t);if(!s)return;let{pluginName:i,key:o,mods:a}=mn(s),c=tt.get(i);if((!r||nt.has(i))&&!!c){let u={el:e,rawKey:s,mods:a,error:be.bind(0,{plugin:{type:"attribute",name:c.name},element:{id:e.id,tag:e.tagName},expression:{rawKey:s,key:o,value:n}}),key:o,value:n,loadedPluginNames:{actions:new Set(ve.keys()),attributes:new Set(tt.keys())},rx:void 0},f=c.requirement&&(typeof c.requirement=="string"?c.requirement:c.requirement.key)||"allowed",m=c.requirement&&(typeof c.requirement=="string"?c.requirement:c.requirement.value)||"allowed",y=o!=null&&o!=="",v=n!=null&&n!=="";if(y){if(f==="denied")throw u.error("KeyNotAllowed")}else if(f==="must")throw u.error("KeyRequired");if(v){if(m==="denied")throw u.error("ValueNotAllowed")}else if(m==="must")throw u.error("ValueRequired");if(f==="exclusive"||m==="exclusive"){if(y&&v)throw u.error("KeyAndValueProvided");if(!y&&!v)throw u.error("KeyOrValueRequired")}let d=new Map;if(v){let h;u.rx=(...G)=>(h||(h=bn(n,{returnsValue:c.returnsValue,argNames:c.argNames,cleanups:d})),h(e,...G))}let g=c.apply(u);g&&d.set("attribute",g);let b=Te.get(e);if(b){let h=b.get(s);if(h)for(let G of h.values())G()}else b=new Map,Te.set(e,b);b.set(s,d)}},bn=(e,{returnsValue:t=!1,argNames:n=[],cleanups:r=new Map}={})=>{let s="";if(t){let i=/(?:\/(?:\\\/|[^/])*\/|"(?:\\"|[^"])*"|'(?:\\'|[^'])*'|`(?:\\`|[^`])*`|\(\s*(?:(?:function)\s*\(\s*\)|(?:\(\s*\))\s*=>)\s*(?:\{[\s\S]*?\}|[^;){]*)\s*\)\s*\(\s*\)|[^;])+/gm,o=e.trim().match(i);if(o){let a=o.length-1,c=o[a].trim();c.startsWith("return")||(o[a]=`return (${c});`),s=o.join(`; +`)}}else s=e.trim();s=s.replace(/(?:"[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*'|`[^`\\$]*(?:(?:\\.|\$(?!\{))[^`\\$]*)*`)|\$\{([^{}]*)\}|\$(\w+(?:[.-]\w+)*)/g,(i,o,a)=>{if(o===void 0&&a===void 0)return i;let c=l=>l.split(".").reduce((u,f)=>`${u}['${f}']`,"$");return o!==void 0?`\${${o.replace(/\$(\w+(?:[.-]\w+)*)/g,(l,u)=>c(u))}}`:c(a)}),s=s.replaceAll(/@([A-Za-z_$][\w$]*)\(/g,'__action("$1",evt,');try{let i=Function("el","$","__action","evt",...n,s);return(o,...a)=>{let c=(l,u,...f)=>{let m=be.bind(0,{plugin:{type:"action",name:l},element:{id:o.id,tag:o.tagName},expression:{fnContent:s,value:e}}),y=Ft[l];if(y)return y({el:o,evt:u,error:m,cleanups:r},...f);throw m("UndefinedAction")};try{return i(o,ne,c,void 0,...a)}catch(l){throw console.error(l),be({element:{id:o.id,tag:o.tagName},expression:{fnContent:s,value:e},error:l.message},"ExecuteExpression")}}}catch(i){throw console.error(i),be({expression:{fnContent:s,value:e},error:i.message},"GenerateExpression")}};V({name:"peek",apply(e,t){P();try{return t()}finally{O()}}});V({name:"setAll",apply(e,t,n){P();let r=q(n);te(r,()=>t),D(r),O()}});V({name:"toggleAll",apply(e,t){P();let n=q(t);te(n,r=>!r),D(n),O()}});var Ve=new Map,st=e=>!["GET","DELETE"].includes(e),Ae=(e,t,n=!0)=>V({name:e,apply:async({el:r,evt:s,error:i,cleanups:o},a,{selector:c,headers:l,contentType:u="json",filterSignals:{include:f=/.*/,exclude:m=/(^|\.)_/}={},openWhenHidden:y=n,payload:v,requestCancellation:d="auto",retry:g="auto",retryInterval:b=1e3,retryScaler:h=2,retryMaxWait:G=3e4,retryMaxCount:F=10}={})=>{let k=d instanceof AbortController?d:new AbortController;(d==="auto"||d==="cleanup")&&(Ve.get(t)?.get(a)?.abort(),Ve.has(t)||Ve.set(t,new Map),Ve.get(t).set(a,k)),d==="cleanup"&&(o.get(`@${e}`)?.(),o.set(`@${e}`,async()=>{k.abort(),await Promise.resolve()}));let de=()=>{};try{if(!a?.length)throw i("FetchNoUrlProvided",{action:V});let pe={Accept:"text/event-stream, text/html, application/json","Datastar-Request":!0};u==="json"&&st(t)&&(pe["Content-Type"]="application/json");let ie=Object.assign({},pe,l),H={input:"",method:t,headers:ie,openWhenHidden:y,retry:g,retryInterval:b,retryScaler:h,retryMaxWait:G,retryMaxCount:F,signal:k.signal,onopen:async T=>{T.status>=400&&re(vn,r,{status:T.status.toString()})},onmessage:T=>{if(!T.event.startsWith("datastar"))return;let W=T.event,S={};for(let R of T.data.split(` +`)){let M=R.indexOf(" "),w=R.slice(0,M),I=R.slice(M+1);(S[w]||=[]).push(I)}let _=Object.fromEntries(Object.entries(S).map(([R,M])=>[R,M.join(` +`)]));re(W,r,_)},onerror:T=>{if(_t(T))throw i("FetchExpectedTextEventStream",{url:a})}},je=()=>{let T=new URL(a,document.baseURI),W=new URLSearchParams(T.search);if(u==="json"){P();let S=v!==void 0?v:q({include:f,exclude:m});O();let _=JSON.stringify(S);st(t)?H.body=_:W.set("datastar",_)}else if(u==="form"){let S=c?document.querySelector(c):r.closest("form");if(!S)throw i("FetchFormNotFound",{action:V,selector:c});if(!S.noValidate&&!S.checkValidity()){S.reportValidity();return}let _=new FormData(S),R=r;if(r===S&&s instanceof SubmitEvent)R=s.submitter;else{let I=j=>j.preventDefault();S.addEventListener("submit",I),de=()=>{S.removeEventListener("submit",I)}}if(R instanceof HTMLButtonElement||R instanceof HTMLInputElement&&R.type==="submit"){let I=R.getAttribute("name");I&&_.append(I,R.value)}let M=S.getAttribute("enctype")==="multipart/form-data";M||(ie["Content-Type"]="application/x-www-form-urlencoded");let w=new URLSearchParams(_);if(st(t))M?H.body=_:H.body=w;else for(let[I,j]of w)W.append(I,j)}else throw i("FetchInvalidContentType",{action:V,contentType:u});return T.search=W.toString(),H.input=T.toString(),H};re(it,r,{});try{await Mn(r,je)}catch(T){if(!_t(T))throw i("FetchFailed",{method:t,url:a,error:T.message})}}finally{re(ot,r,{}),de(),o.delete(`@${e}`)}}});Ae("get","GET",!1);Ae("patch","PATCH");Ae("post","POST");Ae("put","PUT");Ae("delete","DELETE");var it="started",ot="finished",vn="error",En="retrying",Tn="retries-failed",re=(e,t,n)=>document.dispatchEvent(new CustomEvent(U,{detail:{type:e,el:t,argsRaw:n}})),_t=e=>`${e}`.includes("text/event-stream"),Sn=async(e,t)=>{let n=e.getReader(),r=await n.read();for(;!r.done;)t(r.value),r=await n.read()},An=e=>{let t,n,r,s=!1;return i=>{t?t=wn(t,i):(t=i,n=0,r=-1);let o=t.length,a=0;for(;n{let r=It(),s=new TextDecoder;return(i,o)=>{if(!i.length)n?.(r),r=It();else if(o>0){let a=s.decode(i.subarray(0,o)),c=o+(i[o+1]===32?2:1),l=s.decode(i.subarray(c));switch(a){case"data":r.data=r.data?`${r.data} +${l}`:l;break;case"event":r.event=l;break;case"id":e(r.id=l);break;case"retry":{let u=+l;Number.isNaN(u)||t(r.retry=u);break}}}}},wn=(e,t)=>{let n=new Uint8Array(e.length+t.length);return n.set(e),n.set(t,e.length),n},It=()=>({data:"",event:"",id:"",retry:void 0}),Mn=(e,t)=>new Promise((n,r)=>{let s=t();if(!s)return;let{input:i,signal:o,headers:a,onopen:c,onmessage:l,onclose:u,openWhenHidden:f,fetch:m,retry:y="auto",retryInterval:v=1e3,retryScaler:d=2,retryMaxWait:g=3e4,retryMaxCount:b=10,responseOverrides:h,...G}=s,F={...a},k,de=()=>{let M=t();M&&(i=M.input,G.body=M.body,R())},pe=()=>{k.abort(),document.hidden||de()};f||document.addEventListener("visibilitychange",pe);let ie,H=()=>{document.removeEventListener("visibilitychange",pe),clearTimeout(ie),k.abort()};o?.addEventListener("abort",()=>{H(),n()});let je=m||window.fetch,T=c||(()=>{}),W=0,S=v,_=()=>{W{k=new AbortController;let M=k.signal;try{let w=await je(i,{...G,headers:F,signal:M});await T(w);let I=async(B,me,We,Me,...rn)=>{let pt={[We]:await me.text()};for(let Ue of rn){let Je=me.headers.get(`datastar-${ae(Ue)}`);if(Me){let Le=Me[Ue];Le&&(Je=typeof Le=="string"?Le:JSON.stringify(Le))}Je&&(pt[Ue]=Je)}re(B,e,pt),H(),n()},j=w.status,tn=j===204,dt=j>=300&&j<400,nn=j>=400&&j<600;if(j!==200){if(u?.(),y!=="never"&&!tn&&!dt&&(y==="always"||y==="error"&&nn)){_();return}H(),n();return}W=0,v=S;let Be=w.headers.get("Content-Type");if(Be?.includes("text/html"))return await I("datastar-patch-elements",w,"elements",h,"selector","mode","namespace","useViewTransition");if(Be?.includes("application/json"))return await I("datastar-patch-signals",w,"signals",h,"onlyIfMissing");if(Be?.includes("text/javascript")){let B=document.createElement("script"),me=w.headers.get("datastar-script-attributes");if(me)for(let[We,Me]of Object.entries(JSON.parse(me)))B.setAttribute(We,Me);B.textContent=await w.text(),document.head.appendChild(B),H();return}if(await Sn(w.body,An(Rn(B=>{B?F["last-event-id"]=B:delete F["last-event-id"]},B=>{S=v=B},l))),u?.(),y==="always"&&!dt){_();return}H(),n()}catch{if(!M.aborted)try{_()}catch(w){H(),r(w)}}};R()});p({name:"attr",requirement:{value:"must"},returnsValue:!0,apply({el:e,key:t,rx:n}){let r=(a,c)=>{c===""||c===!0?e.setAttribute(a,""):c===!1||c==null?e.removeAttribute(a):typeof c=="string"?e.setAttribute(a,c):typeof c=="function"?e.setAttribute(a,c.toString()):e.setAttribute(a,JSON.stringify(c,(l,u)=>typeof u=="function"?u.toString():u))},s=t?()=>{i.disconnect();let a=n();r(t,a),i.observe(e,{attributeFilter:[t]})}:()=>{i.disconnect();let a=n(),c=Object.keys(a);for(let l of c)r(l,a[l]);i.observe(e,{attributeFilter:c})},i=new MutationObserver(s),o=A(s);return()=>{i.disconnect(),o()}}});var $e=(e,...t)=>({get:n=>n[e],set:(n,r)=>{n[e]=r},events:t}),Dt=(e,...t)=>({get:n=>n.getAttribute(e),set:(n,r)=>{n.setAttribute(e,`${r}`)},events:t}),at=(e=!1,...t)=>({get:(n,r)=>r==="string"||e&&r==="undefined"?n.value:+n.value,set:(n,r)=>{n.value=`${r}`},events:t}),Ln=/^data:(?[^;]+);base64,(?.*)$/,Vt=Symbol("empty"),xn=(e,t,n,r,s,i)=>{let o=K(CSS.escape(n)),a=t?`[${o}]`:`[${o}="${CSS.escape(r)}"]`;if(i===void 0&&e instanceof HTMLInputElement&&e.type==="radio"){let f=[...document.querySelectorAll(a)].find(m=>m instanceof HTMLInputElement&&m.checked);f&&E([[r,f.value]],{ifMissing:!0})}if(!Array.isArray(i)||e instanceof HTMLSelectElement&&e.multiple)return E([[r,s.get(e,typeof i)]],{ifMissing:!0}),r;let c=document.querySelectorAll(a),l=[],u=0;for(let f of c){if(l.push([`${r}.${u}`,s.get(f,typeof(L(i,u)?i[u]:void 0))]),e===f)break;u++}return E(l,{ifMissing:!0}),`${r}.${u}`};p({name:"bind",requirement:"exclusive",apply({el:e,key:t,rawKey:n,mods:r,value:s,error:i}){let o=t!=null?C(t,r):s,a=r.get("prop"),c=r.get("event"),l=null;if(e instanceof HTMLInputElement)switch(e.type){case"range":case"number":l=at(!1,"input");break;case"checkbox":l={get:(d,g)=>d.value!=="on"?g==="boolean"?d.checked:d.checked?d.value:"":g==="string"?d.checked?d.value:"":d.checked,set:(d,g)=>{d.checked=typeof g=="string"?g===d.value:g},events:["input"]};break;case"radio":e.getAttribute("name")?.length||e.setAttribute("name",o),l={get:(d,g)=>d.checked?g==="number"?+d.value:d.value:Vt,set:(d,g)=>{d.checked=g===(typeof g=="number"?+d.value:d.value)},events:["input"]};break;case"file":{let d=()=>{let g=[...e.files||[]],b=[];Promise.all(g.map(h=>new Promise(G=>{let F=new FileReader;F.onload=()=>{if(typeof F.result!="string")throw i("InvalidFileResultType",{resultType:typeof F.result});let k=F.result.match(Ln);if(!k?.groups)throw i("InvalidDataUri",{result:F.result});b.push({name:h.name,contents:k.groups.contents,mime:k.groups.mime})},F.onloadend=()=>G(),F.readAsDataURL(h)}))).then(()=>{E([[o,b]])})};return e.addEventListener("change",d),()=>{e.removeEventListener("change",d)}}default:l=at(!0,"input")}else if(e instanceof HTMLSelectElement&&e.multiple){let d=new Map;l={get:g=>[...g.selectedOptions].map(b=>{let h=d.get(b.value);return h==="string"||h==null?b.value:+b.value}),set:(g,b)=>{for(let h of g.options)b.includes(h.value)?(d.set(h.value,"string"),h.selected=!0):b.includes(+h.value)?(d.set(h.value,"number"),h.selected=!0):h.selected=!1},events:["change"]}}else e instanceof HTMLSelectElement?l=at(!0,"change"):e instanceof HTMLTextAreaElement?l=$e("value","input"):e instanceof HTMLElement&&e.tagName.includes("-")?l="value"in e?$e("value","input","change"):Dt("value","input","change"):e instanceof HTMLElement&&"value"in e?l=$e("value","change"):l=Dt("value","change");if(!l)throw i("InvalidBindAdapter");let u=a&&[...a][0];if(a&&!u)throw i("BindPropNameMissing");if(u){let d=Lt(u);l=$e(d,...c?[...c]:l.events)}else c&&(l.events=[...c]);let f=oe(o),m=xn(e,t,n,o,l,f),y=()=>{let d=oe(m);if(d!=null){let g=l.get(e,typeof d);g!==Vt&&E([[m,g]])}};for(let d of l.events)e.addEventListener(d,y);e.addEventListener(ge,y);let v=A(()=>{l.set(e,oe(m))});return()=>{v();for(let d of l.events)e.removeEventListener(d,y);e.removeEventListener(ge,y)}}});p({name:"class",requirement:{value:"must"},returnsValue:!0,apply({key:e,el:t,mods:n,rx:r}){e&&=C(e,n,"kebab");let s,i=()=>{o.disconnect(),s=e?{[e]:r()}:r();for(let c in s){let l=c.split(/\s+/).filter(u=>u.length>0);if(s[c])for(let u of l)t.classList.contains(u)||t.classList.add(u);else for(let u of l)t.classList.contains(u)&&t.classList.remove(u)}o.observe(t,{attributeFilter:["class"]})},o=new MutationObserver(i),a=A(i);return()=>{o.disconnect(),a();for(let c in s){let l=c.split(/\s+/).filter(u=>u.length>0);for(let u of l)t.classList.remove(u)}}}});p({name:"computed",requirement:{value:"must"},returnsValue:!0,apply({key:e,mods:t,rx:n,error:r}){if(e)E([[C(e,t),_e(n)]]);else{let s=Object.assign({},n());te(s,i=>{if(typeof i=="function")return _e(i);throw r("ComputedExpectedFunction")}),D(s)}}});p({name:"effect",requirement:{key:"denied",value:"must"},apply:({rx:e})=>A(e)});p({name:"indicator",requirement:"exclusive",apply({el:e,key:t,mods:n,value:r}){let s=t!=null?C(t,n):r,i=0;E([[s,!1]]);let o=a=>{let{type:c,el:l}=a.detail;if(l===e)switch(c){case it:i++,E([[s,!0]]);break;case ot:i=Math.max(0,i-1),E([[s,i>0]]);break}};return document.addEventListener(U,o),()=>{i=0,E([[s,!1]]),document.removeEventListener(U,o)}}});var Y=e=>{if(!e||e.size<=0)return 0;for(let t of e){if(t.endsWith("ms"))return+t.replace("ms","");if(t.endsWith("s"))return+t.replace("s","")*1e3;try{return Number.parseFloat(t)}catch{}}return 0},se=(e,t,n=!1)=>e?e.has(t.toLowerCase()):n,$t=(e,t="")=>{if(e&&e.size>0)for(let n of e)return n;return t};var ct=(e,t)=>(...n)=>{setTimeout(()=>{e(...n)},t)},qt=(e,t,n=!0,r=!1,s=!1)=>{let i=null,o=0;return(...a)=>{n&&!o?(e(...a),i=null):i=a,(!o||s)&&(o&&clearTimeout(o),o=setTimeout(()=>{r&&i!==null&&e(...i),i=null,o=0},t))}},le=(e,t)=>{let n=t.get("delay");if(n){let i=Y(n);e=ct(e,i)}let r=t.get("debounce");if(r){let i=Y(r),o=se(r,"leading",!1),a=!se(r,"notrailing",!1);e=qt(e,i,o,a,!0)}let s=t.get("throttle");if(s){let i=Y(s),o=!se(s,"noleading",!1),a=se(s,"trailing",!1);e=qt(e,i,o,a)}return e};var qe=(e=document.documentElement)=>"startViewTransition"in e,X=(e,t)=>{if(t.has("viewtransition")&&qe()){let n=e;e=(...r)=>document.startViewTransition(()=>n(...r))}return e};p({name:"init",requirement:{key:"denied",value:"must"},apply({rx:e,mods:t}){let n=()=>{x();try{e()}finally{N()}};n=X(n,t);let r=0,s=t.get("delay");s&&(r=Y(s),r>0&&(n=ct(n,r))),n()}});p({name:"json-signals",requirement:{key:"denied"},apply({el:e,value:t,mods:n}){let r=n.has("terse")?0:2,s={};t&&(s=ce(t));let i=()=>{o.disconnect(),e.textContent=JSON.stringify(q(s),null,r),o.observe(e,{childList:!0,characterData:!0,subtree:!0})},o=new MutationObserver(i),a=A(i);return()=>{o.disconnect(),a()}}});p({name:"on",requirement:"must",argNames:["evt"],apply({el:e,key:t,mods:n,rx:r}){let s=e;n.has("window")?s=window:n.has("document")&&(s=document);let i=l=>{x();try{r(l)}finally{N()}};i=X(i,n),i=le(i,n);let o=C(t,n,"kebab"),a={capture:n.has("capture"),passive:n.has("passive"),once:n.has("once")};if(n.has("outside")){s=document;let l=i;i=u=>{e.contains(u?.target)||l(u)}}(o===U||o===ee)&&(s=document);let c=l=>{l&&(n.has("prevent")&&l.preventDefault(),n.has("stop")&&l.stopPropagation(),e instanceof HTMLFormElement&&o==="submit"&&l.preventDefault()),i(l)};return s.addEventListener(o,c,a),()=>{s.removeEventListener(o,c,a)}}});var Gt=(e,t,n)=>Math.max(t,Math.min(n,e));var lt=new WeakSet;p({name:"on-intersect",requirement:{key:"denied",value:"must"},apply({el:e,mods:t,rx:n}){let r=()=>{x();try{n()}finally{N()}};r=X(r,t),r=le(r,t);let s={threshold:0};if(t.has("full"))s.threshold=1;else if(t.has("half"))s.threshold=.5;else{let a=t.get("threshold");a&&(s.threshold=Gt(Number($t(a)),0,100)/100)}let i=t.has("exit"),o=new IntersectionObserver(a=>{for(let c of a)c.isIntersecting!==i&&(r(),o&<.has(e)&&o.disconnect())},s);return o.observe(e),t.has("once")&<.add(e),()=>{t.has("once")||lt.delete(e),o&&(o.disconnect(),o=null)}}});p({name:"on-interval",requirement:{key:"denied",value:"must"},apply({mods:e,rx:t}){let n=()=>{x();try{t()}finally{N()}};n=X(n,e);let r=1e3,s=e.get("duration");s&&(r=Y(s),se(s,"leading",!1)&&n());let i=setInterval(n,r);return()=>{clearInterval(i)}}});p({name:"on-signal-patch",requirement:{value:"must"},argNames:["patch"],returnsValue:!0,apply({el:e,key:t,mods:n,rx:r,error:s}){if(t&&t!=="filter")throw s("KeyNotAllowed");let i=K(`${this.name}-filter`),o=e.getAttribute(i),a={};o&&(a=ce(o));let c=!1,l=le(u=>{if(c)return;P();let f=q(a,u.detail);if(O(),!gt(f)){c=!0,x();try{r(f)}finally{N(),c=!1}}},n);return document.addEventListener(ee,l),()=>{document.removeEventListener(ee,l)}}});p({name:"ref",requirement:"exclusive",apply({el:e,key:t,mods:n,value:r}){let s=t!=null?C(t,n):r;E([[s,e]])}});var jt="none",Bt="display";p({name:"show",requirement:{key:"denied",value:"must"},returnsValue:!0,apply({el:e,rx:t}){let n=()=>{r.disconnect(),t()?e.style.display===jt&&e.style.removeProperty(Bt):e.style.setProperty(Bt,jt),r.observe(e,{attributeFilter:["style"]})},r=new MutationObserver(n),s=A(n);return()=>{r.disconnect(),s()}}});p({name:"signals",returnsValue:!0,apply({key:e,mods:t,rx:n}){let r=t.has("ifmissing");if(e){e=C(e,t);let s=n?.();E([[e,s]],{ifMissing:r})}else{let s=Object.assign({},n?.());D(s,{ifMissing:r})}}});p({name:"style",requirement:{value:"must"},returnsValue:!0,apply({key:e,el:t,rx:n}){let{style:r}=t,s=new Map,i=(l,u)=>{let f=s.get(l);!u&&u!==0?f!==void 0&&(f?r.setProperty(l,f):r.removeProperty(l)):(f===void 0&&s.set(l,r.getPropertyValue(l)),r.setProperty(l,String(u)))},o=()=>{if(a.disconnect(),e)i(e,n());else{let l=n();for(let[u,f]of s)u in l||(f?r.setProperty(u,f):r.removeProperty(u));for(let u in l)i(ae(u),l[u])}a.observe(t,{attributeFilter:["style"]})},a=new MutationObserver(o),c=A(o);return()=>{a.disconnect(),c();for(let[l,u]of s)u?r.setProperty(l,u):r.removeProperty(l)}}});p({name:"text",requirement:{key:"denied",value:"must"},returnsValue:!0,apply({el:e,rx:t}){let n=()=>{r.disconnect(),e.textContent=`${t()}`,r.observe(e,{childList:!0,characterData:!0,subtree:!0})},r=new MutationObserver(n),s=A(n);return()=>{r.disconnect(),s()}}});var Wt=(e,t)=>e.includes(t),Nn=["remove","outer","inner","replace","prepend","append","before","after"],Pn=["html","svg","mathml"];Se({name:"datastar-patch-elements",apply(e,t){let n=typeof t.selector=="string"?t.selector:"",r=typeof t.mode=="string"?t.mode:"outer",s=typeof t.namespace=="string"?t.namespace:"html",i=typeof t.useViewTransition=="string"&&t.useViewTransition.trim()==="true",o=typeof t.viewTransitionSelector=="string"?t.viewTransitionSelector:"",a=t.elements;if(!Wt(Nn,r))throw e.error("PatchElementsInvalidMode",{mode:r});if(!n&&r!=="outer"&&r!=="replace")throw e.error("PatchElementsExpectedSelector");if(!Wt(Pn,s))throw e.error("PatchElementsInvalidNamespace",{namespace:s});let c={selector:n,mode:r,namespace:s,elements:a};if(i&&qe()){let l=document.documentElement;if(o){let u=document.querySelector(o);u&&qe(u)&&(l=u)}l.startViewTransition(()=>Ut(e,c))}else Ut(e,c)}});var Ut=({error:e},{selector:t,mode:n,namespace:r,elements:s})=>{let i=document.createDocumentFragment(),o=typeof s!="string"&&!!s;if(typeof s=="string"){let a=s.replace(/]*>|>)([\s\S]*?)<\/svg>/gim,""),c=/<\/html>/.test(a),l=/<\/head>/.test(a),u=/<\/body>/.test(a),f=r==="svg"?"svg":r==="mathml"?"math":"",m=f?`<${f}>${s}`:s,y=new DOMParser().parseFromString(c||l||u?s:``,"text/html");if(c)i.appendChild(y.documentElement);else if(l&&u)i.appendChild(y.head),i.appendChild(y.body);else if(l)i.appendChild(y.head);else if(u)i.appendChild(y.body);else if(f){let v=y.querySelector("template").content.querySelector(f);for(let d of v.childNodes)i.appendChild(d)}else i=y.querySelector("template").content}else s&&(s instanceof DocumentFragment?i=s:s instanceof Element&&i.appendChild(s));if(!t&&(n==="outer"||n==="replace")){let a=Array.from(i.children);for(let c of a){let l;if(c instanceof HTMLHtmlElement)l=document.documentElement;else if(c instanceof HTMLBodyElement)l=document.body;else if(c instanceof HTMLHeadElement)l=document.head;else if(l=document.getElementById(c.id),!l){console.warn(e("PatchElementsNoTargetsFound"),{element:{id:c.id}});continue}Kt(n,c,[l],!0)}}else{let a=document.querySelectorAll(t);if(!a.length){console.warn(e("PatchElementsNoTargetsFound"),{selector:t});return}let c=o&&n!=="remove"?[a[0]]:a;c.length===1&&(o=!0),Kt(n,i,c,o)}},ft=new WeakSet;for(let e of document.querySelectorAll("script"))ft.add(e);var Yt=e=>{let t=e instanceof HTMLScriptElement?[e]:e.querySelectorAll("script");for(let n of t)if(!ft.has(n)){let r=document.createElement("script");for(let{name:s,value:i}of n.attributes)r.setAttribute(s,i);r.text=n.text,n.replaceWith(r),ft.add(r)}},Jt=(e,t,n,r)=>{let s=!1;for(let i of e){if(r&&s)break;let o=r?t:t.cloneNode(!0);Yt(o),i[n](o),s=!0}},Kt=(e,t,n,r)=>{switch(e){case"remove":for(let s of n)s.remove();break;case"outer":case"inner":{let s=!1;for(let i of n){if(r&&s)break;let o=r?t:t.cloneNode(!0);Cn(i,o,e),Yt(i);let a=i.closest("[data-scope-children]");a&&a.dispatchEvent(new CustomEvent(Ke,{bubbles:!1})),s=!0}}break;case"replace":Jt(n,t,"replaceWith",r);break;case"prepend":case"append":case"before":case"after":Jt(n,t,e,r)}},$=new Map,fe=new Set,ue=new Map,Re=new Set,Ge=document.createElement("div");Ge.hidden=!0;var we=K("ignore-morph"),On=`[${we}]`,Cn=(e,t,n="outer")=>{if(Z(e)&&Z(t)&&e.hasAttribute(we)&&t.hasAttribute(we)||e.parentElement?.closest(On))return;let r=document.createElement("div");r.append(t),document.body.insertAdjacentElement("afterend",Ge);let s=e.querySelectorAll("[id]");for(let{id:a,tagName:c}of s)ue.has(a)?Re.add(a):ue.set(a,c);e instanceof Element&&e.id&&(ue.has(e.id)?Re.add(e.id):ue.set(e.id,e.tagName)),fe.clear();let i=r.querySelectorAll("[id]");for(let{id:a,tagName:c}of i)fe.has(a)?Re.add(a):ue.get(a)===c&&fe.add(a);for(let a of Re)fe.delete(a);ue.clear(),Re.clear(),$.clear();let o=n==="outer"?e.parentElement:e;Zt(o,s),Zt(r,i),Xt(o,r,n==="outer"?e:null,e.nextSibling),Ge.remove()},Xt=(e,t,n=null,r=null)=>{e instanceof HTMLTemplateElement&&t instanceof HTMLTemplateElement&&(e=e.content,t=t.content),n??=e.firstChild;for(let s of t.childNodes){if(n&&n!==r){let i=Fn(s,n,r);if(i){if(i!==n){let o=n;for(;o&&o!==i;){let a=o;o=o.nextSibling,Qt(a)}}ut(i,s),n=i.nextSibling;continue}}if(s instanceof Element&&fe.has(s.id)){let i=document.getElementById(s.id),o=i;for(;o=o.parentNode;){let a=$.get(o);a&&(a.delete(s.id),a.size||$.delete(o))}en(e,i,n),ut(i,s),n=i.nextSibling;continue}if($.has(s)){let i=s.namespaceURI,o=s.tagName,a=i&&i!=="http://www.w3.org/1999/xhtml"?document.createElementNS(i,o):document.createElement(o);e.insertBefore(a,n),ut(a,s),n=a.nextSibling}else{let i=document.importNode(s,!0);e.insertBefore(i,n),n=i.nextSibling}}for(;n&&n!==r;){let s=n;n=n.nextSibling,Qt(s)}},Fn=(e,t,n)=>{let r=null,s=e.nextSibling,i=0,o=0,a=$.get(e)?.size||0,c=t;for(;c&&c!==n;){if(zt(c,e)){let l=!1,u=$.get(c),f=$.get(e);if(f&&u){for(let m of u)if(f.has(m)){l=!0;break}}if(l)return c;if(!r&&!$.has(c)){if(!a)return c;r=c}}if(o+=$.get(c)?.size||0,o>a)break;r===null&&s&&zt(c,s)&&(i++,s=s.nextSibling,i>=2&&(r=void 0)),c=c.nextSibling}return r||null},zt=(e,t)=>e.nodeType===t.nodeType&&e.tagName===t.tagName&&(!e.id||e.id===t.id),Qt=e=>{$.has(e)?en(Ge,e,null):e.parentNode?.removeChild(e)},en=(e,t,n)=>{if("moveBefore"in e){e.moveBefore(t,n);return}e.insertBefore(t,n)},Hn=K("preserve-attr"),ut=(e,t)=>{let n=t.nodeType;if(n===1){let r=e,s=t,i=r.hasAttribute("data-scope-children");if(r.hasAttribute(we)&&s.hasAttribute(we))return e;let o=(t.getAttribute(Hn)??"").split(" "),a=(l,u,f)=>{let m=u.hasAttribute(f);return l.hasAttribute(f)!==m&&!o.includes(f)?(l[f]=m,!0):!1},c=!1;if(r instanceof HTMLInputElement&&s instanceof HTMLInputElement&&s.type!=="file"){let l=s.getAttribute("value");r.getAttribute("value")!==l&&!o.includes("value")&&(r.value=l??"",c=!0),c=a(r,s,"checked")||c,a(r,s,"disabled")}else if(r instanceof HTMLTextAreaElement&&s instanceof HTMLTextAreaElement){let l=s.value;r.defaultValue!==l&&(r.value=l,c=!0)}else r instanceof HTMLOptionElement&&s instanceof HTMLOptionElement&&(c=a(r,s,"selected")||c);for(let{name:l,value:u}of s.attributes)r.getAttribute(l)!==u&&!o.includes(l)&&r.setAttribute(l,u);for(let{name:l}of Array.from(r.attributes))!s.hasAttribute(l)&&!o.includes(l)&&r.removeAttribute(l);c&&(r instanceof HTMLOptionElement?r.closest("select"):r)?.dispatchEvent(new Event(ge,{bubbles:!0})),i&&!r.hasAttribute("data-scope-children")&&r.setAttribute("data-scope-children",""),r instanceof HTMLTemplateElement&&s instanceof HTMLTemplateElement?r.innerHTML=s.innerHTML:r.isEqualNode(s)||Xt(r,s),i&&r.dispatchEvent(new CustomEvent(Ke,{bubbles:!1}))}return(n===8||n===3)&&e.nodeValue!==t.nodeValue&&(e.nodeValue=t.nodeValue),e},Zt=(e,t)=>{for(let n of t)if(fe.has(n.id)){let r=n;for(;r&&r!==e;){let s=$.get(r);s||(s=new Set,$.set(r,s)),s.add(n.id),r=r.parentElement}}};Se({name:"datastar-patch-signals",apply({error:e},{signals:t,onlyIfMissing:n}){if(typeof t!="string")throw e("PatchSignalsExpectedSignals");let r=typeof n=="string"&&n.trim()==="true";D(ce(t),{ifMissing:r})}});export{V as action,Ft as actions,p as attribute,x as beginBatch,_e as computed,A as effect,N as endBatch,q as filtered,oe as getPath,D as mergePatch,E as mergePaths,ne as root,ye as signal,P as startPeeking,O as stopPeeking,Se as watcher}; +//# sourceMappingURL=datastar.js.map diff --git a/site/examples/uce-starter/lib/datastar.uce b/site/examples/uce-starter/lib/datastar.uce new file mode 100644 index 0000000..d9a74d8 --- /dev/null +++ b/site/examples/uce-starter/lib/datastar.uce @@ -0,0 +1,38 @@ +String datastar_data_lines(String field, String value) +{ + String out = ""; + for(String line : split(value, "\n")) + out += "data: " + field + " " + line + "\n"; + return(out); +} + +void datastar_sse_headers(Request& context) +{ + context.call["app"]["page_type"] = "blank"; + context.header["Content-Type"] = "text/event-stream; charset=utf-8"; + context.header["Cache-Control"] = "no-cache, no-store, must-revalidate"; + context.header["X-Accel-Buffering"] = "no"; +} + +String datastar_event(String event_name, StringMap fields) +{ + String out = "event: " + event_name + "\n"; + for(const auto& field : fields) + out += datastar_data_lines(field.first, field.second); + out += "\n"; + return(out); +} + +String datastar_patch_elements(String html) +{ + StringMap fields; + fields["elements"] = html; + return(datastar_event("datastar-patch-elements", fields)); +} + +String datastar_patch_signals(String signals_json) +{ + StringMap fields; + fields["signals"] = signals_json; + return(datastar_event("datastar-patch-signals", fields)); +} diff --git a/site/examples/uce-starter/views/datastar-example.uce b/site/examples/uce-starter/views/datastar-example.uce new file mode 100644 index 0000000..eff4864 --- /dev/null +++ b/site/examples/uce-starter/views/datastar-example.uce @@ -0,0 +1,20 @@ +#load "../lib/app.uce" +#load "../lib/datastar.uce" + +COMPONENT(Request& context) +{ + if(context.get["stream"] == "1") + { + datastar_sse_headers(context); + print(datastar_patch_elements("
Server-rendered UCE Datastar fragment
")); + return; + } + + <> +

Datastar optional example

+

Datastar is vendored beside the starter client libraries for future server-rendered islands. It is not loaded globally.

+ + +
Waiting for a server patch.
+ ; +} diff --git a/site/info/js/datastar.js b/site/info/js/datastar.js new file mode 100644 index 0000000..94b7a88 --- /dev/null +++ b/site/info/js/datastar.js @@ -0,0 +1,9 @@ +// Datastar v1.0.2 +var U="datastar-fetch",ge="datastar-prop-change",mt="datastar-ready",Ke="datastar-scope-children",ee="datastar-signal-patch";var L=Object.hasOwn??Object.prototype.hasOwnProperty.call;var z=e=>e!==null&&typeof e=="object"&&(Object.getPrototypeOf(e)===Object.prototype||Object.getPrototypeOf(e)===null),gt=e=>{for(let t in e)if(L(e,t))return!1;return!0},te=(e,t)=>{for(let n in e){let r=e[n];z(r)||Array.isArray(r)?te(r,t):e[n]=t(r)}},xe=e=>{let t={};for(let[n,r]of e){let s=n.split("."),i=s.pop(),o=s.reduce((a,c)=>a[c]??={},t);o[i]=r}return t};var Ne=[],ze=[],ke=0,Pe=0,Qe=0,he,J,Oe=0,x=()=>{ke++},N=()=>{--ke||(bt(),Q())},P=e=>{he={t:J,c:he},J=e},O=()=>{J=he?.t,he=he?.c},ye=e=>sn.bind(0,{previousValue:e,t:e,e:1}),Ze=Symbol("computed"),_e=e=>{let t=on.bind(0,{e:17,getter:e});return t[Ze]=1,t},A=e=>{let t={d:e,e:2};J&&Xe(t,J),P(t),x();try{t.d()}finally{N(),O()}return St.bind(0,t)},bt=()=>{for(;Pe"getter"in e?vt(e):Et(e,e.t),vt=e=>{P(e),At(e);try{let t=e.t;return t!==(e.t=e.getter(t))}finally{O(),Rt(e)}},Et=(e,t)=>(e.e=1,e.previousValue!==(e.previousValue=t)),Ye=e=>{let t=e.e;if(!(t&64)){e.e=t|64;let n=e.r;n?Ye(n.o):ze[Qe++]=e}},Tt=(e,t)=>{if(t&16||t&32&&wt(e.s,e)){P(e),At(e),x();try{e.d()}finally{N(),O(),Rt(e)}return}t&32&&(e.e=t&-33);let n=e.s;for(;n;){let r=n.l,s=r.e;s&64&&Tt(r,r.e=s&-65),n=n.i}},sn=(e,...t)=>{if(t.length){if(e.t!==(e.t=t[0])){e.e=17;let r=e.r;return r&&(an(r),ke||bt()),!0}return!1}let n=e.t;if(e.e&16&&Et(e,n)){let r=e.r;r&&He(r)}return J&&Xe(e,J),n},on=e=>{let t=e.e;if(t&16||t&32&&wt(e.s,e)){if(vt(e)){let n=e.r;n&&He(n)}}else t&32&&(e.e=t&-33);return J&&Xe(e,J),e.t},St=e=>{let t=e.s;for(;t;)t=Fe(t,e);let n=e.r;n&&Fe(n),e.e=0},Xe=(e,t)=>{let n=t.a;if(n&&n.l===e)return;let r=n?n.i:t.s;if(r&&r.l===e){r.p=Oe,t.a=r;return}let s=e.m;if(s&&s.p===Oe&&s.o===t)return;let i=t.a=e.m={p:Oe,l:e,o:t,u:n,i:r,f:s};r&&(r.u=i),n?n.i=i:t.s=i,s?s.n=i:e.r=i},Fe=(e,t=e.o)=>{let n=e.l,r=e.u,s=e.i,i=e.n,o=e.f;if(s?s.u=r:t.a=r,r?r.i=s:t.s=s,i?i.f=o:n.m=o,o)o.n=i;else if(!(n.r=i))if("getter"in n){let a=n.s;if(a){n.e=17;do a=Fe(a,n);while(a)}}else"previousValue"in n||St(n);return s},an=e=>{let t=e.n,n;e:for(;;){let r=e.o,s=r.e;if(s&60?s&12?s&4?!(s&48)&&cn(e,r)?(r.e=s|40,s&=1):s=0:r.e=s&-9|32:s=0:r.e=s|32,s&2&&Ye(r),s&1){let i=r.r;if(i){let o=(e=i).n;o&&(n={t,c:n},t=o);continue}}if(e=t){t=e.n;continue}for(;n;)if(e=n.t,n=n.c,e){t=e.n;continue e}break}},At=e=>{Oe++,e.a=void 0,e.e=e.e&-57|4},Rt=e=>{let t=e.a,n=t?t.i:e.s;for(;n;)n=Fe(n,e);e.e&=-5},wt=(e,t)=>{let n,r=0,s=!1;e:for(;;){let i=e.l,o=i.e;if(t.e&16)s=!0;else if((o&17)===17){if(yt(i)){let a=i.r;a.n&&He(a),s=!0}}else if((o&33)===33){(e.n||e.f)&&(n={t:e,c:n}),e=i.s,t=i,++r;continue}if(!s){let a=e.i;if(a){e=a;continue}}for(;r--;){let a=t.r,c=a.n;if(c?(e=n.t,n=n.c):e=a,s){if(yt(t)){c&&He(a),t=e.o;continue}s=!1}else t.e&=-33;if(t=e.o,e.i){e=e.i;continue e}}return s}},He=e=>{do{let t=e.o,n=t.e;(n&48)===32&&(t.e=n|16,n&2&&Ye(t))}while(e=e.n)},cn=(e,t)=>{let n=t.a;for(;n;){if(n===e)return!0;n=n.u}return!1},oe=e=>{let t=ne,n=e.split(".");for(let r of n){if(t==null||!L(t,r))return;t=t[r]}return t},Ce=(e,t="")=>{let n=Array.isArray(e);if(n||z(e)){let r=n?[]:{};for(let i in e)r[i]=ye(Ce(e[i],`${t+i}.`));let s=ye(0);return new Proxy(r,{get(i,o){if(!(o==="toJSON"&&!L(r,o)))return n&&o in Array.prototype?(s(),r[o]):typeof o=="symbol"?r[o]:((!L(r,o)||r[o]()==null)&&(r[o]=ye(""),Q(t+o,""),s(s()+1)),r[o]())},set(i,o,a){let c=t+o;if(n&&o==="length"){let l=r[o]-a;if(r[o]=a,l>0){let u={};for(let f=a;f{if(e!==void 0&&t!==void 0&&Ne.push([e,t]),!ke&&Ne.length){let n=xe(Ne);Ne.length=0,document.dispatchEvent(new CustomEvent(ee,{detail:n}))}},D=(e,{ifMissing:t}={})=>{x();for(let n in e)e[n]==null?t||delete ne[n]:Mt(e[n],n,ne,"",t);N()},E=(e,t)=>D(xe(e),t),Mt=(e,t,n,r,s)=>{if(z(e)){L(n,t)&&(z(n[t])||Array.isArray(n[t]))||(n[t]={});for(let i in e)e[i]==null?s||delete n[t][i]:Mt(e[i],i,n[t],`${r+t}.`,s)}else s&&L(n,t)||(n[t]=e)},ht=e=>typeof e=="string"?RegExp(e.replace(/^\/|\/$/g,"")):e,q=({include:e=/.*/,exclude:t=/(?!)/}={},n=ne)=>{let r=ht(e),s=ht(t),i=[],o=[[n,""]];for(;o.length;){let[a,c]=o.pop();for(let l in a){let u=c+l;z(a[l])?o.push([a[l],`${u}.`]):r.test(u)&&!s.test(u)&&i.push([u,oe(u)])}}return xe(i)},ne=Ce({});var Z=e=>e instanceof HTMLElement||e instanceof SVGElement||e instanceof MathMLElement;var ae=e=>e.replace(/([A-Z]+)([A-Z][a-z])/g,"$1-$2").replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/([a-z])([0-9]+)/gi,"$1-$2").replace(/([0-9]+)([a-z])/gi,"$1-$2").replace(/[\s_]+/g,"-").toLowerCase(),Lt=e=>ae(e).replace(/-./g,t=>t[1].toUpperCase()),xt=e=>ae(e).replace(/-/g,"_");var ln=/^(?:(?:async\s+)?function\b|(?:async\s*)?(?:\([^)]*\)|[A-Za-z_$][\w$]*)\s*=>)/,ce=(e,t={})=>{let{reviveFunctionStrings:n=!1}=t;try{return n?JSON.parse(e,(r,s)=>{if(typeof s!="string")return s;let i=s.trim();if(!ln.test(i))return s;try{let o=Function(`return (${i})`)();return typeof o=="function"?o:s}catch{return s}}):JSON.parse(e)}catch{return Function(`return (${e})`)()}},Nt={camel:e=>e.replace(/-[a-z]/g,t=>t[1].toUpperCase()),snake:e=>e.replace(/-/g,"_"),pascal:e=>e[0].toUpperCase()+Nt.camel(e.slice(1))},C=(e,t,n="camel")=>{for(let r of t.get("case")||[n])e=Nt[r]?.(e)||e;return e},K=e=>`data-${e}`,et=e=>e;var un="https://data-star.dev/errors",be=(e,t,n={})=>{Object.assign(n,e);let r=new Error,s=xt(t),i=new URLSearchParams({metadata:JSON.stringify(n)}).toString(),o=JSON.stringify(n,null,2);return r.message=`${t} +More info: ${un}/${s}?${i} +Context: ${o}`,r},ve=new Map,tt=new Map,Ct=new Map,Ft=new Proxy({},{get:(e,t)=>ve.get(t)?.apply,has:(e,t)=>ve.has(t),ownKeys:()=>Reflect.ownKeys(ve),set:()=>!1,deleteProperty:()=>!1}),Te=new Map,Ie=[],nt=new Set,Ee=new Set,Pt=!1,p=e=>{Ie.push(e),Ie.length===1&&setTimeout(()=>{for(let n of Ie)nt.add(n.name),tt.set(n.name,n);Ie.length=0;let t=Ee.size?[...Ee]:[document.documentElement];for(let n of t)hn(n,!Ee.has(n));nt.clear()})},V=e=>{ve.set(e.name,e)};document.addEventListener(U,e=>{let t=Ct.get(e.detail.type);t&&t.apply({error:be.bind(0,{plugin:{type:"watcher",name:t.name},element:{id:e.target.id,tag:e.target.tagName}})},e.detail.argsRaw)});var Se=e=>{Ct.set(e.name,e)},Ot=e=>{for(let t of e){let n=Te.get(t);if(n&&Te.delete(t))for(let r of n.values())for(let s of r.values())s()}},Ht=K("ignore"),fn=`[${Ht}]`,kt=e=>e.hasAttribute(`${Ht}__self`)||!!e.closest(fn),De=(e,t)=>{for(let n of e)if(!kt(n)){let r=new Set;for(let s in n.dataset){let i=s.replace(/[A-Z]/g,"-$&").toLowerCase();r.add(i),rt(n,i,n.dataset[s],t)}for(let s of Array.from(n.attributes)){if(!s.name.startsWith("data-"))continue;let i=s.name.slice(5);r.has(i)||rt(n,i,s.value,t)}}},dn=e=>{for(let{target:t,type:n,attributeName:r,addedNodes:s,removedNodes:i}of e)if(n==="childList"){for(let o of i)Z(o)&&(Ot([o]),Ot(o.querySelectorAll("*")));for(let o of s)Z(o)&&(De([o]),De(o.querySelectorAll("*")))}else if(n==="attributes"&&r.startsWith("data-")&&Z(t)&&!kt(t)){let o=r.slice(5),a=et(o);if(!a)continue;let c=t.getAttribute(r);if(c===null){let l=Te.get(t);if(l){let u=l.get(a);if(u){for(let f of u.values())f();l.delete(a)}}}else rt(t,o,c)}},pn=new MutationObserver(dn),mn=e=>{let[t,...n]=e.split("__"),[r,s]=t.split(/:(.+)/),i=new Map;for(let o of n){let[a,...c]=o.split(".");i.set(a,new Set(c))}return{pluginName:r,key:s,mods:i}},gn=()=>Ee.has(document.documentElement),yn=()=>{Pt||!gn()||(Pt=!0,document.dispatchEvent(new Event(mt)))},hn=(e=document.documentElement,t=!0)=>{Z(e)&&De([e],!0),De(e.querySelectorAll("*"),!0),t&&(pn.observe(e,{subtree:!0,childList:!0,attributes:!0}),Ee.add(e),yn())};var rt=(e,t,n,r)=>{let s=et(t);if(!s)return;let{pluginName:i,key:o,mods:a}=mn(s),c=tt.get(i);if((!r||nt.has(i))&&!!c){let u={el:e,rawKey:s,mods:a,error:be.bind(0,{plugin:{type:"attribute",name:c.name},element:{id:e.id,tag:e.tagName},expression:{rawKey:s,key:o,value:n}}),key:o,value:n,loadedPluginNames:{actions:new Set(ve.keys()),attributes:new Set(tt.keys())},rx:void 0},f=c.requirement&&(typeof c.requirement=="string"?c.requirement:c.requirement.key)||"allowed",m=c.requirement&&(typeof c.requirement=="string"?c.requirement:c.requirement.value)||"allowed",y=o!=null&&o!=="",v=n!=null&&n!=="";if(y){if(f==="denied")throw u.error("KeyNotAllowed")}else if(f==="must")throw u.error("KeyRequired");if(v){if(m==="denied")throw u.error("ValueNotAllowed")}else if(m==="must")throw u.error("ValueRequired");if(f==="exclusive"||m==="exclusive"){if(y&&v)throw u.error("KeyAndValueProvided");if(!y&&!v)throw u.error("KeyOrValueRequired")}let d=new Map;if(v){let h;u.rx=(...G)=>(h||(h=bn(n,{returnsValue:c.returnsValue,argNames:c.argNames,cleanups:d})),h(e,...G))}let g=c.apply(u);g&&d.set("attribute",g);let b=Te.get(e);if(b){let h=b.get(s);if(h)for(let G of h.values())G()}else b=new Map,Te.set(e,b);b.set(s,d)}},bn=(e,{returnsValue:t=!1,argNames:n=[],cleanups:r=new Map}={})=>{let s="";if(t){let i=/(?:\/(?:\\\/|[^/])*\/|"(?:\\"|[^"])*"|'(?:\\'|[^'])*'|`(?:\\`|[^`])*`|\(\s*(?:(?:function)\s*\(\s*\)|(?:\(\s*\))\s*=>)\s*(?:\{[\s\S]*?\}|[^;){]*)\s*\)\s*\(\s*\)|[^;])+/gm,o=e.trim().match(i);if(o){let a=o.length-1,c=o[a].trim();c.startsWith("return")||(o[a]=`return (${c});`),s=o.join(`; +`)}}else s=e.trim();s=s.replace(/(?:"[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*'|`[^`\\$]*(?:(?:\\.|\$(?!\{))[^`\\$]*)*`)|\$\{([^{}]*)\}|\$(\w+(?:[.-]\w+)*)/g,(i,o,a)=>{if(o===void 0&&a===void 0)return i;let c=l=>l.split(".").reduce((u,f)=>`${u}['${f}']`,"$");return o!==void 0?`\${${o.replace(/\$(\w+(?:[.-]\w+)*)/g,(l,u)=>c(u))}}`:c(a)}),s=s.replaceAll(/@([A-Za-z_$][\w$]*)\(/g,'__action("$1",evt,');try{let i=Function("el","$","__action","evt",...n,s);return(o,...a)=>{let c=(l,u,...f)=>{let m=be.bind(0,{plugin:{type:"action",name:l},element:{id:o.id,tag:o.tagName},expression:{fnContent:s,value:e}}),y=Ft[l];if(y)return y({el:o,evt:u,error:m,cleanups:r},...f);throw m("UndefinedAction")};try{return i(o,ne,c,void 0,...a)}catch(l){throw console.error(l),be({element:{id:o.id,tag:o.tagName},expression:{fnContent:s,value:e},error:l.message},"ExecuteExpression")}}}catch(i){throw console.error(i),be({expression:{fnContent:s,value:e},error:i.message},"GenerateExpression")}};V({name:"peek",apply(e,t){P();try{return t()}finally{O()}}});V({name:"setAll",apply(e,t,n){P();let r=q(n);te(r,()=>t),D(r),O()}});V({name:"toggleAll",apply(e,t){P();let n=q(t);te(n,r=>!r),D(n),O()}});var Ve=new Map,st=e=>!["GET","DELETE"].includes(e),Ae=(e,t,n=!0)=>V({name:e,apply:async({el:r,evt:s,error:i,cleanups:o},a,{selector:c,headers:l,contentType:u="json",filterSignals:{include:f=/.*/,exclude:m=/(^|\.)_/}={},openWhenHidden:y=n,payload:v,requestCancellation:d="auto",retry:g="auto",retryInterval:b=1e3,retryScaler:h=2,retryMaxWait:G=3e4,retryMaxCount:F=10}={})=>{let k=d instanceof AbortController?d:new AbortController;(d==="auto"||d==="cleanup")&&(Ve.get(t)?.get(a)?.abort(),Ve.has(t)||Ve.set(t,new Map),Ve.get(t).set(a,k)),d==="cleanup"&&(o.get(`@${e}`)?.(),o.set(`@${e}`,async()=>{k.abort(),await Promise.resolve()}));let de=()=>{};try{if(!a?.length)throw i("FetchNoUrlProvided",{action:V});let pe={Accept:"text/event-stream, text/html, application/json","Datastar-Request":!0};u==="json"&&st(t)&&(pe["Content-Type"]="application/json");let ie=Object.assign({},pe,l),H={input:"",method:t,headers:ie,openWhenHidden:y,retry:g,retryInterval:b,retryScaler:h,retryMaxWait:G,retryMaxCount:F,signal:k.signal,onopen:async T=>{T.status>=400&&re(vn,r,{status:T.status.toString()})},onmessage:T=>{if(!T.event.startsWith("datastar"))return;let W=T.event,S={};for(let R of T.data.split(` +`)){let M=R.indexOf(" "),w=R.slice(0,M),I=R.slice(M+1);(S[w]||=[]).push(I)}let _=Object.fromEntries(Object.entries(S).map(([R,M])=>[R,M.join(` +`)]));re(W,r,_)},onerror:T=>{if(_t(T))throw i("FetchExpectedTextEventStream",{url:a})}},je=()=>{let T=new URL(a,document.baseURI),W=new URLSearchParams(T.search);if(u==="json"){P();let S=v!==void 0?v:q({include:f,exclude:m});O();let _=JSON.stringify(S);st(t)?H.body=_:W.set("datastar",_)}else if(u==="form"){let S=c?document.querySelector(c):r.closest("form");if(!S)throw i("FetchFormNotFound",{action:V,selector:c});if(!S.noValidate&&!S.checkValidity()){S.reportValidity();return}let _=new FormData(S),R=r;if(r===S&&s instanceof SubmitEvent)R=s.submitter;else{let I=j=>j.preventDefault();S.addEventListener("submit",I),de=()=>{S.removeEventListener("submit",I)}}if(R instanceof HTMLButtonElement||R instanceof HTMLInputElement&&R.type==="submit"){let I=R.getAttribute("name");I&&_.append(I,R.value)}let M=S.getAttribute("enctype")==="multipart/form-data";M||(ie["Content-Type"]="application/x-www-form-urlencoded");let w=new URLSearchParams(_);if(st(t))M?H.body=_:H.body=w;else for(let[I,j]of w)W.append(I,j)}else throw i("FetchInvalidContentType",{action:V,contentType:u});return T.search=W.toString(),H.input=T.toString(),H};re(it,r,{});try{await Mn(r,je)}catch(T){if(!_t(T))throw i("FetchFailed",{method:t,url:a,error:T.message})}}finally{re(ot,r,{}),de(),o.delete(`@${e}`)}}});Ae("get","GET",!1);Ae("patch","PATCH");Ae("post","POST");Ae("put","PUT");Ae("delete","DELETE");var it="started",ot="finished",vn="error",En="retrying",Tn="retries-failed",re=(e,t,n)=>document.dispatchEvent(new CustomEvent(U,{detail:{type:e,el:t,argsRaw:n}})),_t=e=>`${e}`.includes("text/event-stream"),Sn=async(e,t)=>{let n=e.getReader(),r=await n.read();for(;!r.done;)t(r.value),r=await n.read()},An=e=>{let t,n,r,s=!1;return i=>{t?t=wn(t,i):(t=i,n=0,r=-1);let o=t.length,a=0;for(;n{let r=It(),s=new TextDecoder;return(i,o)=>{if(!i.length)n?.(r),r=It();else if(o>0){let a=s.decode(i.subarray(0,o)),c=o+(i[o+1]===32?2:1),l=s.decode(i.subarray(c));switch(a){case"data":r.data=r.data?`${r.data} +${l}`:l;break;case"event":r.event=l;break;case"id":e(r.id=l);break;case"retry":{let u=+l;Number.isNaN(u)||t(r.retry=u);break}}}}},wn=(e,t)=>{let n=new Uint8Array(e.length+t.length);return n.set(e),n.set(t,e.length),n},It=()=>({data:"",event:"",id:"",retry:void 0}),Mn=(e,t)=>new Promise((n,r)=>{let s=t();if(!s)return;let{input:i,signal:o,headers:a,onopen:c,onmessage:l,onclose:u,openWhenHidden:f,fetch:m,retry:y="auto",retryInterval:v=1e3,retryScaler:d=2,retryMaxWait:g=3e4,retryMaxCount:b=10,responseOverrides:h,...G}=s,F={...a},k,de=()=>{let M=t();M&&(i=M.input,G.body=M.body,R())},pe=()=>{k.abort(),document.hidden||de()};f||document.addEventListener("visibilitychange",pe);let ie,H=()=>{document.removeEventListener("visibilitychange",pe),clearTimeout(ie),k.abort()};o?.addEventListener("abort",()=>{H(),n()});let je=m||window.fetch,T=c||(()=>{}),W=0,S=v,_=()=>{W{k=new AbortController;let M=k.signal;try{let w=await je(i,{...G,headers:F,signal:M});await T(w);let I=async(B,me,We,Me,...rn)=>{let pt={[We]:await me.text()};for(let Ue of rn){let Je=me.headers.get(`datastar-${ae(Ue)}`);if(Me){let Le=Me[Ue];Le&&(Je=typeof Le=="string"?Le:JSON.stringify(Le))}Je&&(pt[Ue]=Je)}re(B,e,pt),H(),n()},j=w.status,tn=j===204,dt=j>=300&&j<400,nn=j>=400&&j<600;if(j!==200){if(u?.(),y!=="never"&&!tn&&!dt&&(y==="always"||y==="error"&&nn)){_();return}H(),n();return}W=0,v=S;let Be=w.headers.get("Content-Type");if(Be?.includes("text/html"))return await I("datastar-patch-elements",w,"elements",h,"selector","mode","namespace","useViewTransition");if(Be?.includes("application/json"))return await I("datastar-patch-signals",w,"signals",h,"onlyIfMissing");if(Be?.includes("text/javascript")){let B=document.createElement("script"),me=w.headers.get("datastar-script-attributes");if(me)for(let[We,Me]of Object.entries(JSON.parse(me)))B.setAttribute(We,Me);B.textContent=await w.text(),document.head.appendChild(B),H();return}if(await Sn(w.body,An(Rn(B=>{B?F["last-event-id"]=B:delete F["last-event-id"]},B=>{S=v=B},l))),u?.(),y==="always"&&!dt){_();return}H(),n()}catch{if(!M.aborted)try{_()}catch(w){H(),r(w)}}};R()});p({name:"attr",requirement:{value:"must"},returnsValue:!0,apply({el:e,key:t,rx:n}){let r=(a,c)=>{c===""||c===!0?e.setAttribute(a,""):c===!1||c==null?e.removeAttribute(a):typeof c=="string"?e.setAttribute(a,c):typeof c=="function"?e.setAttribute(a,c.toString()):e.setAttribute(a,JSON.stringify(c,(l,u)=>typeof u=="function"?u.toString():u))},s=t?()=>{i.disconnect();let a=n();r(t,a),i.observe(e,{attributeFilter:[t]})}:()=>{i.disconnect();let a=n(),c=Object.keys(a);for(let l of c)r(l,a[l]);i.observe(e,{attributeFilter:c})},i=new MutationObserver(s),o=A(s);return()=>{i.disconnect(),o()}}});var $e=(e,...t)=>({get:n=>n[e],set:(n,r)=>{n[e]=r},events:t}),Dt=(e,...t)=>({get:n=>n.getAttribute(e),set:(n,r)=>{n.setAttribute(e,`${r}`)},events:t}),at=(e=!1,...t)=>({get:(n,r)=>r==="string"||e&&r==="undefined"?n.value:+n.value,set:(n,r)=>{n.value=`${r}`},events:t}),Ln=/^data:(?[^;]+);base64,(?.*)$/,Vt=Symbol("empty"),xn=(e,t,n,r,s,i)=>{let o=K(CSS.escape(n)),a=t?`[${o}]`:`[${o}="${CSS.escape(r)}"]`;if(i===void 0&&e instanceof HTMLInputElement&&e.type==="radio"){let f=[...document.querySelectorAll(a)].find(m=>m instanceof HTMLInputElement&&m.checked);f&&E([[r,f.value]],{ifMissing:!0})}if(!Array.isArray(i)||e instanceof HTMLSelectElement&&e.multiple)return E([[r,s.get(e,typeof i)]],{ifMissing:!0}),r;let c=document.querySelectorAll(a),l=[],u=0;for(let f of c){if(l.push([`${r}.${u}`,s.get(f,typeof(L(i,u)?i[u]:void 0))]),e===f)break;u++}return E(l,{ifMissing:!0}),`${r}.${u}`};p({name:"bind",requirement:"exclusive",apply({el:e,key:t,rawKey:n,mods:r,value:s,error:i}){let o=t!=null?C(t,r):s,a=r.get("prop"),c=r.get("event"),l=null;if(e instanceof HTMLInputElement)switch(e.type){case"range":case"number":l=at(!1,"input");break;case"checkbox":l={get:(d,g)=>d.value!=="on"?g==="boolean"?d.checked:d.checked?d.value:"":g==="string"?d.checked?d.value:"":d.checked,set:(d,g)=>{d.checked=typeof g=="string"?g===d.value:g},events:["input"]};break;case"radio":e.getAttribute("name")?.length||e.setAttribute("name",o),l={get:(d,g)=>d.checked?g==="number"?+d.value:d.value:Vt,set:(d,g)=>{d.checked=g===(typeof g=="number"?+d.value:d.value)},events:["input"]};break;case"file":{let d=()=>{let g=[...e.files||[]],b=[];Promise.all(g.map(h=>new Promise(G=>{let F=new FileReader;F.onload=()=>{if(typeof F.result!="string")throw i("InvalidFileResultType",{resultType:typeof F.result});let k=F.result.match(Ln);if(!k?.groups)throw i("InvalidDataUri",{result:F.result});b.push({name:h.name,contents:k.groups.contents,mime:k.groups.mime})},F.onloadend=()=>G(),F.readAsDataURL(h)}))).then(()=>{E([[o,b]])})};return e.addEventListener("change",d),()=>{e.removeEventListener("change",d)}}default:l=at(!0,"input")}else if(e instanceof HTMLSelectElement&&e.multiple){let d=new Map;l={get:g=>[...g.selectedOptions].map(b=>{let h=d.get(b.value);return h==="string"||h==null?b.value:+b.value}),set:(g,b)=>{for(let h of g.options)b.includes(h.value)?(d.set(h.value,"string"),h.selected=!0):b.includes(+h.value)?(d.set(h.value,"number"),h.selected=!0):h.selected=!1},events:["change"]}}else e instanceof HTMLSelectElement?l=at(!0,"change"):e instanceof HTMLTextAreaElement?l=$e("value","input"):e instanceof HTMLElement&&e.tagName.includes("-")?l="value"in e?$e("value","input","change"):Dt("value","input","change"):e instanceof HTMLElement&&"value"in e?l=$e("value","change"):l=Dt("value","change");if(!l)throw i("InvalidBindAdapter");let u=a&&[...a][0];if(a&&!u)throw i("BindPropNameMissing");if(u){let d=Lt(u);l=$e(d,...c?[...c]:l.events)}else c&&(l.events=[...c]);let f=oe(o),m=xn(e,t,n,o,l,f),y=()=>{let d=oe(m);if(d!=null){let g=l.get(e,typeof d);g!==Vt&&E([[m,g]])}};for(let d of l.events)e.addEventListener(d,y);e.addEventListener(ge,y);let v=A(()=>{l.set(e,oe(m))});return()=>{v();for(let d of l.events)e.removeEventListener(d,y);e.removeEventListener(ge,y)}}});p({name:"class",requirement:{value:"must"},returnsValue:!0,apply({key:e,el:t,mods:n,rx:r}){e&&=C(e,n,"kebab");let s,i=()=>{o.disconnect(),s=e?{[e]:r()}:r();for(let c in s){let l=c.split(/\s+/).filter(u=>u.length>0);if(s[c])for(let u of l)t.classList.contains(u)||t.classList.add(u);else for(let u of l)t.classList.contains(u)&&t.classList.remove(u)}o.observe(t,{attributeFilter:["class"]})},o=new MutationObserver(i),a=A(i);return()=>{o.disconnect(),a();for(let c in s){let l=c.split(/\s+/).filter(u=>u.length>0);for(let u of l)t.classList.remove(u)}}}});p({name:"computed",requirement:{value:"must"},returnsValue:!0,apply({key:e,mods:t,rx:n,error:r}){if(e)E([[C(e,t),_e(n)]]);else{let s=Object.assign({},n());te(s,i=>{if(typeof i=="function")return _e(i);throw r("ComputedExpectedFunction")}),D(s)}}});p({name:"effect",requirement:{key:"denied",value:"must"},apply:({rx:e})=>A(e)});p({name:"indicator",requirement:"exclusive",apply({el:e,key:t,mods:n,value:r}){let s=t!=null?C(t,n):r,i=0;E([[s,!1]]);let o=a=>{let{type:c,el:l}=a.detail;if(l===e)switch(c){case it:i++,E([[s,!0]]);break;case ot:i=Math.max(0,i-1),E([[s,i>0]]);break}};return document.addEventListener(U,o),()=>{i=0,E([[s,!1]]),document.removeEventListener(U,o)}}});var Y=e=>{if(!e||e.size<=0)return 0;for(let t of e){if(t.endsWith("ms"))return+t.replace("ms","");if(t.endsWith("s"))return+t.replace("s","")*1e3;try{return Number.parseFloat(t)}catch{}}return 0},se=(e,t,n=!1)=>e?e.has(t.toLowerCase()):n,$t=(e,t="")=>{if(e&&e.size>0)for(let n of e)return n;return t};var ct=(e,t)=>(...n)=>{setTimeout(()=>{e(...n)},t)},qt=(e,t,n=!0,r=!1,s=!1)=>{let i=null,o=0;return(...a)=>{n&&!o?(e(...a),i=null):i=a,(!o||s)&&(o&&clearTimeout(o),o=setTimeout(()=>{r&&i!==null&&e(...i),i=null,o=0},t))}},le=(e,t)=>{let n=t.get("delay");if(n){let i=Y(n);e=ct(e,i)}let r=t.get("debounce");if(r){let i=Y(r),o=se(r,"leading",!1),a=!se(r,"notrailing",!1);e=qt(e,i,o,a,!0)}let s=t.get("throttle");if(s){let i=Y(s),o=!se(s,"noleading",!1),a=se(s,"trailing",!1);e=qt(e,i,o,a)}return e};var qe=(e=document.documentElement)=>"startViewTransition"in e,X=(e,t)=>{if(t.has("viewtransition")&&qe()){let n=e;e=(...r)=>document.startViewTransition(()=>n(...r))}return e};p({name:"init",requirement:{key:"denied",value:"must"},apply({rx:e,mods:t}){let n=()=>{x();try{e()}finally{N()}};n=X(n,t);let r=0,s=t.get("delay");s&&(r=Y(s),r>0&&(n=ct(n,r))),n()}});p({name:"json-signals",requirement:{key:"denied"},apply({el:e,value:t,mods:n}){let r=n.has("terse")?0:2,s={};t&&(s=ce(t));let i=()=>{o.disconnect(),e.textContent=JSON.stringify(q(s),null,r),o.observe(e,{childList:!0,characterData:!0,subtree:!0})},o=new MutationObserver(i),a=A(i);return()=>{o.disconnect(),a()}}});p({name:"on",requirement:"must",argNames:["evt"],apply({el:e,key:t,mods:n,rx:r}){let s=e;n.has("window")?s=window:n.has("document")&&(s=document);let i=l=>{x();try{r(l)}finally{N()}};i=X(i,n),i=le(i,n);let o=C(t,n,"kebab"),a={capture:n.has("capture"),passive:n.has("passive"),once:n.has("once")};if(n.has("outside")){s=document;let l=i;i=u=>{e.contains(u?.target)||l(u)}}(o===U||o===ee)&&(s=document);let c=l=>{l&&(n.has("prevent")&&l.preventDefault(),n.has("stop")&&l.stopPropagation(),e instanceof HTMLFormElement&&o==="submit"&&l.preventDefault()),i(l)};return s.addEventListener(o,c,a),()=>{s.removeEventListener(o,c,a)}}});var Gt=(e,t,n)=>Math.max(t,Math.min(n,e));var lt=new WeakSet;p({name:"on-intersect",requirement:{key:"denied",value:"must"},apply({el:e,mods:t,rx:n}){let r=()=>{x();try{n()}finally{N()}};r=X(r,t),r=le(r,t);let s={threshold:0};if(t.has("full"))s.threshold=1;else if(t.has("half"))s.threshold=.5;else{let a=t.get("threshold");a&&(s.threshold=Gt(Number($t(a)),0,100)/100)}let i=t.has("exit"),o=new IntersectionObserver(a=>{for(let c of a)c.isIntersecting!==i&&(r(),o&<.has(e)&&o.disconnect())},s);return o.observe(e),t.has("once")&<.add(e),()=>{t.has("once")||lt.delete(e),o&&(o.disconnect(),o=null)}}});p({name:"on-interval",requirement:{key:"denied",value:"must"},apply({mods:e,rx:t}){let n=()=>{x();try{t()}finally{N()}};n=X(n,e);let r=1e3,s=e.get("duration");s&&(r=Y(s),se(s,"leading",!1)&&n());let i=setInterval(n,r);return()=>{clearInterval(i)}}});p({name:"on-signal-patch",requirement:{value:"must"},argNames:["patch"],returnsValue:!0,apply({el:e,key:t,mods:n,rx:r,error:s}){if(t&&t!=="filter")throw s("KeyNotAllowed");let i=K(`${this.name}-filter`),o=e.getAttribute(i),a={};o&&(a=ce(o));let c=!1,l=le(u=>{if(c)return;P();let f=q(a,u.detail);if(O(),!gt(f)){c=!0,x();try{r(f)}finally{N(),c=!1}}},n);return document.addEventListener(ee,l),()=>{document.removeEventListener(ee,l)}}});p({name:"ref",requirement:"exclusive",apply({el:e,key:t,mods:n,value:r}){let s=t!=null?C(t,n):r;E([[s,e]])}});var jt="none",Bt="display";p({name:"show",requirement:{key:"denied",value:"must"},returnsValue:!0,apply({el:e,rx:t}){let n=()=>{r.disconnect(),t()?e.style.display===jt&&e.style.removeProperty(Bt):e.style.setProperty(Bt,jt),r.observe(e,{attributeFilter:["style"]})},r=new MutationObserver(n),s=A(n);return()=>{r.disconnect(),s()}}});p({name:"signals",returnsValue:!0,apply({key:e,mods:t,rx:n}){let r=t.has("ifmissing");if(e){e=C(e,t);let s=n?.();E([[e,s]],{ifMissing:r})}else{let s=Object.assign({},n?.());D(s,{ifMissing:r})}}});p({name:"style",requirement:{value:"must"},returnsValue:!0,apply({key:e,el:t,rx:n}){let{style:r}=t,s=new Map,i=(l,u)=>{let f=s.get(l);!u&&u!==0?f!==void 0&&(f?r.setProperty(l,f):r.removeProperty(l)):(f===void 0&&s.set(l,r.getPropertyValue(l)),r.setProperty(l,String(u)))},o=()=>{if(a.disconnect(),e)i(e,n());else{let l=n();for(let[u,f]of s)u in l||(f?r.setProperty(u,f):r.removeProperty(u));for(let u in l)i(ae(u),l[u])}a.observe(t,{attributeFilter:["style"]})},a=new MutationObserver(o),c=A(o);return()=>{a.disconnect(),c();for(let[l,u]of s)u?r.setProperty(l,u):r.removeProperty(l)}}});p({name:"text",requirement:{key:"denied",value:"must"},returnsValue:!0,apply({el:e,rx:t}){let n=()=>{r.disconnect(),e.textContent=`${t()}`,r.observe(e,{childList:!0,characterData:!0,subtree:!0})},r=new MutationObserver(n),s=A(n);return()=>{r.disconnect(),s()}}});var Wt=(e,t)=>e.includes(t),Nn=["remove","outer","inner","replace","prepend","append","before","after"],Pn=["html","svg","mathml"];Se({name:"datastar-patch-elements",apply(e,t){let n=typeof t.selector=="string"?t.selector:"",r=typeof t.mode=="string"?t.mode:"outer",s=typeof t.namespace=="string"?t.namespace:"html",i=typeof t.useViewTransition=="string"&&t.useViewTransition.trim()==="true",o=typeof t.viewTransitionSelector=="string"?t.viewTransitionSelector:"",a=t.elements;if(!Wt(Nn,r))throw e.error("PatchElementsInvalidMode",{mode:r});if(!n&&r!=="outer"&&r!=="replace")throw e.error("PatchElementsExpectedSelector");if(!Wt(Pn,s))throw e.error("PatchElementsInvalidNamespace",{namespace:s});let c={selector:n,mode:r,namespace:s,elements:a};if(i&&qe()){let l=document.documentElement;if(o){let u=document.querySelector(o);u&&qe(u)&&(l=u)}l.startViewTransition(()=>Ut(e,c))}else Ut(e,c)}});var Ut=({error:e},{selector:t,mode:n,namespace:r,elements:s})=>{let i=document.createDocumentFragment(),o=typeof s!="string"&&!!s;if(typeof s=="string"){let a=s.replace(/]*>|>)([\s\S]*?)<\/svg>/gim,""),c=/<\/html>/.test(a),l=/<\/head>/.test(a),u=/<\/body>/.test(a),f=r==="svg"?"svg":r==="mathml"?"math":"",m=f?`<${f}>${s}`:s,y=new DOMParser().parseFromString(c||l||u?s:``,"text/html");if(c)i.appendChild(y.documentElement);else if(l&&u)i.appendChild(y.head),i.appendChild(y.body);else if(l)i.appendChild(y.head);else if(u)i.appendChild(y.body);else if(f){let v=y.querySelector("template").content.querySelector(f);for(let d of v.childNodes)i.appendChild(d)}else i=y.querySelector("template").content}else s&&(s instanceof DocumentFragment?i=s:s instanceof Element&&i.appendChild(s));if(!t&&(n==="outer"||n==="replace")){let a=Array.from(i.children);for(let c of a){let l;if(c instanceof HTMLHtmlElement)l=document.documentElement;else if(c instanceof HTMLBodyElement)l=document.body;else if(c instanceof HTMLHeadElement)l=document.head;else if(l=document.getElementById(c.id),!l){console.warn(e("PatchElementsNoTargetsFound"),{element:{id:c.id}});continue}Kt(n,c,[l],!0)}}else{let a=document.querySelectorAll(t);if(!a.length){console.warn(e("PatchElementsNoTargetsFound"),{selector:t});return}let c=o&&n!=="remove"?[a[0]]:a;c.length===1&&(o=!0),Kt(n,i,c,o)}},ft=new WeakSet;for(let e of document.querySelectorAll("script"))ft.add(e);var Yt=e=>{let t=e instanceof HTMLScriptElement?[e]:e.querySelectorAll("script");for(let n of t)if(!ft.has(n)){let r=document.createElement("script");for(let{name:s,value:i}of n.attributes)r.setAttribute(s,i);r.text=n.text,n.replaceWith(r),ft.add(r)}},Jt=(e,t,n,r)=>{let s=!1;for(let i of e){if(r&&s)break;let o=r?t:t.cloneNode(!0);Yt(o),i[n](o),s=!0}},Kt=(e,t,n,r)=>{switch(e){case"remove":for(let s of n)s.remove();break;case"outer":case"inner":{let s=!1;for(let i of n){if(r&&s)break;let o=r?t:t.cloneNode(!0);Cn(i,o,e),Yt(i);let a=i.closest("[data-scope-children]");a&&a.dispatchEvent(new CustomEvent(Ke,{bubbles:!1})),s=!0}}break;case"replace":Jt(n,t,"replaceWith",r);break;case"prepend":case"append":case"before":case"after":Jt(n,t,e,r)}},$=new Map,fe=new Set,ue=new Map,Re=new Set,Ge=document.createElement("div");Ge.hidden=!0;var we=K("ignore-morph"),On=`[${we}]`,Cn=(e,t,n="outer")=>{if(Z(e)&&Z(t)&&e.hasAttribute(we)&&t.hasAttribute(we)||e.parentElement?.closest(On))return;let r=document.createElement("div");r.append(t),document.body.insertAdjacentElement("afterend",Ge);let s=e.querySelectorAll("[id]");for(let{id:a,tagName:c}of s)ue.has(a)?Re.add(a):ue.set(a,c);e instanceof Element&&e.id&&(ue.has(e.id)?Re.add(e.id):ue.set(e.id,e.tagName)),fe.clear();let i=r.querySelectorAll("[id]");for(let{id:a,tagName:c}of i)fe.has(a)?Re.add(a):ue.get(a)===c&&fe.add(a);for(let a of Re)fe.delete(a);ue.clear(),Re.clear(),$.clear();let o=n==="outer"?e.parentElement:e;Zt(o,s),Zt(r,i),Xt(o,r,n==="outer"?e:null,e.nextSibling),Ge.remove()},Xt=(e,t,n=null,r=null)=>{e instanceof HTMLTemplateElement&&t instanceof HTMLTemplateElement&&(e=e.content,t=t.content),n??=e.firstChild;for(let s of t.childNodes){if(n&&n!==r){let i=Fn(s,n,r);if(i){if(i!==n){let o=n;for(;o&&o!==i;){let a=o;o=o.nextSibling,Qt(a)}}ut(i,s),n=i.nextSibling;continue}}if(s instanceof Element&&fe.has(s.id)){let i=document.getElementById(s.id),o=i;for(;o=o.parentNode;){let a=$.get(o);a&&(a.delete(s.id),a.size||$.delete(o))}en(e,i,n),ut(i,s),n=i.nextSibling;continue}if($.has(s)){let i=s.namespaceURI,o=s.tagName,a=i&&i!=="http://www.w3.org/1999/xhtml"?document.createElementNS(i,o):document.createElement(o);e.insertBefore(a,n),ut(a,s),n=a.nextSibling}else{let i=document.importNode(s,!0);e.insertBefore(i,n),n=i.nextSibling}}for(;n&&n!==r;){let s=n;n=n.nextSibling,Qt(s)}},Fn=(e,t,n)=>{let r=null,s=e.nextSibling,i=0,o=0,a=$.get(e)?.size||0,c=t;for(;c&&c!==n;){if(zt(c,e)){let l=!1,u=$.get(c),f=$.get(e);if(f&&u){for(let m of u)if(f.has(m)){l=!0;break}}if(l)return c;if(!r&&!$.has(c)){if(!a)return c;r=c}}if(o+=$.get(c)?.size||0,o>a)break;r===null&&s&&zt(c,s)&&(i++,s=s.nextSibling,i>=2&&(r=void 0)),c=c.nextSibling}return r||null},zt=(e,t)=>e.nodeType===t.nodeType&&e.tagName===t.tagName&&(!e.id||e.id===t.id),Qt=e=>{$.has(e)?en(Ge,e,null):e.parentNode?.removeChild(e)},en=(e,t,n)=>{if("moveBefore"in e){e.moveBefore(t,n);return}e.insertBefore(t,n)},Hn=K("preserve-attr"),ut=(e,t)=>{let n=t.nodeType;if(n===1){let r=e,s=t,i=r.hasAttribute("data-scope-children");if(r.hasAttribute(we)&&s.hasAttribute(we))return e;let o=(t.getAttribute(Hn)??"").split(" "),a=(l,u,f)=>{let m=u.hasAttribute(f);return l.hasAttribute(f)!==m&&!o.includes(f)?(l[f]=m,!0):!1},c=!1;if(r instanceof HTMLInputElement&&s instanceof HTMLInputElement&&s.type!=="file"){let l=s.getAttribute("value");r.getAttribute("value")!==l&&!o.includes("value")&&(r.value=l??"",c=!0),c=a(r,s,"checked")||c,a(r,s,"disabled")}else if(r instanceof HTMLTextAreaElement&&s instanceof HTMLTextAreaElement){let l=s.value;r.defaultValue!==l&&(r.value=l,c=!0)}else r instanceof HTMLOptionElement&&s instanceof HTMLOptionElement&&(c=a(r,s,"selected")||c);for(let{name:l,value:u}of s.attributes)r.getAttribute(l)!==u&&!o.includes(l)&&r.setAttribute(l,u);for(let{name:l}of Array.from(r.attributes))!s.hasAttribute(l)&&!o.includes(l)&&r.removeAttribute(l);c&&(r instanceof HTMLOptionElement?r.closest("select"):r)?.dispatchEvent(new Event(ge,{bubbles:!0})),i&&!r.hasAttribute("data-scope-children")&&r.setAttribute("data-scope-children",""),r instanceof HTMLTemplateElement&&s instanceof HTMLTemplateElement?r.innerHTML=s.innerHTML:r.isEqualNode(s)||Xt(r,s),i&&r.dispatchEvent(new CustomEvent(Ke,{bubbles:!1}))}return(n===8||n===3)&&e.nodeValue!==t.nodeValue&&(e.nodeValue=t.nodeValue),e},Zt=(e,t)=>{for(let n of t)if(fe.has(n.id)){let r=n;for(;r&&r!==e;){let s=$.get(r);s||(s=new Set,$.set(r,s)),s.add(n.id),r=r.parentElement}}};Se({name:"datastar-patch-signals",apply({error:e},{signals:t,onlyIfMissing:n}){if(typeof t!="string")throw e("PatchSignalsExpectedSignals");let r=typeof n=="string"&&n.trim()==="true";D(ce(t),{ifMissing:r})}});export{V as action,Ft as actions,p as attribute,x as beginBatch,_e as computed,A as effect,N as endBatch,q as filtered,oe as getPath,D as mergePatch,E as mergePaths,ne as root,ye as signal,P as startPeeking,O as stopPeeking,Se as watcher}; +//# sourceMappingURL=datastar.js.map