From 3e2bb2904273648b6a1950ed690e0794a636a31e Mon Sep 17 00:00:00 2001 From: Ben Croker Date: Mon, 4 May 2026 13:52:49 -0500 Subject: [PATCH 1/2] Fix retry logic --- bundles/datastar.js | 14 ++++---- bundles/datastar.js.map | 6 ++-- library/src/plugins/actions/fetch.ts | 50 +++++++++++++--------------- 3 files changed, 34 insertions(+), 36 deletions(-) diff --git a/bundles/datastar.js b/bundles/datastar.js index 2f673e5f..82c6adec 100644 --- a/bundles/datastar.js +++ b/bundles/datastar.js @@ -1,9 +1,9 @@ // Datastar v1.0.1 -var gt=/🖕JS_DS🚀/.source,We=gt.slice(0,5),Ue=gt.slice(4),W="datastar-fetch",ge="datastar-prop-change",ht="datastar-ready",Je="datastar-scope-children",te="datastar-signal-patch";var x=Object.hasOwn??Object.prototype.hasOwnProperty.call;var z=e=>e!==null&&typeof e=="object"&&(Object.getPrototypeOf(e)===Object.prototype||Object.getPrototypeOf(e)===null),yt=e=>{for(let t in e)if(x(e,t))return!1;return!0},ne=(e,t)=>{for(let n in e){let r=e[n];z(r)||Array.isArray(r)?ne(r,t):e[n]=t(r)}},Le=e=>{let t={};for(let[n,r]of e){let s=n.split("."),i=s.pop(),o=s.reduce((a,l)=>a[l]??={},t);o[i]=r}return t};var xe=[],Ke=[],He=0,Ne=0,ze=0,Ze,U,Pe=0,N=()=>{He++},P=()=>{--He||(Et(),Z())},_=e=>{Ze=U,U=e},k=()=>{U=Ze,Ze=void 0},he=e=>an.bind(0,{previousValue:e,t:e,e:1}),Qe=Symbol("computed"),_e=e=>{let t=cn.bind(0,{e:17,getter:e});return t[Qe]=1,t},w=e=>{let t={d:e,e:2};U&&Xe(t,U),_(t),N();try{t.d()}finally{P(),k()}return Rt.bind(0,t)},Et=()=>{for(;Ne"getter"in e?Tt(e):St(e,e.t),Tt=e=>{_(e),wt(e);try{let t=e.t;return t!==(e.t=e.getter(t))}finally{k(),Mt(e)}},St=(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):Ke[ze++]=e}},At=(e,t)=>{if(t&16||t&32&&Lt(e.s,e)){_(e),wt(e),N();try{e.d()}finally{P(),k(),Mt(e)}return}t&32&&(e.e=t&-33);let n=e.s;for(;n;){let r=n.c,s=r.e;s&64&&At(r,r.e=s&-65),n=n.i}},an=(e,...t)=>{if(t.length){if(e.t!==(e.t=t[0])){e.e=17;let r=e.r;return r&&(ln(r),He||Et()),!0}return!1}let n=e.t;if(e.e&16&&St(e,n)){let r=e.r;r&&Fe(r)}return U&&Xe(e,U),n},cn=e=>{let t=e.e;if(t&16||t&32&&Lt(e.s,e)){if(Tt(e)){let n=e.r;n&&Fe(n)}}else t&32&&(e.e=t&-33);return U&&Xe(e,U),e.t},Rt=e=>{let t=e.s;for(;t;)t=Ce(t,e);let n=e.r;n&&Ce(n),e.e=0},Xe=(e,t)=>{let n=t.a;if(n&&n.c===e)return;let r=n?n.i:t.s;if(r&&r.c===e){r.p=Pe,t.a=r;return}let s=e.m;if(s&&s.p===Pe&&s.o===t)return;let i=t.a=e.m={p:Pe,c:e,o:t,l:n,i:r,u:s};r&&(r.l=i),n?n.i=i:t.s=i,s?s.n=i:e.r=i},Ce=(e,t=e.o)=>{let n=e.c,r=e.l,s=e.i,i=e.n,o=e.u;if(s?s.l=r:t.a=r,r?r.i=s:t.s=s,i?i.u=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=Ce(a,n);while(a)}}else"previousValue"in n||Rt(n);return s},ln=e=>{let t=e.n,n;e:for(;;){let r=e.o,s=r.e;if(s&60?s&12?s&4?!(s&48)&&un(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,f:n},t=o);continue}}if(e=t){t=e.n;continue}for(;n;)if(e=n.t,n=n.f,e){t=e.n;continue e}break}},wt=e=>{Pe++,e.a=void 0,e.e=e.e&-57|4},Mt=e=>{let t=e.a,n=t?t.i:e.s;for(;n;)n=Ce(n,e);e.e&=-5},Lt=(e,t)=>{let n,r=0,s=!1;e:for(;;){let i=e.c,o=i.e;if(t.e&16)s=!0;else if((o&17)===17){if(vt(i)){let a=i.r;a.n&&Fe(a),s=!0}}else if((o&33)===33){(e.n||e.u)&&(n={t:e,f: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,l=a.n;if(l?(e=n.t,n=n.f):e=a,s){if(vt(t)){l&&Fe(a),t=e.o;continue}s=!1}else t.e&=-33;if(t=e.o,e.i){e=e.i;continue e}}return s}},Fe=e=>{do{let t=e.o,n=t.e;(n&48)===32&&(t.e=n|16,n&2&&Ye(t))}while(e=e.n)},un=(e,t)=>{let n=t.a;for(;n;){if(n===e)return!0;n=n.l}return!1},oe=e=>{let t=re,n=e.split(".");for(let r of n){if(t==null||!x(t,r))return;t=t[r]}return t},Oe=(e,t="")=>{let n=Array.isArray(e);if(n||z(e)){let r=n?[]:{};for(let i in e)r[i]=he(Oe(e[i],`${t+i}.`));let s=he(0);return new Proxy(r,{get(i,o){if(!(o==="toJSON"&&!x(r,o)))return n&&o in Array.prototype?(s(),r[o]):typeof o=="symbol"?r[o]:((!x(r,o)||r[o]()==null)&&(r[o]=he(""),Z(t+o,""),s(s()+1)),r[o]())},set(i,o,a){let l=t+o;if(n&&o==="length"){let c=r[o]-a;if(r[o]=a,c>0){let u={};for(let f=a;f{if(e!==void 0&&t!==void 0&&xe.push([e,t]),!He&&xe.length){let n=Le(xe);xe.length=0,document.dispatchEvent(new CustomEvent(te,{detail:n}))}},D=(e,{ifMissing:t}={})=>{N();for(let n in e)e[n]==null?t||delete re[n]:xt(e[n],n,re,"",t);P()},A=(e,t)=>D(Le(e),t),xt=(e,t,n,r,s)=>{if(z(e)){x(n,t)&&(z(n[t])||Array.isArray(n[t]))||(n[t]={});for(let i in e)e[i]==null?s||delete n[t][i]:xt(e[i],i,n[t],`${r+t}.`,s)}else s&&x(n,t)||(n[t]=e)},bt=e=>typeof e=="string"?RegExp(e.replace(/^\/|\/$/g,"")):e,q=({include:e=/.*/,exclude:t=/(?!)/}={},n=re)=>{let r=bt(e),s=bt(t),i=[],o=[[n,""]];for(;o.length;){let[a,l]=o.pop();for(let c in a){let u=l+c;z(a[c])?o.push([a[c],`${u}.`]):r.test(u)&&!s.test(u)&&i.push([u,oe(u)])}}return Le(i)},re=Oe({});var Q=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(),Nt=e=>ae(e).replace(/-./g,t=>t[1].toUpperCase()),Pt=e=>ae(e).replace(/-/g,"_");var fn=/^(?:(?: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(!fn.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})`)()}},Ot={camel:e=>e.replace(/-[a-z]/g,t=>t[1].toUpperCase()),snake:e=>e.replace(/-/g,"_"),pascal:e=>e[0].toUpperCase()+Ot.camel(e.slice(1))},O=(e,t,n="camel")=>{for(let r of t.get("case")||[n])e=Ot[r]?.(e)||e;return e},J=e=>`data-${e}`,et=e=>e;var dn="https://data-star.dev/errors",ye=(e,t,n={})=>{Object.assign(n,e);let r=new Error,s=Pt(t),i=new URLSearchParams({metadata:JSON.stringify(n)}).toString(),o=JSON.stringify(n,null,2);return r.message=`${t} -More info: ${dn}/${s}?${i} -Context: ${o}`,r},ve=new Map,tt=new Map,Ht=new Map,_t=new Proxy({},{get:(e,t)=>ve.get(t)?.apply,has:(e,t)=>ve.has(t),ownKeys:()=>Reflect.ownKeys(ve),set:()=>!1,deleteProperty:()=>!1}),Ee=new Map,ke=[],nt=new Set,be=new Set,Ct=!1,p=e=>{ke.push(e),ke.length===1&&setTimeout(()=>{for(let n of ke)nt.add(n.name),tt.set(n.name,n);ke.length=0;let t=be.size?[...be]:[document.documentElement];for(let n of t)bn(n,!be.has(n));nt.clear()})},I=e=>{ve.set(e.name,e)};document.addEventListener(W,e=>{let t=Ht.get(e.detail.type);t&&t.apply({error:ye.bind(0,{plugin:{type:"watcher",name:t.name},element:{id:e.target.id,tag:e.target.tagName}})},e.detail.argsRaw)});var Te=e=>{Ht.set(e.name,e)},Ft=e=>{for(let t of e){let n=Ee.get(t);if(n&&Ee.delete(t))for(let r of n.values())for(let s of r.values())s()}},kt=J("ignore"),pn=`[${kt}]`,Dt=e=>e.hasAttribute(`${kt}__self`)||!!e.closest(pn),De=(e,t)=>{for(let n of e)if(!Dt(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)}}},mn=e=>{for(let{target:t,type:n,attributeName:r,addedNodes:s,removedNodes:i}of e)if(n==="childList"){for(let o of i)Q(o)&&(Ft([o]),Ft(o.querySelectorAll("*")));for(let o of s)Q(o)&&(De([o]),De(o.querySelectorAll("*")))}else if(n==="attributes"&&r.startsWith("data-")&&Q(t)&&!Dt(t)){let o=r.slice(5),a=et(o);if(!a)continue;let l=t.getAttribute(r);if(l===null){let c=Ee.get(t);if(c){let u=c.get(a);if(u){for(let f of u.values())f();c.delete(a)}}}else rt(t,o,l)}},gn=new MutationObserver(mn),hn=e=>{let[t,...n]=e.split("__"),[r,s]=t.split(/:(.+)/),i=new Map;for(let o of n){let[a,...l]=o.split(".");i.set(a,new Set(l))}return{pluginName:r,key:s,mods:i}},yn=()=>be.has(document.documentElement),vn=()=>{Ct||!yn()||(Ct=!0,document.dispatchEvent(new Event(ht)))},bn=(e=document.documentElement,t=!0)=>{Q(e)&&De([e],!0),De(e.querySelectorAll("*"),!0),t&&(gn.observe(e,{subtree:!0,childList:!0,attributes:!0}),be.add(e),vn())};var rt=(e,t,n,r)=>{let s=et(t);if(!s)return;let{pluginName:i,key:o,mods:a}=hn(s),l=tt.get(i);if((!r||nt.has(i))&&!!l){let u={el:e,rawKey:s,mods:a,error:ye.bind(0,{plugin:{type:"attribute",name:l.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=l.requirement&&(typeof l.requirement=="string"?l.requirement:l.requirement.key)||"allowed",m=l.requirement&&(typeof l.requirement=="string"?l.requirement:l.requirement.value)||"allowed",h=o!=null&&o!=="",b=n!=null&&n!=="";if(h){if(f==="denied")throw u.error("KeyNotAllowed")}else if(f==="must")throw u.error("KeyRequired");if(b){if(m==="denied")throw u.error("ValueNotAllowed")}else if(m==="must")throw u.error("ValueRequired");if(f==="exclusive"||m==="exclusive"){if(h&&b)throw u.error("KeyAndValueProvided");if(!h&&!b)throw u.error("KeyOrValueRequired")}let d=new Map;if(b){let y;u.rx=(...G)=>(y||(y=En(n,{returnsValue:l.returnsValue,argNames:l.argNames,cleanups:d})),y(e,...G))}let g=l.apply(u);g&&d.set("attribute",g);let E=Ee.get(e);if(E){let y=E.get(s);if(y)for(let G of y.values())G()}else E=new Map,Ee.set(e,E);E.set(s,d)}},En=(e,{returnsValue:t=!1,argNames:n=[],cleanups:r=new Map}={})=>{let s="";if(t){let l=/(\/(\\\/|[^/])*\/|"(\\"|[^"])*"|'(\\'|[^'])*'|`(\\`|[^`])*`|\(\s*((function)\s*\(\s*\)|(\(\s*\))\s*=>)\s*(?:\{[\s\S]*?\}|[^;){]*)\s*\)\s*\(\s*\)|[^;])+/gm,c=e.trim().match(l);if(c){let u=c.length-1,f=c[u].trim();f.startsWith("return")||(c[u]=`return (${f});`),s=c.join(`; -`)}}else s=e.trim();let i=new Map,o=RegExp(`(?:${We})(.*?)(?:${Ue})`,"gm"),a=0;for(let l of s.matchAll(o)){let c=l[1],u=`__escaped${a++}`;i.set(u,c),s=s.replace(We+c+Ue,u)}s=s.replace(/("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|`(?:\\.|[^`\\$]|\$(?!\{))*`)|\$\{([^{}]*)\}|\$([a-zA-Z_\d]\w*(?:[.-]\w+)*)/g,(l,c,u,f)=>c?l:u!==void 0?`\${${u.replace(/\$([a-zA-Z_\d]\w*(?:[.-]\w+)*)/g,(m,h)=>h.split(".").reduce((b,d)=>`${b}['${d}']`,"$"))}}`:f.split(".").reduce((m,h)=>`${m}['${h}']`,"$")),s=s.replaceAll(/@([A-Za-z_$][\w$]*)\(/g,'__action("$1",evt,');for(let[l,c]of i)s=s.replace(l,c);try{let l=Function("el","$","__action","evt",...n,s);return(c,...u)=>{let f=(m,h,...b)=>{let d=ye.bind(0,{plugin:{type:"action",name:m},element:{id:c.id,tag:c.tagName},expression:{fnContent:s,value:e}}),g=_t[m];if(g)return g({el:c,evt:h,error:d,cleanups:r},...b);throw d("UndefinedAction")};try{return l(c,re,f,void 0,...u)}catch(m){throw console.error(m),ye({element:{id:c.id,tag:c.tagName},expression:{fnContent:s,value:e},error:m.message},"ExecuteExpression")}}}catch(l){throw console.error(l),ye({expression:{fnContent:s,value:e},error:l.message},"GenerateExpression")}};I({name:"peek",apply(e,t){_();try{return t()}finally{k()}}});I({name:"setAll",apply(e,t,n){_();let r=q(n);ne(r,()=>t),D(r),k()}});I({name:"toggleAll",apply(e,t){_();let n=q(t);ne(n,r=>!r),D(n),k()}});var It=new WeakMap,st=e=>!["GET","DELETE"].includes(e),Se=(e,t,n=!0)=>I({name:e,apply:async({el:r,evt:s,error:i,cleanups:o},a,{selector:l,headers:c,contentType:u="json",filterSignals:{include:f=/.*/,exclude:m=/(^|\.)_/}={},openWhenHidden:h=n,payload:b,requestCancellation:d="auto",retry:g="auto",retryInterval:E=1e3,retryScaler:y=2,retryMaxWait:G=3e4,retryMaxCount:F=10}={})=>{let $=d instanceof AbortController?d:new AbortController;(d==="auto"||d==="cleanup")&&(It.get(r)?.abort(),It.set(r,$)),d==="cleanup"&&(o.get(`@${e}`)?.(),o.set(`@${e}`,async()=>{$.abort(),await Promise.resolve()}));let ee=()=>{};try{if(!a?.length)throw i("FetchNoUrlProvided",{action:I});let de={Accept:"text/event-stream, text/html, application/json","Datastar-Request":!0};u==="json"&&st(t)&&(de["Content-Type"]="application/json");let j=Object.assign({},de,c),C={input:"",method:t,headers:j,openWhenHidden:h,retry:g,retryInterval:E,retryScaler:y,retryMaxWait:G,retryMaxCount:F,signal:$.signal,onopen:async v=>{v.status>=400&&se(Tn,r,{status:v.status.toString()})},onmessage:v=>{if(!v.event.startsWith("datastar"))return;let K=v.event,R={};for(let T of v.data.split(` -`)){let S=T.indexOf(" "),H=T.slice(0,S),M=T.slice(S+1);(R[H]||=[]).push(M)}let L=Object.fromEntries(Object.entries(R).map(([T,S])=>[T,S.join(` -`)]));se(K,r,L)},onerror:v=>{if(Vt(v))throw v("FetchExpectedTextEventStream",{url:a});v&&(console.error(v.message),se(Sn,r,{message:v.message}))}},$e=()=>{let v=new URL(a,document.baseURI),K=new URLSearchParams(v.search);if(u==="json"){_();let R=b!==void 0?b:q({include:f,exclude:m});k();let L=JSON.stringify(R);st(t)?C.body=L:K.set("datastar",L)}else if(u==="form"){let R=l?document.querySelector(l):r.closest("form");if(!R)throw i("FetchFormNotFound",{action:I,selector:l});if(!R.noValidate&&!R.checkValidity()){R.reportValidity();return}let L=new FormData(R),T=r;if(r===R&&s instanceof SubmitEvent)T=s.submitter;else{let M=pe=>pe.preventDefault();R.addEventListener("submit",M),ee=()=>{R.removeEventListener("submit",M)}}if(T instanceof HTMLButtonElement||T instanceof HTMLInputElement&&T.type==="submit"){let M=T.getAttribute("name");M&&L.append(M,T.value)}let S=R.getAttribute("enctype")==="multipart/form-data";S||(j["Content-Type"]="application/x-www-form-urlencoded");let H=new URLSearchParams(L);if(st(t))S?C.body=L:C.body=H;else for(let[M,pe]of H)K.append(M,pe)}else throw i("FetchInvalidContentType",{action:I,contentType:u});return v.search=K.toString(),C.input=v.toString(),C};se(it,r,{});try{await xn(r,$e)}catch(v){if(!Vt(v))throw i("FetchFailed",{method:t,url:a,error:v.message})}}finally{se(ot,r,{}),ee(),o.delete(`@${e}`)}}});Se("get","GET",!1);Se("patch","PATCH");Se("post","POST");Se("put","PUT");Se("delete","DELETE");var it="started",ot="finished",Tn="error",Sn="retrying",An="retries-failed",se=(e,t,n)=>document.dispatchEvent(new CustomEvent(W,{detail:{type:e,el:t,argsRaw:n}})),Vt=e=>`${e}`.includes("text/event-stream"),Rn=async(e,t)=>{let n=e.getReader(),r=await n.read();for(;!r.done;)t(r.value),r=await n.read()},wn=e=>{let t,n,r,s=!1;return i=>{t?t=Ln(t,i):(t=i,n=0,r=-1);let o=t.length,a=0;for(;n{let r=$t(),s=new TextDecoder;return(i,o)=>{if(!i.length)n?.(r),r=$t();else if(o>0){let a=s.decode(i.subarray(0,o)),l=o+(i[o+1]===32?2:1),c=s.decode(i.subarray(l));switch(a){case"data":r.data=r.data?`${r.data} -${c}`:c;break;case"event":r.event=c;break;case"id":e(r.id=c);break;case"retry":{let u=+c;Number.isNaN(u)||t(r.retry=u);break}}}}},Ln=(e,t)=>{let n=new Uint8Array(e.length+t.length);return n.set(e),n.set(t,e.length),n},$t=()=>({data:"",event:"",id:"",retry:void 0}),xn=(e,t)=>new Promise((n,r)=>{let s=t();if(!s)return;let{input:i,signal:o,headers:a,onopen:l,onmessage:c,onclose:u,onerror:f,openWhenHidden:m,fetch:h,retry:b="auto",retryInterval:d=1e3,retryScaler:g=2,retryMaxWait:E=3e4,retryMaxCount:y=10,responseOverrides:G,...F}=s,$={...a},ee,de=()=>{if(ee.abort(),!document.hidden){let T=t();if(!T)return;i=T.input,F.body=T.body,L()}};m||document.addEventListener("visibilitychange",de);let j,C=()=>{document.removeEventListener("visibilitychange",de),clearTimeout(j),ee.abort()};o?.addEventListener("abort",()=>{C(),n()});let $e=h||window.fetch,v=l||(()=>{}),K=0,R=d,L=async()=>{ee=new AbortController;let T=ee.signal;try{let S=await $e(i,{...F,headers:$,signal:T});await v(S);let H=async(B,me,Ge,we,...on)=>{let mt={[Ge]:await me.text()};for(let je of on){let Be=me.headers.get(`datastar-${ae(je)}`);if(we){let Me=we[je];Me&&(Be=typeof Me=="string"?Me:JSON.stringify(Me))}Be&&(mt[je]=Be)}se(B,e,mt),C(),n()},M=S.status,pe=M===204,pt=M>=300&&M<400,sn=M>=400&&M<600;if(M!==200){if(u?.(),b!=="never"&&!pe&&!pt&&(b==="always"||b==="error"&&sn)){clearTimeout(j),j=setTimeout(L,d);return}C(),n();return}K=0,d=R;let qe=S.headers.get("Content-Type");if(qe?.includes("text/html"))return await H("datastar-patch-elements",S,"elements",G,"selector","mode","namespace","useViewTransition");if(qe?.includes("application/json"))return await H("datastar-patch-signals",S,"signals",G,"onlyIfMissing");if(qe?.includes("text/javascript")){let B=document.createElement("script"),me=S.headers.get("datastar-script-attributes");if(me)for(let[Ge,we]of Object.entries(JSON.parse(me)))B.setAttribute(Ge,we);B.textContent=await S.text(),document.head.appendChild(B),C();return}if(await Rn(S.body,wn(Mn(B=>{B?$["last-event-id"]=B:delete $["last-event-id"]},B=>{R=d=B},c))),u?.(),b==="always"&&!pt){clearTimeout(j),j=setTimeout(L,d);return}C(),n()}catch(S){if(!T.aborted)try{let H=f?.(S)||d;clearTimeout(j),j=setTimeout(L,H),d=Math.min(d*g,E),++K>=y?(se(An,e,{}),C(),r("Max retries reached.")):console.error(`Datastar failed to reach ${i.toString()} retrying in ${H}ms.`)}catch(H){C(),r(H)}}};L()});p({name:"attr",requirement:{value:"must"},returnsValue:!0,apply({el:e,key:t,rx:n}){let r=(a,l)=>{l===""||l===!0?e.setAttribute(a,""):l===!1||l==null?e.removeAttribute(a):typeof l=="string"?e.setAttribute(a,l):typeof l=="function"?e.setAttribute(a,l.toString()):e.setAttribute(a,JSON.stringify(l,(c,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(),l=Object.keys(a);for(let c of l)r(c,a[c]);i.observe(e,{attributeFilter:l})},i=new MutationObserver(s),o=w(s);return()=>{i.disconnect(),o()}}});var Ie=(e,...t)=>({get:n=>n[e],set:(n,r)=>{n[e]=r},events:t}),qt=(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}),Nn=/^data:(?[^;]+);base64,(?.*)$/,Gt=Symbol("empty"),Pn=(e,t,n,r,s,i)=>{let o=J(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&&A([[r,f.value]],{ifMissing:!0})}if(!Array.isArray(i)||e instanceof HTMLSelectElement&&e.multiple)return A([[r,s.get(e,typeof i)]],{ifMissing:!0}),r;let l=document.querySelectorAll(a),c=[],u=0;for(let f of l){if(c.push([`${r}.${u}`,s.get(f,typeof(x(i,u)?i[u]:void 0))]),e===f)break;u++}return A(c,{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?O(t,r):s,a=r.get("prop"),l=r.get("event"),c=null;if(e instanceof HTMLInputElement)switch(e.type){case"range":case"number":c=at(!1,"input");break;case"checkbox":c={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),c={get:(d,g)=>d.checked?g==="number"?+d.value:d.value:Gt,set:(d,g)=>{d.checked=g===(typeof g=="number"?+d.value:d.value)},events:["input"]};break;case"file":{let d=()=>{let g=[...e.files||[]],E=[];Promise.all(g.map(y=>new Promise(G=>{let F=new FileReader;F.onload=()=>{if(typeof F.result!="string")throw i("InvalidFileResultType",{resultType:typeof F.result});let $=F.result.match(Nn);if(!$?.groups)throw i("InvalidDataUri",{result:F.result});E.push({name:y.name,contents:$.groups.contents,mime:$.groups.mime})},F.onloadend=()=>G(),F.readAsDataURL(y)}))).then(()=>{A([[o,E]])})};return e.addEventListener("change",d),()=>{e.removeEventListener("change",d)}}default:c=at(!0,"input")}else if(e instanceof HTMLSelectElement&&e.multiple){let d=new Map;c={get:g=>[...g.selectedOptions].map(E=>{let y=d.get(E.value);return y==="string"||y==null?E.value:+E.value}),set:(g,E)=>{for(let y of g.options)E.includes(y.value)?(d.set(y.value,"string"),y.selected=!0):E.includes(+y.value)?(d.set(y.value,"number"),y.selected=!0):y.selected=!1},events:["change"]}}else e instanceof HTMLSelectElement?c=at(!0,"change"):e instanceof HTMLTextAreaElement?c=Ie("value","input"):e instanceof HTMLElement&&e.tagName.includes("-")?c="value"in e?Ie("value","input","change"):qt("value","input","change"):e instanceof HTMLElement&&"value"in e?c=Ie("value","change"):c=qt("value","change");if(!c)throw i("InvalidBindAdapter");let u=a&&[...a][0];if(a&&!u)throw i("BindPropNameMissing");if(u){let d=Nt(u);c=Ie(d,...l?[...l]:c.events)}else l&&(c.events=[...l]);let f=oe(o),m=Pn(e,t,n,o,c,f),h=()=>{let d=oe(m);if(d!=null){let g=c.get(e,typeof d);g!==Gt&&A([[m,g]])}};for(let d of c.events)e.addEventListener(d,h);e.addEventListener(ge,h);let b=w(()=>{c.set(e,oe(m))});return()=>{b();for(let d of c.events)e.removeEventListener(d,h);e.removeEventListener(ge,h)}}});p({name:"class",requirement:{value:"must"},returnsValue:!0,apply({key:e,el:t,mods:n,rx:r}){e&&=O(e,n,"kebab");let s,i=()=>{o.disconnect(),s=e?{[e]:r()}:r();for(let l in s){let c=l.split(/\s+/).filter(u=>u.length>0);if(s[l])for(let u of c)t.classList.contains(u)||t.classList.add(u);else for(let u of c)t.classList.contains(u)&&t.classList.remove(u)}o.observe(t,{attributeFilter:["class"]})},o=new MutationObserver(i),a=w(i);return()=>{o.disconnect(),a();for(let l in s){let c=l.split(/\s+/).filter(u=>u.length>0);for(let u of c)t.classList.remove(u)}}}});p({name:"computed",requirement:{value:"must"},returnsValue:!0,apply({key:e,mods:t,rx:n,error:r}){if(e)A([[O(e,t),_e(n)]]);else{let s=Object.assign({},n());ne(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})=>w(e)});p({name:"indicator",requirement:"exclusive",apply({el:e,key:t,mods:n,value:r}){let s=t!=null?O(t,n):r,i=0;A([[s,!1]]);let o=a=>{let{type:l,el:c}=a.detail;if(c===e)switch(l){case it:i++,A([[s,!0]]);break;case ot:i=Math.max(0,i-1),A([[s,i>0]]);break}};return document.addEventListener(W,o),()=>{i=0,A([[s,!1]]),document.removeEventListener(W,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},ie=(e,t,n=!1)=>e?e.has(t.toLowerCase()):n,jt=(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)},Bt=(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=ie(r,"leading",!1),a=!ie(r,"notrailing",!1);e=Bt(e,i,o,a,!0)}let s=t.get("throttle");if(s){let i=Y(s),o=!ie(s,"noleading",!1),a=ie(s,"trailing",!1);e=Bt(e,i,o,a)}return e};var lt=!!document.startViewTransition,X=(e,t)=>{if(t.has("viewtransition")&<){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=()=>{N(),e(),P()};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=w(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=c=>{N(),r(c),P()};i=X(i,n),i=le(i,n);let o=O(t,n,"kebab"),a={capture:n.has("capture"),passive:n.has("passive"),once:n.has("once")};if(n.has("outside")){s=document;let c=i;i=u=>{e.contains(u?.target)||c(u)}}(o===W||o===te)&&(s=document);let l=c=>{c&&(n.has("prevent")&&c.preventDefault(),n.has("stop")&&c.stopPropagation(),e instanceof HTMLFormElement&&o==="submit"&&c.preventDefault()),i(c)};return s.addEventListener(o,l,a),()=>{s.removeEventListener(o,l,a)}}});var Wt=(e,t,n)=>Math.max(t,Math.min(n,e));var ut=new WeakSet;p({name:"on-intersect",requirement:{key:"denied",value:"must"},apply({el:e,mods:t,rx:n}){let r=()=>{N(),n(),P()};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=Wt(Number(jt(a)),0,100)/100)}let i=t.has("exit"),o=new IntersectionObserver(a=>{for(let l of a)l.isIntersecting!==i&&(r(),o&&ut.has(e)&&o.disconnect())},s);return o.observe(e),t.has("once")&&ut.add(e),()=>{t.has("once")||ut.delete(e),o&&(o.disconnect(),o=null)}}});p({name:"on-interval",requirement:{key:"denied",value:"must"},apply({mods:e,rx:t}){let n=()=>{N(),t(),P()};n=X(n,e);let r=1e3,s=e.get("duration");s&&(r=Y(s),ie(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=J(`${this.name}-filter`),o=e.getAttribute(i),a={};o&&(a=ce(o));let l=!1,c=le(u=>{if(l)return;let f=q(a,u.detail);if(!yt(f)){l=!0,N();try{r(f)}finally{P(),l=!1}}},n);return document.addEventListener(te,c),()=>{document.removeEventListener(te,c)}}});p({name:"ref",requirement:"exclusive",apply({el:e,key:t,mods:n,value:r}){let s=t!=null?O(t,n):r;A([[s,e]])}});var Ut="none",Jt="display";p({name:"show",requirement:{key:"denied",value:"must"},returnsValue:!0,apply({el:e,rx:t}){let n=()=>{r.disconnect(),t()?e.style.display===Ut&&e.style.removeProperty(Jt):e.style.setProperty(Jt,Ut),r.observe(e,{attributeFilter:["style"]})},r=new MutationObserver(n),s=w(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=O(e,t);let s=n?.();A([[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=(c,u)=>{let f=s.get(c);!u&&u!==0?f!==void 0&&(f?r.setProperty(c,f):r.removeProperty(c)):(f===void 0&&s.set(c,r.getPropertyValue(c)),r.setProperty(c,String(u)))},o=()=>{if(a.disconnect(),e)i(e,n());else{let c=n();for(let[u,f]of s)u in c||(f?r.setProperty(u,f):r.removeProperty(u));for(let u in c)i(ae(u),c[u])}a.observe(t,{attributeFilter:["style"]})},a=new MutationObserver(o),l=w(o);return()=>{a.disconnect(),l();for(let[c,u]of s)u?r.setProperty(c,u):r.removeProperty(c)}}});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=w(n);return()=>{r.disconnect(),s()}}});var Kt=(e,t)=>e.includes(t),On=["remove","outer","inner","replace","prepend","append","before","after"],Cn=["html","svg","mathml"];Te({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:"",o=t.elements;if(!Kt(On,r))throw e.error("PatchElementsInvalidMode",{mode:r});if(!n&&r!=="outer"&&r!=="replace")throw e.error("PatchElementsExpectedSelector");if(!Kt(Cn,s))throw e.error("PatchElementsInvalidNamespace",{namespace:s});let a={selector:n,mode:r,namespace:s,useViewTransition:i.trim()==="true",elements:o};lt&&a.useViewTransition?document.startViewTransition(()=>zt(e,a)):zt(e,a)}});var zt=({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,""),l=/<\/html>/.test(a),c=/<\/head>/.test(a),u=/<\/body>/.test(a),f=r==="svg"?"svg":r==="mathml"?"math":"",m=f?`<${f}>${s}`:s,h=new DOMParser().parseFromString(l||c||u?s:``,"text/html");if(l)i.appendChild(h.documentElement);else if(c&&u)i.appendChild(h.head),i.appendChild(h.body);else if(c)i.appendChild(h.head);else if(u)i.appendChild(h.body);else if(f){let b=h.querySelector("template").content.querySelector(f);for(let d of b.childNodes)i.appendChild(d)}else i=h.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 l of a){let c;if(l instanceof HTMLHtmlElement)c=document.documentElement;else if(l instanceof HTMLBodyElement)c=document.body;else if(l instanceof HTMLHeadElement)c=document.head;else if(c=document.getElementById(l.id),!c){console.warn(e("PatchElementsNoTargetsFound"),{element:{id:l.id}});continue}Qt(n,l,[c],!0)}}else{let a=document.querySelectorAll(t);if(!a.length){console.warn(e("PatchElementsNoTargetsFound"),{selector:t});return}let l=o&&n!=="remove"?[a[0]]:a;l.length===1&&(o=!0),Qt(n,i,l,o)}},dt=new WeakSet;for(let e of document.querySelectorAll("script"))dt.add(e);var tn=e=>{let t=e instanceof HTMLScriptElement?[e]:e.querySelectorAll("script");for(let n of t)if(!dt.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),dt.add(r)}},Zt=(e,t,n,r)=>{let s=!1;for(let i of e){if(r&&s)break;let o=r?t:t.cloneNode(!0);tn(o),i[n](o),s=!0}},Qt=(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);Hn(i,o,e),tn(i);let a=i.closest("[data-scope-children]");a&&a.dispatchEvent(new CustomEvent(Je,{bubbles:!1})),s=!0}}break;case"replace":Zt(n,t,"replaceWith",r);break;case"prepend":case"append":case"before":case"after":Zt(n,t,e,r)}},V=new Map,fe=new Set,ue=new Map,Ae=new Set,Ve=document.createElement("div");Ve.hidden=!0;var Re=J("ignore-morph"),Fn=`[${Re}]`,Hn=(e,t,n="outer")=>{if(Q(e)&&Q(t)&&e.hasAttribute(Re)&&t.hasAttribute(Re)||e.parentElement?.closest(Fn))return;let r=document.createElement("div");r.append(t),document.body.insertAdjacentElement("afterend",Ve);let s=e.querySelectorAll("[id]");for(let{id:a,tagName:l}of s)ue.has(a)?Ae.add(a):ue.set(a,l);e instanceof Element&&e.id&&(ue.has(e.id)?Ae.add(e.id):ue.set(e.id,e.tagName)),fe.clear();let i=r.querySelectorAll("[id]");for(let{id:a,tagName:l}of i)fe.has(a)?Ae.add(a):ue.get(a)===l&&fe.add(a);for(let a of Ae)fe.delete(a);ue.clear(),Ae.clear(),V.clear();let o=n==="outer"?e.parentElement:e;en(o,s),en(r,i),nn(o,r,n==="outer"?e:null,e.nextSibling),Ve.remove()},nn=(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=_n(s,n,r);if(i){if(i!==n){let o=n;for(;o&&o!==i;){let a=o;o=o.nextSibling,Xt(a)}}ft(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=V.get(o);a&&(a.delete(s.id),a.size||V.delete(o))}rn(e,i,n),ft(i,s),n=i.nextSibling;continue}if(V.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),ft(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,Xt(s)}},_n=(e,t,n)=>{let r=null,s=e.nextSibling,i=0,o=0,a=V.get(e)?.size||0,l=t;for(;l&&l!==n;){if(Yt(l,e)){let c=!1,u=V.get(l),f=V.get(e);if(f&&u){for(let m of u)if(f.has(m)){c=!0;break}}if(c)return l;if(!r&&!V.has(l)){if(!a)return l;r=l}}if(o+=V.get(l)?.size||0,o>a)break;r===null&&s&&Yt(l,s)&&(i++,s=s.nextSibling,i>=2&&(r=void 0)),l=l.nextSibling}return r||null},Yt=(e,t)=>e.nodeType===t.nodeType&&e.tagName===t.tagName&&(!e.id||e.id===t.id),Xt=e=>{V.has(e)?rn(Ve,e,null):e.parentNode?.removeChild(e)},rn=(e,t,n)=>{if("moveBefore"in e){e.moveBefore(t,n);return}e.insertBefore(t,n)},kn=J("preserve-attr"),ft=(e,t)=>{let n=t.nodeType;if(n===1){let r=e,s=t,i=r.hasAttribute("data-scope-children");if(r.hasAttribute(Re)&&s.hasAttribute(Re))return e;let o=(t.getAttribute(kn)??"").split(" "),a=(c,u,f)=>{let m=u.hasAttribute(f);return c.hasAttribute(f)!==m&&!o.includes(f)?(c[f]=m,!0):!1},l=!1;if(r instanceof HTMLInputElement&&s instanceof HTMLInputElement&&s.type!=="file"){let c=s.getAttribute("value");r.getAttribute("value")!==c&&!o.includes("value")&&(r.value=c??"",l=!0),l=a(r,s,"checked")||l,a(r,s,"disabled")}else if(r instanceof HTMLTextAreaElement&&s instanceof HTMLTextAreaElement){let c=s.value;r.defaultValue!==c&&(r.value=c,l=!0)}else r instanceof HTMLOptionElement&&s instanceof HTMLOptionElement&&(l=a(r,s,"selected")||l);for(let{name:c,value:u}of s.attributes)r.getAttribute(c)!==u&&!o.includes(c)&&r.setAttribute(c,u);for(let{name:c}of Array.from(r.attributes))!s.hasAttribute(c)&&!o.includes(c)&&r.removeAttribute(c);l&&(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)||nn(r,s),i&&r.dispatchEvent(new CustomEvent(Je,{bubbles:!1}))}return(n===8||n===3)&&e.nodeValue!==t.nodeValue&&(e.nodeValue=t.nodeValue),e},en=(e,t)=>{for(let n of t)if(fe.has(n.id)){let r=n;for(;r&&r!==e;){let s=V.get(r);s||(s=new Set,V.set(r,s)),s.add(n.id),r=r.parentElement}}};Te({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{I as action,_t as actions,p as attribute,N as beginBatch,_e as computed,w as effect,P as endBatch,q as filtered,oe as getPath,D as mergePatch,A as mergePaths,re as root,he as signal,_ as startPeeking,k as stopPeeking,Te as watcher}; +var gt=/🖕JS_DS🚀/.source,We=gt.slice(0,5),Ue=gt.slice(4),U="datastar-fetch",ge="datastar-prop-change",ht="datastar-ready",Je="datastar-scope-children",te="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),yt=e=>{for(let t in e)if(L(e,t))return!1;return!0},ne=(e,t)=>{for(let n in e){let r=e[n];z(r)||Array.isArray(r)?ne(r,t):e[n]=t(r)}},Le=e=>{let t={};for(let[n,r]of e){let s=n.split("."),i=s.pop(),o=s.reduce((a,l)=>a[l]??={},t);o[i]=r}return t};var xe=[],Ke=[],He=0,Ne=0,ze=0,Ze,J,Pe=0,x=()=>{He++},N=()=>{--He||(Et(),Z())},_=e=>{Ze=J,J=e},k=()=>{J=Ze,Ze=void 0},he=e=>cn.bind(0,{previousValue:e,t:e,e:1}),Qe=Symbol("computed"),_e=e=>{let t=ln.bind(0,{e:17,getter:e});return t[Qe]=1,t},A=e=>{let t={d:e,e:2};J&&Xe(t,J),_(t),x();try{t.d()}finally{N(),k()}return Rt.bind(0,t)},Et=()=>{for(;Ne"getter"in e?St(e):Tt(e,e.t),St=e=>{_(e),wt(e);try{let t=e.t;return t!==(e.t=e.getter(t))}finally{k(),Mt(e)}},Tt=(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):Ke[ze++]=e}},At=(e,t)=>{if(t&16||t&32&&Lt(e.s,e)){_(e),wt(e),x();try{e.d()}finally{N(),k(),Mt(e)}return}t&32&&(e.e=t&-33);let n=e.s;for(;n;){let r=n.c,s=r.e;s&64&&At(r,r.e=s&-65),n=n.i}},cn=(e,...t)=>{if(t.length){if(e.t!==(e.t=t[0])){e.e=17;let r=e.r;return r&&(un(r),He||Et()),!0}return!1}let n=e.t;if(e.e&16&&Tt(e,n)){let r=e.r;r&&Fe(r)}return J&&Xe(e,J),n},ln=e=>{let t=e.e;if(t&16||t&32&&Lt(e.s,e)){if(St(e)){let n=e.r;n&&Fe(n)}}else t&32&&(e.e=t&-33);return J&&Xe(e,J),e.t},Rt=e=>{let t=e.s;for(;t;)t=Ce(t,e);let n=e.r;n&&Ce(n),e.e=0},Xe=(e,t)=>{let n=t.a;if(n&&n.c===e)return;let r=n?n.i:t.s;if(r&&r.c===e){r.p=Pe,t.a=r;return}let s=e.m;if(s&&s.p===Pe&&s.o===t)return;let i=t.a=e.m={p:Pe,c:e,o:t,l:n,i:r,u:s};r&&(r.l=i),n?n.i=i:t.s=i,s?s.n=i:e.r=i},Ce=(e,t=e.o)=>{let n=e.c,r=e.l,s=e.i,i=e.n,o=e.u;if(s?s.l=r:t.a=r,r?r.i=s:t.s=s,i?i.u=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=Ce(a,n);while(a)}}else"previousValue"in n||Rt(n);return s},un=e=>{let t=e.n,n;e:for(;;){let r=e.o,s=r.e;if(s&60?s&12?s&4?!(s&48)&&fn(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,f:n},t=o);continue}}if(e=t){t=e.n;continue}for(;n;)if(e=n.t,n=n.f,e){t=e.n;continue e}break}},wt=e=>{Pe++,e.a=void 0,e.e=e.e&-57|4},Mt=e=>{let t=e.a,n=t?t.i:e.s;for(;n;)n=Ce(n,e);e.e&=-5},Lt=(e,t)=>{let n,r=0,s=!1;e:for(;;){let i=e.c,o=i.e;if(t.e&16)s=!0;else if((o&17)===17){if(vt(i)){let a=i.r;a.n&&Fe(a),s=!0}}else if((o&33)===33){(e.n||e.u)&&(n={t:e,f: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,l=a.n;if(l?(e=n.t,n=n.f):e=a,s){if(vt(t)){l&&Fe(a),t=e.o;continue}s=!1}else t.e&=-33;if(t=e.o,e.i){e=e.i;continue e}}return s}},Fe=e=>{do{let t=e.o,n=t.e;(n&48)===32&&(t.e=n|16,n&2&&Ye(t))}while(e=e.n)},fn=(e,t)=>{let n=t.a;for(;n;){if(n===e)return!0;n=n.l}return!1},ae=e=>{let t=re,n=e.split(".");for(let r of n){if(t==null||!L(t,r))return;t=t[r]}return t},Oe=(e,t="")=>{let n=Array.isArray(e);if(n||z(e)){let r=n?[]:{};for(let i in e)r[i]=he(Oe(e[i],`${t+i}.`));let s=he(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]=he(""),Z(t+o,""),s(s()+1)),r[o]())},set(i,o,a){let l=t+o;if(n&&o==="length"){let c=r[o]-a;if(r[o]=a,c>0){let u={};for(let f=a;f{if(e!==void 0&&t!==void 0&&xe.push([e,t]),!He&&xe.length){let n=Le(xe);xe.length=0,document.dispatchEvent(new CustomEvent(te,{detail:n}))}},D=(e,{ifMissing:t}={})=>{x();for(let n in e)e[n]==null?t||delete re[n]:xt(e[n],n,re,"",t);N()},S=(e,t)=>D(Le(e),t),xt=(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]:xt(e[i],i,n[t],`${r+t}.`,s)}else s&&L(n,t)||(n[t]=e)},bt=e=>typeof e=="string"?RegExp(e.replace(/^\/|\/$/g,"")):e,q=({include:e=/.*/,exclude:t=/(?!)/}={},n=re)=>{let r=bt(e),s=bt(t),i=[],o=[[n,""]];for(;o.length;){let[a,l]=o.pop();for(let c in a){let u=l+c;z(a[c])?o.push([a[c],`${u}.`]):r.test(u)&&!s.test(u)&&i.push([u,ae(u)])}}return Le(i)},re=Oe({});var Q=e=>e instanceof HTMLElement||e instanceof SVGElement||e instanceof MathMLElement;var ce=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(),Nt=e=>ce(e).replace(/-./g,t=>t[1].toUpperCase()),Pt=e=>ce(e).replace(/-/g,"_");var dn=/^(?:(?:async\s+)?function\b|(?:async\s*)?(?:\([^)]*\)|[A-Za-z_$][\w$]*)\s*=>)/,le=(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(!dn.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})`)()}},Ot={camel:e=>e.replace(/-[a-z]/g,t=>t[1].toUpperCase()),snake:e=>e.replace(/-/g,"_"),pascal:e=>e[0].toUpperCase()+Ot.camel(e.slice(1))},P=(e,t,n="camel")=>{for(let r of t.get("case")||[n])e=Ot[r]?.(e)||e;return e},K=e=>`data-${e}`,et=e=>e;var pn="https://data-star.dev/errors",ye=(e,t,n={})=>{Object.assign(n,e);let r=new Error,s=Pt(t),i=new URLSearchParams({metadata:JSON.stringify(n)}).toString(),o=JSON.stringify(n,null,2);return r.message=`${t} +More info: ${pn}/${s}?${i} +Context: ${o}`,r},ve=new Map,tt=new Map,Ht=new Map,_t=new Proxy({},{get:(e,t)=>ve.get(t)?.apply,has:(e,t)=>ve.has(t),ownKeys:()=>Reflect.ownKeys(ve),set:()=>!1,deleteProperty:()=>!1}),Ee=new Map,ke=[],nt=new Set,be=new Set,Ct=!1,p=e=>{ke.push(e),ke.length===1&&setTimeout(()=>{for(let n of ke)nt.add(n.name),tt.set(n.name,n);ke.length=0;let t=be.size?[...be]:[document.documentElement];for(let n of t)En(n,!be.has(n));nt.clear()})},I=e=>{ve.set(e.name,e)};document.addEventListener(U,e=>{let t=Ht.get(e.detail.type);t&&t.apply({error:ye.bind(0,{plugin:{type:"watcher",name:t.name},element:{id:e.target.id,tag:e.target.tagName}})},e.detail.argsRaw)});var Se=e=>{Ht.set(e.name,e)},Ft=e=>{for(let t of e){let n=Ee.get(t);if(n&&Ee.delete(t))for(let r of n.values())for(let s of r.values())s()}},kt=K("ignore"),mn=`[${kt}]`,Dt=e=>e.hasAttribute(`${kt}__self`)||!!e.closest(mn),De=(e,t)=>{for(let n of e)if(!Dt(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)}}},gn=e=>{for(let{target:t,type:n,attributeName:r,addedNodes:s,removedNodes:i}of e)if(n==="childList"){for(let o of i)Q(o)&&(Ft([o]),Ft(o.querySelectorAll("*")));for(let o of s)Q(o)&&(De([o]),De(o.querySelectorAll("*")))}else if(n==="attributes"&&r.startsWith("data-")&&Q(t)&&!Dt(t)){let o=r.slice(5),a=et(o);if(!a)continue;let l=t.getAttribute(r);if(l===null){let c=Ee.get(t);if(c){let u=c.get(a);if(u){for(let f of u.values())f();c.delete(a)}}}else rt(t,o,l)}},hn=new MutationObserver(gn),yn=e=>{let[t,...n]=e.split("__"),[r,s]=t.split(/:(.+)/),i=new Map;for(let o of n){let[a,...l]=o.split(".");i.set(a,new Set(l))}return{pluginName:r,key:s,mods:i}},vn=()=>be.has(document.documentElement),bn=()=>{Ct||!vn()||(Ct=!0,document.dispatchEvent(new Event(ht)))},En=(e=document.documentElement,t=!0)=>{Q(e)&&De([e],!0),De(e.querySelectorAll("*"),!0),t&&(hn.observe(e,{subtree:!0,childList:!0,attributes:!0}),be.add(e),bn())};var rt=(e,t,n,r)=>{let s=et(t);if(!s)return;let{pluginName:i,key:o,mods:a}=yn(s),l=tt.get(i);if((!r||nt.has(i))&&!!l){let u={el:e,rawKey:s,mods:a,error:ye.bind(0,{plugin:{type:"attribute",name:l.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=l.requirement&&(typeof l.requirement=="string"?l.requirement:l.requirement.key)||"allowed",m=l.requirement&&(typeof l.requirement=="string"?l.requirement:l.requirement.value)||"allowed",h=o!=null&&o!=="",b=n!=null&&n!=="";if(h){if(f==="denied")throw u.error("KeyNotAllowed")}else if(f==="must")throw u.error("KeyRequired");if(b){if(m==="denied")throw u.error("ValueNotAllowed")}else if(m==="must")throw u.error("ValueRequired");if(f==="exclusive"||m==="exclusive"){if(h&&b)throw u.error("KeyAndValueProvided");if(!h&&!b)throw u.error("KeyOrValueRequired")}let d=new Map;if(b){let y;u.rx=(...G)=>(y||(y=Sn(n,{returnsValue:l.returnsValue,argNames:l.argNames,cleanups:d})),y(e,...G))}let g=l.apply(u);g&&d.set("attribute",g);let E=Ee.get(e);if(E){let y=E.get(s);if(y)for(let G of y.values())G()}else E=new Map,Ee.set(e,E);E.set(s,d)}},Sn=(e,{returnsValue:t=!1,argNames:n=[],cleanups:r=new Map}={})=>{let s="";if(t){let l=/(\/(\\\/|[^/])*\/|"(\\"|[^"])*"|'(\\'|[^'])*'|`(\\`|[^`])*`|\(\s*((function)\s*\(\s*\)|(\(\s*\))\s*=>)\s*(?:\{[\s\S]*?\}|[^;){]*)\s*\)\s*\(\s*\)|[^;])+/gm,c=e.trim().match(l);if(c){let u=c.length-1,f=c[u].trim();f.startsWith("return")||(c[u]=`return (${f});`),s=c.join(`; +`)}}else s=e.trim();let i=new Map,o=RegExp(`(?:${We})(.*?)(?:${Ue})`,"gm"),a=0;for(let l of s.matchAll(o)){let c=l[1],u=`__escaped${a++}`;i.set(u,c),s=s.replace(We+c+Ue,u)}s=s.replace(/("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|`(?:\\.|[^`\\$]|\$(?!\{))*`)|\$\{([^{}]*)\}|\$([a-zA-Z_\d]\w*(?:[.-]\w+)*)/g,(l,c,u,f)=>c?l:u!==void 0?`\${${u.replace(/\$([a-zA-Z_\d]\w*(?:[.-]\w+)*)/g,(m,h)=>h.split(".").reduce((b,d)=>`${b}['${d}']`,"$"))}}`:f.split(".").reduce((m,h)=>`${m}['${h}']`,"$")),s=s.replaceAll(/@([A-Za-z_$][\w$]*)\(/g,'__action("$1",evt,');for(let[l,c]of i)s=s.replace(l,c);try{let l=Function("el","$","__action","evt",...n,s);return(c,...u)=>{let f=(m,h,...b)=>{let d=ye.bind(0,{plugin:{type:"action",name:m},element:{id:c.id,tag:c.tagName},expression:{fnContent:s,value:e}}),g=_t[m];if(g)return g({el:c,evt:h,error:d,cleanups:r},...b);throw d("UndefinedAction")};try{return l(c,re,f,void 0,...u)}catch(m){throw console.error(m),ye({element:{id:c.id,tag:c.tagName},expression:{fnContent:s,value:e},error:m.message},"ExecuteExpression")}}}catch(l){throw console.error(l),ye({expression:{fnContent:s,value:e},error:l.message},"GenerateExpression")}};I({name:"peek",apply(e,t){_();try{return t()}finally{k()}}});I({name:"setAll",apply(e,t,n){_();let r=q(n);ne(r,()=>t),D(r),k()}});I({name:"toggleAll",apply(e,t){_();let n=q(t);ne(n,r=>!r),D(n),k()}});var It=new WeakMap,st=e=>!["GET","DELETE"].includes(e),Te=(e,t,n=!0)=>I({name:e,apply:async({el:r,evt:s,error:i,cleanups:o},a,{selector:l,headers:c,contentType:u="json",filterSignals:{include:f=/.*/,exclude:m=/(^|\.)_/}={},openWhenHidden:h=n,payload:b,requestCancellation:d="auto",retry:g="auto",retryInterval:E=1e3,retryScaler:y=2,retryMaxWait:G=3e4,retryMaxCount:C=10}={})=>{let $=d instanceof AbortController?d:new AbortController;(d==="auto"||d==="cleanup")&&(It.get(r)?.abort(),It.set(r,$)),d==="cleanup"&&(o.get(`@${e}`)?.(),o.set(`@${e}`,async()=>{$.abort(),await Promise.resolve()}));let ee=()=>{};try{if(!a?.length)throw i("FetchNoUrlProvided",{action:I});let pe={Accept:"text/event-stream, text/html, application/json","Datastar-Request":!0};u==="json"&&st(t)&&(pe["Content-Type"]="application/json");let oe=Object.assign({},pe,c),O={input:"",method:t,headers:oe,openWhenHidden:h,retry:g,retryInterval:E,retryScaler:y,retryMaxWait:G,retryMaxCount:C,signal:$.signal,onopen:async v=>{v.status>=400&&se(Tn,r,{status:v.status.toString()})},onmessage:v=>{if(!v.event.startsWith("datastar"))return;let W=v.event,T={};for(let R of v.data.split(` +`)){let M=R.indexOf(" "),w=R.slice(0,M),H=R.slice(M+1);(T[w]||=[]).push(H)}let F=Object.fromEntries(Object.entries(T).map(([R,M])=>[R,M.join(` +`)]));se(W,r,F)},onerror:v=>{if(Vt(v))throw v("FetchExpectedTextEventStream",{url:a});v&&(console.error(v.message),se(An,r,{message:v.message}))}},$e=()=>{let v=new URL(a,document.baseURI),W=new URLSearchParams(v.search);if(u==="json"){_();let T=b!==void 0?b:q({include:f,exclude:m});k();let F=JSON.stringify(T);st(t)?O.body=F:W.set("datastar",F)}else if(u==="form"){let T=l?document.querySelector(l):r.closest("form");if(!T)throw i("FetchFormNotFound",{action:I,selector:l});if(!T.noValidate&&!T.checkValidity()){T.reportValidity();return}let F=new FormData(T),R=r;if(r===T&&s instanceof SubmitEvent)R=s.submitter;else{let H=j=>j.preventDefault();T.addEventListener("submit",H),ee=()=>{T.removeEventListener("submit",H)}}if(R instanceof HTMLButtonElement||R instanceof HTMLInputElement&&R.type==="submit"){let H=R.getAttribute("name");H&&F.append(H,R.value)}let M=T.getAttribute("enctype")==="multipart/form-data";M||(oe["Content-Type"]="application/x-www-form-urlencoded");let w=new URLSearchParams(F);if(st(t))M?O.body=F:O.body=w;else for(let[H,j]of w)W.append(H,j)}else throw i("FetchInvalidContentType",{action:I,contentType:u});return v.search=W.toString(),O.input=v.toString(),O};se(it,r,{});try{await Nn(r,$e)}catch(v){if(!Vt(v))throw i("FetchFailed",{method:t,url:a,error:v.message})}}finally{se(ot,r,{}),ee(),o.delete(`@${e}`)}}});Te("get","GET",!1);Te("patch","PATCH");Te("post","POST");Te("put","PUT");Te("delete","DELETE");var it="started",ot="finished",Tn="error",An="retrying",Rn="retries-failed",se=(e,t,n)=>document.dispatchEvent(new CustomEvent(U,{detail:{type:e,el:t,argsRaw:n}})),Vt=e=>`${e}`.includes("text/event-stream"),wn=async(e,t)=>{let n=e.getReader(),r=await n.read();for(;!r.done;)t(r.value),r=await n.read()},Mn=e=>{let t,n,r,s=!1;return i=>{t?t=xn(t,i):(t=i,n=0,r=-1);let o=t.length,a=0;for(;n{let r=$t(),s=new TextDecoder;return(i,o)=>{if(!i.length)n?.(r),r=$t();else if(o>0){let a=s.decode(i.subarray(0,o)),l=o+(i[o+1]===32?2:1),c=s.decode(i.subarray(l));switch(a){case"data":r.data=r.data?`${r.data} +${c}`:c;break;case"event":r.event=c;break;case"id":e(r.id=c);break;case"retry":{let u=+c;Number.isNaN(u)||t(r.retry=u);break}}}}},xn=(e,t)=>{let n=new Uint8Array(e.length+t.length);return n.set(e),n.set(t,e.length),n},$t=()=>({data:"",event:"",id:"",retry:void 0}),Nn=(e,t)=>new Promise((n,r)=>{let s=t();if(!s)return;let{input:i,signal:o,headers:a,onopen:l,onmessage:c,onclose:u,onerror:f,openWhenHidden:m,fetch:h,retry:b="auto",retryInterval:d=1e3,retryScaler:g=2,retryMaxWait:E=3e4,retryMaxCount:y=10,responseOverrides:G,...C}=s,$={...a},ee,pe=()=>{if(ee.abort(),!document.hidden){let M=t();if(!M)return;i=M.input,C.body=M.body,R()}};m||document.addEventListener("visibilitychange",pe);let oe,O=()=>{document.removeEventListener("visibilitychange",pe),clearTimeout(oe),ee.abort()};o?.addEventListener("abort",()=>{O(),n()});let $e=h||window.fetch,v=l||(()=>{}),W=0,T=d,F=()=>{W++,W<=y?(clearTimeout(oe),console.error(`Datastar failed to reach ${i.toString()} retrying in ${d}ms.`),oe=setTimeout(R,d),d=Math.min(d*g,E)):(se(Rn,e,{}),O(),r("Max retries reached."))},R=async()=>{ee=new AbortController;let M=ee.signal;try{let w=await $e(i,{...C,headers:$,signal:M});await v(w);let H=async(B,me,Ge,we,...an)=>{let mt={[Ge]:await me.text()};for(let je of an){let Be=me.headers.get(`datastar-${ce(je)}`);if(we){let Me=we[je];Me&&(Be=typeof Me=="string"?Me:JSON.stringify(Me))}Be&&(mt[je]=Be)}se(B,e,mt),O(),n()},j=w.status,sn=j===204,pt=j>=300&&j<400,on=j>=400&&j<600;if(j!==200){if(u?.(),b!=="never"&&!sn&&!pt&&(b==="always"||b==="error"&&on)){F();return}O(),n();return}W=0,d=T;let qe=w.headers.get("Content-Type");if(qe?.includes("text/html"))return await H("datastar-patch-elements",w,"elements",G,"selector","mode","namespace","useViewTransition");if(qe?.includes("application/json"))return await H("datastar-patch-signals",w,"signals",G,"onlyIfMissing");if(qe?.includes("text/javascript")){let B=document.createElement("script"),me=w.headers.get("datastar-script-attributes");if(me)for(let[Ge,we]of Object.entries(JSON.parse(me)))B.setAttribute(Ge,we);B.textContent=await w.text(),document.head.appendChild(B),O();return}if(await wn(w.body,Mn(Ln(B=>{B?$["last-event-id"]=B:delete $["last-event-id"]},B=>{T=d=B},c))),u?.(),b==="always"&&!pt){F();return}O(),n()}catch{if(!M.aborted)try{F()}catch(w){O(),r(w)}}};R()});p({name:"attr",requirement:{value:"must"},returnsValue:!0,apply({el:e,key:t,rx:n}){let r=(a,l)=>{l===""||l===!0?e.setAttribute(a,""):l===!1||l==null?e.removeAttribute(a):typeof l=="string"?e.setAttribute(a,l):typeof l=="function"?e.setAttribute(a,l.toString()):e.setAttribute(a,JSON.stringify(l,(c,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(),l=Object.keys(a);for(let c of l)r(c,a[c]);i.observe(e,{attributeFilter:l})},i=new MutationObserver(s),o=A(s);return()=>{i.disconnect(),o()}}});var Ie=(e,...t)=>({get:n=>n[e],set:(n,r)=>{n[e]=r},events:t}),qt=(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}),Pn=/^data:(?[^;]+);base64,(?.*)$/,Gt=Symbol("empty"),On=(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&&S([[r,f.value]],{ifMissing:!0})}if(!Array.isArray(i)||e instanceof HTMLSelectElement&&e.multiple)return S([[r,s.get(e,typeof i)]],{ifMissing:!0}),r;let l=document.querySelectorAll(a),c=[],u=0;for(let f of l){if(c.push([`${r}.${u}`,s.get(f,typeof(L(i,u)?i[u]:void 0))]),e===f)break;u++}return S(c,{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?P(t,r):s,a=r.get("prop"),l=r.get("event"),c=null;if(e instanceof HTMLInputElement)switch(e.type){case"range":case"number":c=at(!1,"input");break;case"checkbox":c={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),c={get:(d,g)=>d.checked?g==="number"?+d.value:d.value:Gt,set:(d,g)=>{d.checked=g===(typeof g=="number"?+d.value:d.value)},events:["input"]};break;case"file":{let d=()=>{let g=[...e.files||[]],E=[];Promise.all(g.map(y=>new Promise(G=>{let C=new FileReader;C.onload=()=>{if(typeof C.result!="string")throw i("InvalidFileResultType",{resultType:typeof C.result});let $=C.result.match(Pn);if(!$?.groups)throw i("InvalidDataUri",{result:C.result});E.push({name:y.name,contents:$.groups.contents,mime:$.groups.mime})},C.onloadend=()=>G(),C.readAsDataURL(y)}))).then(()=>{S([[o,E]])})};return e.addEventListener("change",d),()=>{e.removeEventListener("change",d)}}default:c=at(!0,"input")}else if(e instanceof HTMLSelectElement&&e.multiple){let d=new Map;c={get:g=>[...g.selectedOptions].map(E=>{let y=d.get(E.value);return y==="string"||y==null?E.value:+E.value}),set:(g,E)=>{for(let y of g.options)E.includes(y.value)?(d.set(y.value,"string"),y.selected=!0):E.includes(+y.value)?(d.set(y.value,"number"),y.selected=!0):y.selected=!1},events:["change"]}}else e instanceof HTMLSelectElement?c=at(!0,"change"):e instanceof HTMLTextAreaElement?c=Ie("value","input"):e instanceof HTMLElement&&e.tagName.includes("-")?c="value"in e?Ie("value","input","change"):qt("value","input","change"):e instanceof HTMLElement&&"value"in e?c=Ie("value","change"):c=qt("value","change");if(!c)throw i("InvalidBindAdapter");let u=a&&[...a][0];if(a&&!u)throw i("BindPropNameMissing");if(u){let d=Nt(u);c=Ie(d,...l?[...l]:c.events)}else l&&(c.events=[...l]);let f=ae(o),m=On(e,t,n,o,c,f),h=()=>{let d=ae(m);if(d!=null){let g=c.get(e,typeof d);g!==Gt&&S([[m,g]])}};for(let d of c.events)e.addEventListener(d,h);e.addEventListener(ge,h);let b=A(()=>{c.set(e,ae(m))});return()=>{b();for(let d of c.events)e.removeEventListener(d,h);e.removeEventListener(ge,h)}}});p({name:"class",requirement:{value:"must"},returnsValue:!0,apply({key:e,el:t,mods:n,rx:r}){e&&=P(e,n,"kebab");let s,i=()=>{o.disconnect(),s=e?{[e]:r()}:r();for(let l in s){let c=l.split(/\s+/).filter(u=>u.length>0);if(s[l])for(let u of c)t.classList.contains(u)||t.classList.add(u);else for(let u of c)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 l in s){let c=l.split(/\s+/).filter(u=>u.length>0);for(let u of c)t.classList.remove(u)}}}});p({name:"computed",requirement:{value:"must"},returnsValue:!0,apply({key:e,mods:t,rx:n,error:r}){if(e)S([[P(e,t),_e(n)]]);else{let s=Object.assign({},n());ne(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?P(t,n):r,i=0;S([[s,!1]]);let o=a=>{let{type:l,el:c}=a.detail;if(c===e)switch(l){case it:i++,S([[s,!0]]);break;case ot:i=Math.max(0,i-1),S([[s,i>0]]);break}};return document.addEventListener(U,o),()=>{i=0,S([[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},ie=(e,t,n=!1)=>e?e.has(t.toLowerCase()):n,jt=(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)},Bt=(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))}},ue=(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=ie(r,"leading",!1),a=!ie(r,"notrailing",!1);e=Bt(e,i,o,a,!0)}let s=t.get("throttle");if(s){let i=Y(s),o=!ie(s,"noleading",!1),a=ie(s,"trailing",!1);e=Bt(e,i,o,a)}return e};var lt=!!document.startViewTransition,X=(e,t)=>{if(t.has("viewtransition")&<){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(),e(),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=le(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=c=>{x(),r(c),N()};i=X(i,n),i=ue(i,n);let o=P(t,n,"kebab"),a={capture:n.has("capture"),passive:n.has("passive"),once:n.has("once")};if(n.has("outside")){s=document;let c=i;i=u=>{e.contains(u?.target)||c(u)}}(o===U||o===te)&&(s=document);let l=c=>{c&&(n.has("prevent")&&c.preventDefault(),n.has("stop")&&c.stopPropagation(),e instanceof HTMLFormElement&&o==="submit"&&c.preventDefault()),i(c)};return s.addEventListener(o,l,a),()=>{s.removeEventListener(o,l,a)}}});var Wt=(e,t,n)=>Math.max(t,Math.min(n,e));var ut=new WeakSet;p({name:"on-intersect",requirement:{key:"denied",value:"must"},apply({el:e,mods:t,rx:n}){let r=()=>{x(),n(),N()};r=X(r,t),r=ue(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=Wt(Number(jt(a)),0,100)/100)}let i=t.has("exit"),o=new IntersectionObserver(a=>{for(let l of a)l.isIntersecting!==i&&(r(),o&&ut.has(e)&&o.disconnect())},s);return o.observe(e),t.has("once")&&ut.add(e),()=>{t.has("once")||ut.delete(e),o&&(o.disconnect(),o=null)}}});p({name:"on-interval",requirement:{key:"denied",value:"must"},apply({mods:e,rx:t}){let n=()=>{x(),t(),N()};n=X(n,e);let r=1e3,s=e.get("duration");s&&(r=Y(s),ie(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=le(o));let l=!1,c=ue(u=>{if(l)return;let f=q(a,u.detail);if(!yt(f)){l=!0,x();try{r(f)}finally{N(),l=!1}}},n);return document.addEventListener(te,c),()=>{document.removeEventListener(te,c)}}});p({name:"ref",requirement:"exclusive",apply({el:e,key:t,mods:n,value:r}){let s=t!=null?P(t,n):r;S([[s,e]])}});var Ut="none",Jt="display";p({name:"show",requirement:{key:"denied",value:"must"},returnsValue:!0,apply({el:e,rx:t}){let n=()=>{r.disconnect(),t()?e.style.display===Ut&&e.style.removeProperty(Jt):e.style.setProperty(Jt,Ut),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=P(e,t);let s=n?.();S([[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=(c,u)=>{let f=s.get(c);!u&&u!==0?f!==void 0&&(f?r.setProperty(c,f):r.removeProperty(c)):(f===void 0&&s.set(c,r.getPropertyValue(c)),r.setProperty(c,String(u)))},o=()=>{if(a.disconnect(),e)i(e,n());else{let c=n();for(let[u,f]of s)u in c||(f?r.setProperty(u,f):r.removeProperty(u));for(let u in c)i(ce(u),c[u])}a.observe(t,{attributeFilter:["style"]})},a=new MutationObserver(o),l=A(o);return()=>{a.disconnect(),l();for(let[c,u]of s)u?r.setProperty(c,u):r.removeProperty(c)}}});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 Kt=(e,t)=>e.includes(t),Cn=["remove","outer","inner","replace","prepend","append","before","after"],Fn=["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:"",o=t.elements;if(!Kt(Cn,r))throw e.error("PatchElementsInvalidMode",{mode:r});if(!n&&r!=="outer"&&r!=="replace")throw e.error("PatchElementsExpectedSelector");if(!Kt(Fn,s))throw e.error("PatchElementsInvalidNamespace",{namespace:s});let a={selector:n,mode:r,namespace:s,useViewTransition:i.trim()==="true",elements:o};lt&&a.useViewTransition?document.startViewTransition(()=>zt(e,a)):zt(e,a)}});var zt=({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,""),l=/<\/html>/.test(a),c=/<\/head>/.test(a),u=/<\/body>/.test(a),f=r==="svg"?"svg":r==="mathml"?"math":"",m=f?`<${f}>${s}`:s,h=new DOMParser().parseFromString(l||c||u?s:``,"text/html");if(l)i.appendChild(h.documentElement);else if(c&&u)i.appendChild(h.head),i.appendChild(h.body);else if(c)i.appendChild(h.head);else if(u)i.appendChild(h.body);else if(f){let b=h.querySelector("template").content.querySelector(f);for(let d of b.childNodes)i.appendChild(d)}else i=h.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 l of a){let c;if(l instanceof HTMLHtmlElement)c=document.documentElement;else if(l instanceof HTMLBodyElement)c=document.body;else if(l instanceof HTMLHeadElement)c=document.head;else if(c=document.getElementById(l.id),!c){console.warn(e("PatchElementsNoTargetsFound"),{element:{id:l.id}});continue}Qt(n,l,[c],!0)}}else{let a=document.querySelectorAll(t);if(!a.length){console.warn(e("PatchElementsNoTargetsFound"),{selector:t});return}let l=o&&n!=="remove"?[a[0]]:a;l.length===1&&(o=!0),Qt(n,i,l,o)}},dt=new WeakSet;for(let e of document.querySelectorAll("script"))dt.add(e);var tn=e=>{let t=e instanceof HTMLScriptElement?[e]:e.querySelectorAll("script");for(let n of t)if(!dt.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),dt.add(r)}},Zt=(e,t,n,r)=>{let s=!1;for(let i of e){if(r&&s)break;let o=r?t:t.cloneNode(!0);tn(o),i[n](o),s=!0}},Qt=(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);_n(i,o,e),tn(i);let a=i.closest("[data-scope-children]");a&&a.dispatchEvent(new CustomEvent(Je,{bubbles:!1})),s=!0}}break;case"replace":Zt(n,t,"replaceWith",r);break;case"prepend":case"append":case"before":case"after":Zt(n,t,e,r)}},V=new Map,de=new Set,fe=new Map,Ae=new Set,Ve=document.createElement("div");Ve.hidden=!0;var Re=K("ignore-morph"),Hn=`[${Re}]`,_n=(e,t,n="outer")=>{if(Q(e)&&Q(t)&&e.hasAttribute(Re)&&t.hasAttribute(Re)||e.parentElement?.closest(Hn))return;let r=document.createElement("div");r.append(t),document.body.insertAdjacentElement("afterend",Ve);let s=e.querySelectorAll("[id]");for(let{id:a,tagName:l}of s)fe.has(a)?Ae.add(a):fe.set(a,l);e instanceof Element&&e.id&&(fe.has(e.id)?Ae.add(e.id):fe.set(e.id,e.tagName)),de.clear();let i=r.querySelectorAll("[id]");for(let{id:a,tagName:l}of i)de.has(a)?Ae.add(a):fe.get(a)===l&&de.add(a);for(let a of Ae)de.delete(a);fe.clear(),Ae.clear(),V.clear();let o=n==="outer"?e.parentElement:e;en(o,s),en(r,i),nn(o,r,n==="outer"?e:null,e.nextSibling),Ve.remove()},nn=(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=kn(s,n,r);if(i){if(i!==n){let o=n;for(;o&&o!==i;){let a=o;o=o.nextSibling,Xt(a)}}ft(i,s),n=i.nextSibling;continue}}if(s instanceof Element&&de.has(s.id)){let i=document.getElementById(s.id),o=i;for(;o=o.parentNode;){let a=V.get(o);a&&(a.delete(s.id),a.size||V.delete(o))}rn(e,i,n),ft(i,s),n=i.nextSibling;continue}if(V.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),ft(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,Xt(s)}},kn=(e,t,n)=>{let r=null,s=e.nextSibling,i=0,o=0,a=V.get(e)?.size||0,l=t;for(;l&&l!==n;){if(Yt(l,e)){let c=!1,u=V.get(l),f=V.get(e);if(f&&u){for(let m of u)if(f.has(m)){c=!0;break}}if(c)return l;if(!r&&!V.has(l)){if(!a)return l;r=l}}if(o+=V.get(l)?.size||0,o>a)break;r===null&&s&&Yt(l,s)&&(i++,s=s.nextSibling,i>=2&&(r=void 0)),l=l.nextSibling}return r||null},Yt=(e,t)=>e.nodeType===t.nodeType&&e.tagName===t.tagName&&(!e.id||e.id===t.id),Xt=e=>{V.has(e)?rn(Ve,e,null):e.parentNode?.removeChild(e)},rn=(e,t,n)=>{if("moveBefore"in e){e.moveBefore(t,n);return}e.insertBefore(t,n)},Dn=K("preserve-attr"),ft=(e,t)=>{let n=t.nodeType;if(n===1){let r=e,s=t,i=r.hasAttribute("data-scope-children");if(r.hasAttribute(Re)&&s.hasAttribute(Re))return e;let o=(t.getAttribute(Dn)??"").split(" "),a=(c,u,f)=>{let m=u.hasAttribute(f);return c.hasAttribute(f)!==m&&!o.includes(f)?(c[f]=m,!0):!1},l=!1;if(r instanceof HTMLInputElement&&s instanceof HTMLInputElement&&s.type!=="file"){let c=s.getAttribute("value");r.getAttribute("value")!==c&&!o.includes("value")&&(r.value=c??"",l=!0),l=a(r,s,"checked")||l,a(r,s,"disabled")}else if(r instanceof HTMLTextAreaElement&&s instanceof HTMLTextAreaElement){let c=s.value;r.defaultValue!==c&&(r.value=c,l=!0)}else r instanceof HTMLOptionElement&&s instanceof HTMLOptionElement&&(l=a(r,s,"selected")||l);for(let{name:c,value:u}of s.attributes)r.getAttribute(c)!==u&&!o.includes(c)&&r.setAttribute(c,u);for(let{name:c}of Array.from(r.attributes))!s.hasAttribute(c)&&!o.includes(c)&&r.removeAttribute(c);l&&(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)||nn(r,s),i&&r.dispatchEvent(new CustomEvent(Je,{bubbles:!1}))}return(n===8||n===3)&&e.nodeValue!==t.nodeValue&&(e.nodeValue=t.nodeValue),e},en=(e,t)=>{for(let n of t)if(de.has(n.id)){let r=n;for(;r&&r!==e;){let s=V.get(r);s||(s=new Set,V.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(le(t),{ifMissing:r})}});export{I as action,_t as actions,p as attribute,x as beginBatch,_e as computed,A as effect,N as endBatch,q as filtered,ae as getPath,D as mergePatch,S as mergePaths,re as root,he as signal,_ as startPeeking,k as stopPeeking,Se as watcher}; //# sourceMappingURL=datastar.js.map diff --git a/bundles/datastar.js.map b/bundles/datastar.js.map index 947984fb..6f6997a0 100644 --- a/bundles/datastar.js.map +++ b/bundles/datastar.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../library/src/engine/consts.ts", "../library/src/utils/polyfills.ts", "../library/src/utils/paths.ts", "../library/src/engine/signals.ts", "../library/src/utils/dom.ts", "../library/src/utils/text.ts", "../library/src/engine/engine.ts", "../library/src/plugins/actions/peek.ts", "../library/src/plugins/actions/setAll.ts", "../library/src/plugins/actions/toggleAll.ts", "../library/src/plugins/actions/fetch.ts", "../library/src/plugins/attributes/attr.ts", "../library/src/plugins/attributes/bind.ts", "../library/src/plugins/attributes/class.ts", "../library/src/plugins/attributes/computed.ts", "../library/src/plugins/attributes/effect.ts", "../library/src/plugins/attributes/indicator.ts", "../library/src/utils/tags.ts", "../library/src/utils/timing.ts", "../library/src/utils/view-transitions.ts", "../library/src/plugins/attributes/init.ts", "../library/src/plugins/attributes/jsonSignals.ts", "../library/src/plugins/attributes/on.ts", "../library/src/utils/math.ts", "../library/src/plugins/attributes/onIntersect.ts", "../library/src/plugins/attributes/onInterval.ts", "../library/src/plugins/attributes/onSignalPatch.ts", "../library/src/plugins/attributes/ref.ts", "../library/src/plugins/attributes/show.ts", "../library/src/plugins/attributes/signals.ts", "../library/src/plugins/attributes/style.ts", "../library/src/plugins/attributes/text.ts", "../library/src/plugins/watchers/patchElements.ts", "../library/src/plugins/watchers/patchSignals.ts"], - "sourcesContent": ["const lol = /\uD83D\uDD95JS_DS\uD83D\uDE80/.source\nexport const DSP = lol.slice(0, 5)\nexport const DSS = lol.slice(4)\nexport const DATASTAR_FETCH_EVENT = 'datastar-fetch'\nexport const DATASTAR_PROP_CHANGE_EVENT = 'datastar-prop-change'\nexport const DATASTAR_READY_EVENT = 'datastar-ready'\nexport const DATASTAR_SCOPE_CHILDREN_EVENT = 'datastar-scope-children'\nexport const DATASTAR_SIGNAL_PATCH_EVENT = 'datastar-signal-patch'\n", "export const hasOwn: (obj: object, prop: PropertyKey) => boolean =\n // @ts-expect-error\n Object.hasOwn ?? Object.prototype.hasOwnProperty.call\n", "import type { Paths } from '@engine/types'\nimport { hasOwn } from '@utils/polyfills'\n\nexport const isPojo = (obj: any): obj is Record =>\n obj !== null &&\n typeof obj === 'object' &&\n (Object.getPrototypeOf(obj) === Object.prototype ||\n Object.getPrototypeOf(obj) === null)\n\nexport const isEmpty = (obj: Record): boolean => {\n for (const prop in obj) {\n if (hasOwn(obj, prop)) {\n return false\n }\n }\n return true\n}\n\nexport const updateLeaves = (\n obj: Record,\n fn: (oldValue: any) => any,\n) => {\n for (const key in obj) {\n const val = obj[key]\n if (isPojo(val) || Array.isArray(val)) {\n updateLeaves(val, fn)\n } else {\n obj[key] = fn(val)\n }\n }\n}\n\nexport const pathToObj = (paths: Paths): Record => {\n const result: Record = {}\n for (const [path, value] of paths) {\n const keys = path.split('.')\n const lastKey = keys.pop()!\n const obj = keys.reduce((acc, key) => (acc[key] ??= {}), result)\n obj[lastKey] = value\n }\n return result\n}\n", "import { DATASTAR_SIGNAL_PATCH_EVENT } from '@engine/consts'\nimport type {\n Computed,\n Effect,\n JSONPatch,\n MergePatchArgs,\n Paths,\n Signal,\n SignalFilterOptions,\n} from '@engine/types'\nimport { isPojo, pathToObj } from '@utils/paths'\nimport { hasOwn } from '@utils/polyfills'\n\ninterface ReactiveNode {\n deps_?: Link\n depsTail_?: Link\n subs_?: Link\n subsTail_?: Link\n flags_: ReactiveFlags\n}\n\ninterface Link {\n version_: number\n dep_: ReactiveNode\n sub_: ReactiveNode\n prevSub_?: Link\n nextSub_?: Link\n prevDep_?: Link\n nextDep_?: Link\n}\n\ninterface Stack {\n value_: T\n prev_?: Stack\n}\n\nenum ReactiveFlags {\n None = 0,\n Mutable = 1 << 0,\n Watching = 1 << 1,\n RecursedCheck = 1 << 2,\n Recursed = 1 << 3,\n Dirty = 1 << 4,\n Pending = 1 << 5,\n}\n\nenum EffectFlags {\n Queued = 1 << 6,\n}\n\ninterface AlienEffect extends ReactiveNode {\n fn_(): void\n}\n\ninterface AlienComputed extends ReactiveNode {\n value_?: T\n getter(previousValue?: T): T\n}\n\ninterface AlienSignal extends ReactiveNode {\n previousValue: T\n value_: T\n}\n\nconst currentPatch: Paths = []\nconst queuedEffects: (AlienEffect | undefined)[] = []\nlet batchDepth = 0\nlet notifyIndex = 0\nlet queuedEffectsLength = 0\nlet prevSub: ReactiveNode | undefined\nlet activeSub: ReactiveNode | undefined\nlet version = 0\n\nexport const beginBatch = (): void => {\n batchDepth++\n}\n\nexport const endBatch = (): void => {\n if (!--batchDepth) {\n flush()\n dispatch()\n }\n}\n\nexport const startPeeking = (sub?: ReactiveNode): void => {\n prevSub = activeSub\n activeSub = sub\n}\n\nexport const stopPeeking = (): void => {\n activeSub = prevSub\n prevSub = undefined\n}\n\nexport const signal = (initialValue?: T): Signal => {\n return signalOper.bind(0, {\n previousValue: initialValue,\n value_: initialValue,\n flags_: 1 satisfies ReactiveFlags.Mutable,\n }) as Signal\n}\n\nconst computedSymbol = Symbol('computed')\nexport const computed = (getter: (previousValue?: T) => T): Computed => {\n const c = computedOper.bind(0, {\n flags_: 17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty,\n getter,\n }) as Computed\n // @ts-expect-error\n c[computedSymbol] = 1\n return c\n}\n\nexport const effect = (fn: () => void): Effect => {\n const e: AlienEffect = {\n fn_: fn,\n flags_: 2 satisfies ReactiveFlags.Watching,\n }\n if (activeSub) {\n link(e, activeSub)\n }\n startPeeking(e)\n beginBatch()\n try {\n e.fn_()\n } finally {\n endBatch()\n stopPeeking()\n }\n return effectOper.bind(0, e)\n}\n\nconst flush = () => {\n while (notifyIndex < queuedEffectsLength) {\n const effect = queuedEffects[notifyIndex]!\n queuedEffects[notifyIndex++] = undefined\n run(effect, (effect.flags_ &= ~EffectFlags.Queued))\n }\n notifyIndex = 0\n queuedEffectsLength = 0\n}\n\nconst update = (signal: AlienSignal | AlienComputed): boolean => {\n if ('getter' in signal) {\n return updateComputed(signal)\n }\n return updateSignal(signal, signal.value_)\n}\n\nconst updateComputed = (c: AlienComputed): boolean => {\n startPeeking(c)\n startTracking(c)\n try {\n const oldValue = c.value_\n return oldValue !== (c.value_ = c.getter(oldValue))\n } finally {\n stopPeeking()\n endTracking(c)\n }\n}\n\nconst updateSignal = (s: AlienSignal, value: T): boolean => {\n s.flags_ = 1 satisfies ReactiveFlags.Mutable\n return s.previousValue !== (s.previousValue = value)\n}\n\nconst notify = (e: AlienEffect): void => {\n const flags = e.flags_\n if (!(flags & EffectFlags.Queued)) {\n e.flags_ = flags | EffectFlags.Queued\n const subs = e.subs_\n if (subs) {\n notify(subs.sub_ as AlienEffect)\n } else {\n queuedEffects[queuedEffectsLength++] = e\n }\n }\n}\n\nconst run = (e: AlienEffect, flags: ReactiveFlags): void => {\n if (\n flags & (16 satisfies ReactiveFlags.Dirty) ||\n (flags & (32 satisfies ReactiveFlags.Pending) && checkDirty(e.deps_!, e))\n ) {\n startPeeking(e)\n startTracking(e)\n beginBatch()\n try {\n e.fn_()\n } finally {\n endBatch()\n stopPeeking()\n endTracking(e)\n }\n return\n }\n if (flags & (32 satisfies ReactiveFlags.Pending)) {\n e.flags_ = flags & ~(32 satisfies ReactiveFlags.Pending)\n }\n let link = e.deps_\n while (link) {\n const dep = link.dep_\n const depFlags = dep.flags_\n if (depFlags & EffectFlags.Queued) {\n run(dep as AlienEffect, (dep.flags_ = depFlags & ~EffectFlags.Queued))\n }\n link = link.nextDep_\n }\n}\n\nconst signalOper = (s: AlienSignal, ...value: [T]): T | boolean => {\n if (value.length) {\n if (s.value_ !== (s.value_ = value[0])) {\n s.flags_ = 17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty\n const subs = s.subs_\n if (subs) {\n propagate(subs)\n if (!batchDepth) {\n flush()\n }\n }\n return true\n }\n return false\n }\n const currentValue = s.value_\n if (s.flags_ & (16 satisfies ReactiveFlags.Dirty)) {\n if (updateSignal(s, currentValue)) {\n const subs_ = s.subs_\n if (subs_) {\n shallowPropagate(subs_)\n }\n }\n }\n if (activeSub) {\n link(s, activeSub)\n }\n return currentValue\n}\n\nconst computedOper = (c: AlienComputed): T => {\n const flags = c.flags_\n if (\n flags & (16 satisfies ReactiveFlags.Dirty) ||\n (flags & (32 satisfies ReactiveFlags.Pending) && checkDirty(c.deps_!, c))\n ) {\n if (updateComputed(c)) {\n const subs = c.subs_\n if (subs) {\n shallowPropagate(subs)\n }\n }\n } else if (flags & (32 satisfies ReactiveFlags.Pending)) {\n c.flags_ = flags & ~(32 satisfies ReactiveFlags.Pending)\n }\n if (activeSub) {\n link(c, activeSub)\n }\n return c.value_!\n}\n\nconst effectOper = (e: AlienEffect): void => {\n let dep = e.deps_\n while (dep) {\n dep = unlink(dep, e)\n }\n const sub = e.subs_\n if (sub) {\n unlink(sub)\n }\n e.flags_ = 0 satisfies ReactiveFlags.None\n}\n\nconst link = (dep: ReactiveNode, sub: ReactiveNode): void => {\n const prevDep = sub.depsTail_\n if (prevDep && prevDep.dep_ === dep) {\n return\n }\n const nextDep = prevDep ? prevDep.nextDep_ : sub.deps_\n if (nextDep && nextDep.dep_ === dep) {\n nextDep.version_ = version\n sub.depsTail_ = nextDep\n return\n }\n const prevSub = dep.subsTail_\n if (prevSub && prevSub.version_ === version && prevSub.sub_ === sub) {\n return\n }\n const newLink =\n (sub.depsTail_ =\n dep.subsTail_ =\n {\n version_: version,\n dep_: dep,\n sub_: sub,\n prevDep_: prevDep,\n nextDep_: nextDep,\n prevSub_: prevSub,\n })\n if (nextDep) {\n nextDep.prevDep_ = newLink\n }\n if (prevDep) {\n prevDep.nextDep_ = newLink\n } else {\n sub.deps_ = newLink\n }\n if (prevSub) {\n prevSub.nextSub_ = newLink\n } else {\n dep.subs_ = newLink\n }\n}\n\nconst unlink = (link: Link, sub = link.sub_): Link | undefined => {\n const dep_ = link.dep_\n const prevDep_ = link.prevDep_\n const nextDep_ = link.nextDep_\n const nextSub_ = link.nextSub_\n const prevSub_ = link.prevSub_\n if (nextDep_) {\n nextDep_.prevDep_ = prevDep_\n } else {\n sub.depsTail_ = prevDep_\n }\n if (prevDep_) {\n prevDep_.nextDep_ = nextDep_\n } else {\n sub.deps_ = nextDep_\n }\n if (nextSub_) {\n nextSub_.prevSub_ = prevSub_\n } else {\n dep_.subsTail_ = prevSub_\n }\n if (prevSub_) {\n prevSub_.nextSub_ = nextSub_\n } else if (!(dep_.subs_ = nextSub_)) {\n if ('getter' in dep_) {\n let toRemove = dep_.deps_\n if (toRemove) {\n dep_.flags_ = 17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty\n do {\n toRemove = unlink(toRemove, dep_)\n } while (toRemove)\n }\n } else if (!('previousValue' in dep_)) {\n effectOper(dep_ as AlienEffect)\n }\n }\n return nextDep_\n}\n\nconst propagate = (link: Link): void => {\n let next = link.nextSub_\n let stack: Stack | undefined\n\n top: while (true) {\n const sub = link.sub_\n\n let flags = sub.flags_\n\n if (\n !(\n flags &\n (60 as\n | ReactiveFlags.RecursedCheck\n | ReactiveFlags.Recursed\n | ReactiveFlags.Dirty\n | ReactiveFlags.Pending)\n )\n ) {\n sub.flags_ = flags | (32 satisfies ReactiveFlags.Pending)\n } else if (\n !(flags & (12 as ReactiveFlags.RecursedCheck | ReactiveFlags.Recursed))\n ) {\n flags = 0 satisfies ReactiveFlags.None\n } else if (!(flags & (4 satisfies ReactiveFlags.RecursedCheck))) {\n sub.flags_ =\n (flags & ~(8 satisfies ReactiveFlags.Recursed)) |\n (32 satisfies ReactiveFlags.Pending)\n } else if (\n !(flags & (48 as ReactiveFlags.Dirty | ReactiveFlags.Pending)) &&\n isValidLink(link, sub)\n ) {\n sub.flags_ =\n flags | (40 as ReactiveFlags.Recursed | ReactiveFlags.Pending)\n flags &= 1 satisfies ReactiveFlags.Mutable\n } else {\n flags = 0 satisfies ReactiveFlags.None\n }\n\n if (flags & (2 satisfies ReactiveFlags.Watching)) {\n notify(sub as AlienEffect)\n }\n\n if (flags & (1 satisfies ReactiveFlags.Mutable)) {\n const subSubs = sub.subs_\n if (subSubs) {\n const nextSub = (link = subSubs).nextSub_\n if (nextSub) {\n stack = { value_: next, prev_: stack }\n next = nextSub\n }\n continue\n }\n }\n\n if ((link = next!)) {\n next = link.nextSub_\n continue\n }\n\n while (stack) {\n link = stack.value_!\n stack = stack.prev_\n if (link) {\n next = link.nextSub_\n continue top\n }\n }\n\n break\n }\n}\n\nconst startTracking = (sub: ReactiveNode): void => {\n version++\n sub.depsTail_ = undefined\n sub.flags_ =\n (sub.flags_ &\n ~(56 as\n | ReactiveFlags.Recursed\n | ReactiveFlags.Dirty\n | ReactiveFlags.Pending)) |\n (4 satisfies ReactiveFlags.RecursedCheck)\n}\n\nconst endTracking = (sub: ReactiveNode): void => {\n const depsTail_ = sub.depsTail_\n let toRemove = depsTail_ ? depsTail_.nextDep_ : sub.deps_\n while (toRemove) {\n toRemove = unlink(toRemove, sub)\n }\n sub.flags_ &= ~(4 satisfies ReactiveFlags.RecursedCheck)\n}\n\nconst checkDirty = (link: Link, sub: ReactiveNode): boolean => {\n let stack: Stack | undefined\n let checkDepth = 0\n let dirty = false\n\n top: while (true) {\n const dep = link.dep_\n const flags = dep.flags_\n\n if (sub.flags_ & (16 satisfies ReactiveFlags.Dirty)) {\n dirty = true\n } else if (\n (flags & (17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty)) ===\n (17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty)\n ) {\n if (update(dep as AlienSignal | AlienComputed)) {\n const subs = dep.subs_!\n if (subs.nextSub_) {\n shallowPropagate(subs)\n }\n dirty = true\n }\n } else if (\n (flags & (33 as ReactiveFlags.Mutable | ReactiveFlags.Pending)) ===\n (33 as ReactiveFlags.Mutable | ReactiveFlags.Pending)\n ) {\n if (link.nextSub_ || link.prevSub_) {\n stack = { value_: link, prev_: stack }\n }\n link = dep.deps_!\n sub = dep\n ++checkDepth\n continue\n }\n\n if (!dirty) {\n const nextDep = link.nextDep_\n if (nextDep) {\n link = nextDep\n continue\n }\n }\n\n while (checkDepth--) {\n const firstSub = sub.subs_!\n const hasMultipleSubs = firstSub.nextSub_\n if (hasMultipleSubs) {\n link = stack!.value_\n stack = stack!.prev_\n } else {\n link = firstSub\n }\n if (dirty) {\n if (update(sub as AlienSignal | AlienComputed)) {\n if (hasMultipleSubs) {\n shallowPropagate(firstSub)\n }\n sub = link.sub_\n continue\n }\n dirty = false\n } else {\n sub.flags_ &= ~(32 satisfies ReactiveFlags.Pending)\n }\n sub = link.sub_\n if (link.nextDep_) {\n link = link.nextDep_\n continue top\n }\n }\n\n return dirty\n }\n}\n\nconst shallowPropagate = (link: Link): void => {\n do {\n const sub = link.sub_\n const flags = sub.flags_\n if (\n (flags & (48 as ReactiveFlags.Pending | ReactiveFlags.Dirty)) ===\n (32 satisfies ReactiveFlags.Pending)\n ) {\n sub.flags_ = flags | (16 satisfies ReactiveFlags.Dirty)\n if (flags & (2 satisfies ReactiveFlags.Watching)) {\n notify(sub as AlienEffect)\n }\n }\n } while ((link = link.nextSub_!))\n}\n\nconst isValidLink = (checkLink: Link, sub: ReactiveNode): boolean => {\n let link = sub.depsTail_\n while (link) {\n if (link === checkLink) {\n return true\n }\n link = link.prevDep_\n }\n return false\n}\n\nexport const getPath = (path: string): T | undefined => {\n let result = root\n const split = path.split('.')\n for (const path of split) {\n if (result == null || !hasOwn(result, path)) {\n return\n }\n result = result[path]\n }\n return result as T\n}\n\nconst deep = (value: any, prefix = ''): any => {\n const isArr = Array.isArray(value)\n if (isArr || isPojo(value)) {\n const deepObj = (isArr ? [] : {}) as Record>\n for (const key in value) {\n deepObj[key] = signal(\n deep((value as Record>)[key], `${prefix + key}.`),\n )\n }\n const keys = signal(0)\n return new Proxy(deepObj, {\n get(_, prop: string) {\n // JSON.stringify calls `.toJSON()` directly instead of checking if it exists on the object\n // so we have to check if `toJSON` is being called and prevent a signal from automatically\n // being made so JSON.stringify can fallback to the default stringify\n if (!(prop === 'toJSON' && !hasOwn(deepObj, prop))) {\n // special case for when prop is an array function because every array function needs to\n // be reactive to when the keys change\n if (isArr && prop in Array.prototype) {\n keys()\n return deepObj[prop]\n }\n // if prop is a symbol just return the symbol because we don't want to make up that theres\n // an iterator symbol on an object or not\n if (typeof prop === 'symbol') {\n return deepObj[prop]\n }\n // if obj doesnt have prop OR prop is null or undefined then create a signal and default\n // to an empty string\n if (!hasOwn(deepObj, prop) || deepObj[prop]() == null) {\n deepObj[prop] = signal('')\n dispatch(prefix + prop, '')\n keys(keys() + 1)\n }\n return deepObj[prop]()\n }\n },\n set(_, prop: string, newValue) {\n const path = prefix + prop\n // special case for when setting length so we can make a diff patch\n if (isArr && prop === 'length') {\n const diff = (deepObj[prop] as unknown as number) - newValue\n deepObj[prop] = newValue\n // manually make a diff patch for now, shouldnt have to do this when object diffing is\n // implemented. see https://github.com/starfederation/datastar-dev/issues/274\n if (diff > 0) {\n const patch: Record = {}\n for (let i = newValue; i < deepObj[prop]; i++) {\n patch[i] = null\n }\n dispatch(prefix.slice(0, -1), patch)\n keys(keys() + 1)\n }\n } else if (hasOwn(deepObj, prop)) {\n if (newValue == null) {\n delete deepObj[prop]\n // if newValue is a computed set the computed directly instead of wrapping in signal\n } else if (hasOwn(newValue, computedSymbol)) {\n deepObj[prop] = newValue\n dispatch(path, '')\n // if prop changed after setting it then dispatch\n } else {\n const currentValue = deepObj[prop]()\n const pathStr = `${path}.`\n if (isPojo(currentValue) && isPojo(newValue)) {\n for (const key in currentValue) {\n if (!hasOwn(newValue, key)) {\n delete currentValue[key]\n dispatch(pathStr + key, null)\n }\n }\n for (const key in newValue) {\n const nextVal = newValue[key]\n if (currentValue[key] !== nextVal) {\n currentValue[key] = nextVal\n }\n }\n } else if (deepObj[prop](deep(newValue, pathStr))) {\n dispatch(path, newValue)\n }\n }\n // if newValue is null or undefined then noop\n } else if (newValue != null) {\n // if newValue is a computed set the computed directly instead of wrapping in signal\n if (hasOwn(newValue, computedSymbol)) {\n deepObj[prop] = newValue\n dispatch(path, '')\n } else {\n deepObj[prop] = signal(deep(newValue, `${path}.`))\n dispatch(path, newValue)\n }\n keys(keys() + 1)\n }\n\n return true\n },\n deleteProperty(_, prop: string) {\n delete deepObj[prop]\n keys(keys() + 1)\n return true\n },\n ownKeys() {\n keys()\n return Reflect.ownKeys(deepObj)\n },\n has(_, prop) {\n keys()\n return prop in deepObj\n },\n })\n }\n return value\n}\n\nconst dispatch = (path?: string, value?: any) => {\n if (path !== undefined && value !== undefined) {\n currentPatch.push([path, value])\n }\n if (!batchDepth && currentPatch.length) {\n const detail = pathToObj(currentPatch)\n currentPatch.length = 0\n document.dispatchEvent(\n new CustomEvent(DATASTAR_SIGNAL_PATCH_EVENT, {\n detail,\n }),\n )\n }\n}\n\nexport const mergePatch = (\n patch: JSONPatch,\n { ifMissing }: MergePatchArgs = {},\n): void => {\n beginBatch()\n for (const key in patch) {\n if (patch[key] == null) {\n if (!ifMissing) {\n delete root[key]\n }\n } else {\n mergeInner(patch[key], key, root, '', ifMissing)\n }\n }\n endBatch()\n}\n\nexport const mergePaths = (paths: Paths, options?: MergePatchArgs): void =>\n mergePatch(pathToObj(paths), options)\n\nconst mergeInner = (\n patch: any,\n target: string,\n targetParent: Record,\n prefix: string,\n ifMissing: boolean | undefined,\n): void => {\n if (isPojo(patch)) {\n if (\n !(\n hasOwn(targetParent, target) &&\n (isPojo(targetParent[target]) || Array.isArray(targetParent[target]))\n )\n ) {\n targetParent[target] = {}\n }\n\n for (const key in patch) {\n if (patch[key] == null) {\n if (!ifMissing) {\n delete targetParent[target][key]\n }\n } else {\n mergeInner(\n patch[key],\n key,\n targetParent[target],\n `${prefix + target}.`,\n ifMissing,\n )\n }\n }\n } else if (!(ifMissing && hasOwn(targetParent, target))) {\n targetParent[target] = patch\n }\n}\n\nconst toRegExp = (val: string | RegExp): RegExp =>\n typeof val === 'string' ? RegExp(val.replace(/^\\/|\\/$/g, '')) : val\n\n/**\n * Filters the root store based on an include and exclude RegExp\n *\n * @returns The filtered object\n */\nexport const filtered = (\n { include = /.*/, exclude = /(?!)/ }: SignalFilterOptions = {},\n obj: JSONPatch = root,\n): Record => {\n const includeRe = toRegExp(include)\n const excludeRe = toRegExp(exclude)\n const paths: Paths = []\n const stack: [any, string][] = [[obj, '']]\n\n while (stack.length) {\n const [node, prefix] = stack.pop()!\n\n for (const key in node) {\n const path = prefix + key\n if (isPojo(node[key])) {\n stack.push([node[key], `${path}.`])\n } else if (includeRe.test(path) && !excludeRe.test(path)) {\n paths.push([path, getPath(path)])\n }\n }\n }\n\n return pathToObj(paths)\n}\n\nexport const root: Record = deep({})\n", "import type { HTMLOrSVG } from '@engine/types'\n\nexport const isHTMLOrSVG = (el: Node): el is HTMLOrSVG =>\n el instanceof HTMLElement ||\n el instanceof SVGElement ||\n el instanceof MathMLElement\n", "import type { Modifiers } from '@engine/types'\n\nexport const kebab = (str: string): string =>\n str\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1-$2')\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/([a-z])([0-9]+)/gi, '$1-$2')\n .replace(/([0-9]+)([a-z])/gi, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase()\n\nexport const camel = (str: string): string =>\n kebab(str).replace(/-./g, (x) => x[1].toUpperCase())\n\nexport const snake = (str: string): string => kebab(str).replace(/-/g, '_')\n\nexport const pascal = (str: string): string =>\n camel(str).replace(/(^.|(?<=\\.).)/g, (x) => x[0].toUpperCase())\n\nexport const title = (str: string): string =>\n str.replace(/\\b\\w/g, (char) => char.toUpperCase())\n\nconst RE_FUNCTION_LITERAL =\n /^(?:(?:async\\s+)?function\\b|(?:async\\s*)?(?:\\([^)]*\\)|[A-Za-z_$][\\w$]*)\\s*=>)/\n\ntype JsStrToObjectOptions = {\n reviveFunctionStrings?: boolean\n}\n\nexport const jsStrToObject = (\n raw: string,\n options: JsStrToObjectOptions = {},\n) => {\n const { reviveFunctionStrings = false } = options\n try {\n if (!reviveFunctionStrings) return JSON.parse(raw)\n return JSON.parse(raw, (_k, value) => {\n if (typeof value !== 'string') return value\n const trimmed = value.trim()\n if (!RE_FUNCTION_LITERAL.test(trimmed)) return value\n try {\n const revived = Function(`return (${trimmed})`)()\n return typeof revived === 'function' ? revived : value\n } catch {\n return value\n }\n })\n } catch {\n // If JSON parsing fails, try to evaluate as a JavaScript object\n // This is less safe and should be used with caution\n return Function(`return (${raw})`)()\n }\n}\n\nconst caseFns: Record string> = {\n camel: (str) => str.replace(/-[a-z]/g, (x) => x[1].toUpperCase()),\n snake: (str) => str.replace(/-/g, '_'),\n pascal: (str) => str[0].toUpperCase() + caseFns.camel(str.slice(1)),\n}\n\nexport const modifyCasing = (\n str: string,\n mods: Modifiers,\n defaultCase = 'camel',\n): string => {\n for (const c of mods.get('case') || [defaultCase]) {\n str = caseFns[c]?.(str) || str\n }\n return str\n}\n\nexport const aliasify = (name: string) =>\n ALIAS ? `data-${ALIAS}-${name}` : `data-${name}`\n\nexport const unaliasify = (name: string) => {\n if (!ALIAS) return name\n if (!name.startsWith(`${ALIAS}-`)) return null\n return name.slice(ALIAS.length + 1)\n}\n", "import {\n DATASTAR_FETCH_EVENT,\n DATASTAR_READY_EVENT,\n DSP,\n DSS,\n} from '@engine/consts'\nimport { root } from '@engine/signals'\nimport type {\n ActionContext,\n ActionPlugin,\n AttributeContext,\n AttributePlugin,\n DatastarFetchEvent,\n HTMLOrSVG,\n Modifiers,\n Requirement,\n WatcherPlugin,\n} from '@engine/types'\nimport { isHTMLOrSVG } from '@utils/dom'\nimport { aliasify, snake, unaliasify } from '@utils/text'\n\nconst url = 'https://data-star.dev/errors'\n\nconst error = (\n ctx: Record,\n reason: string,\n metadata: Record = {},\n) => {\n Object.assign(metadata, ctx)\n const e = new Error()\n const r = snake(reason)\n const q = new URLSearchParams({\n metadata: JSON.stringify(metadata),\n }).toString()\n const c = JSON.stringify(metadata, null, 2)\n e.message = `${reason}\\nMore info: ${url}/${r}?${q}\\nContext: ${c}`\n return e\n}\n\nconst actionPlugins: Map = new Map()\nconst attributePlugins: Map = new Map()\nconst watcherPlugins: Map = new Map()\n\nexport const actions: Record<\n string,\n (ctx: ActionContext, ...args: any[]) => any\n> = new Proxy(\n {},\n {\n get: (_, prop: string) => actionPlugins.get(prop)?.apply,\n has: (_, prop: string) => actionPlugins.has(prop),\n ownKeys: () => Reflect.ownKeys(actionPlugins),\n set: () => false,\n deleteProperty: () => false,\n },\n)\n\n// Map of cleanups keyed by element, attribute name, and cleanup name\nconst removals = new Map void>>>()\n\nconst queuedAttributes: AttributePlugin[] = []\nconst queuedAttributeNames = new Set()\nconst observedRoots = new Set()\nlet datastarReadyDispatched = false\n\nexport const attribute = (\n plugin: AttributePlugin,\n): void => {\n queuedAttributes.push(plugin as unknown as AttributePlugin)\n\n if (queuedAttributes.length === 1) {\n setTimeout(() => {\n for (const attribute of queuedAttributes) {\n queuedAttributeNames.add(attribute.name)\n attributePlugins.set(attribute.name, attribute)\n }\n queuedAttributes.length = 0\n const roots = observedRoots.size\n ? [...observedRoots]\n : [document.documentElement]\n for (const root of roots) {\n applyQueued(root, !observedRoots.has(root))\n }\n queuedAttributeNames.clear()\n })\n }\n}\n\nexport const action = (plugin: ActionPlugin): void => {\n actionPlugins.set(plugin.name, plugin)\n}\n\ndocument.addEventListener(DATASTAR_FETCH_EVENT, ((\n evt: CustomEvent,\n) => {\n const plugin = watcherPlugins.get(evt.detail.type)\n if (plugin) {\n plugin.apply(\n {\n error: error.bind(0, {\n plugin: { type: 'watcher', name: plugin.name },\n element: {\n id: (evt.target as Element).id,\n tag: (evt.target as Element).tagName,\n },\n }),\n },\n evt.detail.argsRaw,\n )\n }\n}) as EventListener)\n\nexport const watcher = (plugin: WatcherPlugin): void => {\n watcherPlugins.set(plugin.name, plugin)\n}\n\nconst cleanupEls = (els: Iterable): void => {\n for (const el of els) {\n const elCleanups = removals.get(el)\n if (elCleanups && removals.delete(el)) {\n for (const attrCleanups of elCleanups.values()) {\n for (const cleanup of attrCleanups.values()) {\n cleanup()\n }\n }\n }\n }\n}\n\nconst aliasedIgnore = aliasify('ignore')\nconst aliasedIgnoreAttr = `[${aliasedIgnore}]`\nconst shouldIgnore = (el: HTMLOrSVG) =>\n el.hasAttribute(`${aliasedIgnore}__self`) || !!el.closest(aliasedIgnoreAttr)\n\nconst applyEls = (els: Iterable, onlyNew?: boolean): void => {\n for (const el of els) {\n if (!shouldIgnore(el)) {\n const appliedKeys = new Set()\n for (const key in el.dataset) {\n const attrKey = key.replace(/[A-Z]/g, '-$&').toLowerCase()\n appliedKeys.add(attrKey)\n applyAttributePlugin(el, attrKey, el.dataset[key]!, onlyNew)\n }\n for (const attr of Array.from(el.attributes)) {\n if (!attr.name.startsWith('data-')) continue\n const attrKey = attr.name.slice(5)\n if (appliedKeys.has(attrKey)) continue\n applyAttributePlugin(el, attrKey, attr.value, onlyNew)\n }\n }\n }\n}\n\nconst observe = (mutations: MutationRecord[]) => {\n for (const {\n target,\n type,\n attributeName,\n addedNodes,\n removedNodes,\n } of mutations) {\n if (type === 'childList') {\n for (const node of removedNodes) {\n if (isHTMLOrSVG(node)) {\n cleanupEls([node])\n cleanupEls(node.querySelectorAll('*'))\n }\n }\n\n for (const node of addedNodes) {\n if (isHTMLOrSVG(node)) {\n applyEls([node])\n applyEls(node.querySelectorAll('*'))\n }\n }\n } else if (\n type === 'attributes' &&\n attributeName!.startsWith('data-') &&\n isHTMLOrSVG(target) &&\n !shouldIgnore(target)\n ) {\n // skip over 'data-'\n const rawAttrKey = attributeName!.slice(5)\n const key = unaliasify(rawAttrKey)\n if (!key) continue\n const value = target.getAttribute(attributeName!)\n if (value === null) {\n const elCleanups = removals.get(target)\n if (elCleanups) {\n const attrCleanups = elCleanups.get(key)\n if (attrCleanups) {\n for (const cleanup of attrCleanups.values()) {\n cleanup()\n }\n elCleanups.delete(key)\n }\n }\n } else {\n applyAttributePlugin(target, rawAttrKey, value)\n }\n }\n }\n}\n\n// TODO: mutation observer per root so applying to web component doesnt overwrite main observer\nconst mutationObserver = new MutationObserver(observe)\n\nexport const parseAttributeKey = (\n rawKey: string,\n): {\n pluginName: string\n key: string | undefined\n mods: Modifiers\n} => {\n const [namePart, ...rawModifiers] = rawKey.split('__')\n const [pluginName, key] = namePart.split(/:(.+)/)\n const mods: Modifiers = new Map()\n\n for (const rawMod of rawModifiers) {\n const [label, ...mod] = rawMod.split('.')\n mods.set(label, new Set(mod))\n }\n\n return { pluginName, key, mods }\n}\n\nexport const isDocumentObserverActive = () =>\n observedRoots.has(document.documentElement)\n\nconst dispatchDatastarReady = () => {\n if (datastarReadyDispatched || !isDocumentObserverActive()) return\n datastarReadyDispatched = true\n document.dispatchEvent(new Event(DATASTAR_READY_EVENT))\n}\n\nconst applyQueued = (\n root: HTMLOrSVG | ShadowRoot = document.documentElement,\n observeRoot = true,\n): void => {\n if (isHTMLOrSVG(root)) {\n applyEls([root], true)\n }\n applyEls(root.querySelectorAll('*'), true)\n\n if (observeRoot) {\n mutationObserver.observe(root, {\n subtree: true,\n childList: true,\n attributes: true,\n })\n observedRoots.add(root)\n dispatchDatastarReady()\n }\n}\n\nexport const apply = (\n root: HTMLOrSVG | ShadowRoot = document.documentElement,\n observeRoot = true,\n): void => {\n if (isHTMLOrSVG(root)) {\n applyEls([root])\n }\n applyEls(root.querySelectorAll('*'))\n\n if (observeRoot) {\n mutationObserver.observe(root, {\n subtree: true,\n childList: true,\n attributes: true,\n })\n observedRoots.add(root)\n dispatchDatastarReady()\n }\n}\n\nexport const applyElement = (el: HTMLOrSVG, onlyNew = false): void => {\n applyEls([el], onlyNew)\n}\n\nconst applyAttributePlugin = (\n el: HTMLOrSVG,\n attrKey: string,\n value: string,\n onlyNew?: boolean,\n): void => {\n const rawKey = unaliasify(attrKey)\n if (!rawKey) return\n const { pluginName, key, mods } = parseAttributeKey(rawKey)\n const plugin = attributePlugins.get(pluginName)\n const shouldApply =\n (!onlyNew || queuedAttributeNames.has(pluginName)) && !!plugin\n if (shouldApply) {\n const ctx = {\n el,\n rawKey,\n mods,\n error: error.bind(0, {\n plugin: { type: 'attribute', name: plugin.name },\n element: { id: el.id, tag: el.tagName },\n expression: { rawKey, key, value },\n }),\n key,\n value,\n loadedPluginNames: {\n actions: new Set(actionPlugins.keys()),\n attributes: new Set(attributePlugins.keys()),\n },\n rx: undefined,\n } as AttributeContext\n\n const keyReq =\n (plugin.requirement &&\n (typeof plugin.requirement === 'string'\n ? plugin.requirement\n : plugin.requirement.key)) ||\n 'allowed'\n const valueReq =\n (plugin.requirement &&\n (typeof plugin.requirement === 'string'\n ? plugin.requirement\n : plugin.requirement.value)) ||\n 'allowed'\n\n const keyProvided = key !== undefined && key !== null && key !== ''\n const valueProvided = value !== undefined && value !== null && value !== ''\n\n if (keyProvided) {\n if (keyReq === 'denied') {\n throw ctx.error('KeyNotAllowed')\n }\n } else if (keyReq === 'must') {\n throw ctx.error('KeyRequired')\n }\n\n if (valueProvided) {\n if (valueReq === 'denied') {\n throw ctx.error('ValueNotAllowed')\n }\n } else if (valueReq === 'must') {\n throw ctx.error('ValueRequired')\n }\n\n if (keyReq === 'exclusive' || valueReq === 'exclusive') {\n if (keyProvided && valueProvided) {\n throw ctx.error('KeyAndValueProvided')\n }\n if (!keyProvided && !valueProvided) {\n throw ctx.error('KeyOrValueRequired')\n }\n }\n\n const cleanups = new Map void>()\n if (valueProvided) {\n let cachedRx: GenRxFn\n ctx.rx = (...args: any[]) => {\n if (!cachedRx) {\n cachedRx = genRx(value, {\n returnsValue: plugin.returnsValue,\n argNames: plugin.argNames,\n cleanups,\n })\n }\n return cachedRx(el, ...args)\n }\n }\n\n const cleanup = plugin.apply(ctx)\n if (cleanup) {\n cleanups.set('attribute', cleanup)\n }\n\n let elCleanups = removals.get(el)\n if (elCleanups) {\n const attrCleanups = elCleanups.get(rawKey)\n if (attrCleanups) {\n for (const oldCleanup of attrCleanups.values()) {\n oldCleanup()\n }\n }\n } else {\n elCleanups = new Map()\n removals.set(el, elCleanups)\n }\n elCleanups.set(rawKey, cleanups)\n }\n}\n\ntype GenRxOptions = {\n returnsValue?: boolean\n argNames?: string[]\n cleanups?: Map void>\n}\n\ntype GenRxFn = (el: HTMLOrSVG, ...args: any[]) => T\n\nexport const genRx = (\n value: string,\n {\n returnsValue = false,\n argNames = [],\n cleanups = new Map(),\n }: GenRxOptions = {},\n): GenRxFn => {\n let expr = ''\n if (returnsValue) {\n // This regex allows Datastar expressions to support nested\n // regex and strings that contain ; without breaking.\n //\n // Each of these regex defines a block type we want to match\n // (importantly we ignore the content within these blocks):\n //\n // regex \\/(\\\\\\/|[^\\/])*\\/\n // double quotes \"(\\\\\"|[^\\\"])*\"\n // single quotes '(\\\\'|[^'])*'\n // ticks `(\\\\`|[^`])*`\n // iife \\(\\s*((function)\\s*\\(\\s*\\)|(\\(\\s*\\))\\s*=>)\\s*(?:\\{[\\s\\S]*?\\}|[^;)\\{]*)\\s*\\)\\s*\\(\\s*\\)\n //\n // The iife support is (intentionally) limited. It only supports\n // function and arrow syntax with no arguments, and no nested IIFEs.\n //\n // We also want to match the non delimiter part of statements\n // note we only support ; statement delimiters:\n //\n // [^;]\n //\n const statementRe =\n /(\\/(\\\\\\/|[^/])*\\/|\"(\\\\\"|[^\"])*\"|'(\\\\'|[^'])*'|`(\\\\`|[^`])*`|\\(\\s*((function)\\s*\\(\\s*\\)|(\\(\\s*\\))\\s*=>)\\s*(?:\\{[\\s\\S]*?\\}|[^;){]*)\\s*\\)\\s*\\(\\s*\\)|[^;])+/gm\n const statements = value.trim().match(statementRe)\n if (statements) {\n const lastIdx = statements.length - 1\n const last = statements[lastIdx].trim()\n if (!last.startsWith('return')) {\n statements[lastIdx] = `return (${last});`\n }\n expr = statements.join(';\\n')\n }\n } else {\n expr = value.trim()\n }\n\n // Ignore any escaped values\n const escaped = new Map()\n const escapeRe = RegExp(`(?:${DSP})(.*?)(?:${DSS})`, 'gm')\n let counter = 0\n for (const match of expr.matchAll(escapeRe)) {\n const k = match[1]\n const v = `__escaped${counter++}`\n escaped.set(v, k)\n expr = expr.replace(DSP + k + DSS, v)\n }\n\n // Replace signal references with bracket notation\n // Examples:\n // $count -> $['count']\n // $count-- -> $['count']--\n // $foo.bar -> $['foo']['bar']\n // $foo-bar -> $['foo-bar']\n // $foo.bar-baz -> $['foo']['bar-baz']\n // $foo-$bar -> $['foo']-$['bar']\n // $arr[$index] -> $['arr'][$['index']]\n // $['foo'] -> $['foo']\n // $foo[obj.bar] -> $['foo'][obj.bar]\n // $foo['bar.baz'] -> $['foo']['bar.baz']\n // $123 -> $['123']\n // $foo.0.name -> $['foo']['0']['name']\n\n // Skip replacements inside string/template literals.\n // Template interpolation support rewrites `${...}` only when braces are non-nested.\n expr = expr.replace(\n /(\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*'|`(?:\\\\.|[^`\\\\$]|\\$(?!\\{))*`)|\\$\\{([^{}]*)\\}|\\$([a-zA-Z_\\d]\\w*(?:[.-]\\w+)*)/g,\n (match, quoted, interpolationExpr, signalName) => {\n if (quoted) return match\n if (interpolationExpr !== undefined) {\n return `\\${${interpolationExpr.replace(\n /\\$([a-zA-Z_\\d]\\w*(?:[.-]\\w+)*)/g,\n (_: string, innerSignalName: string) =>\n innerSignalName\n .split('.')\n .reduce((acc: string, part: string) => `${acc}['${part}']`, '$'),\n )}}`\n }\n return signalName\n .split('.')\n .reduce((acc: string, part: string) => `${acc}['${part}']`, '$')\n },\n )\n\n expr = expr.replaceAll(/@([A-Za-z_$][\\w$]*)\\(/g, '__action(\"$1\",evt,')\n\n // Replace any escaped values\n for (const [k, v] of escaped) {\n expr = expr.replace(k, v)\n }\n\n try {\n const fn = Function('el', '$', '__action', 'evt', ...argNames, expr)\n return (el: HTMLOrSVG, ...args: any[]) => {\n const action = (name: string, evt: Event | undefined, ...args: any[]) => {\n const err = error.bind(0, {\n plugin: { type: 'action', name },\n element: { id: el.id, tag: el.tagName },\n expression: {\n fnContent: expr,\n value,\n },\n })\n const fn = actions[name]\n if (fn) {\n return fn(\n {\n el,\n evt,\n error: err,\n cleanups,\n },\n ...args,\n )\n }\n throw err('UndefinedAction')\n }\n try {\n return fn(el, root, action, undefined, ...args)\n } catch (e: any) {\n console.error(e)\n throw error(\n {\n element: { id: el.id, tag: el.tagName },\n expression: {\n fnContent: expr,\n value,\n },\n error: e.message,\n },\n 'ExecuteExpression',\n )\n }\n }\n } catch (e: any) {\n console.error(e)\n throw error(\n {\n expression: {\n fnContent: expr,\n value,\n },\n error: e.message,\n },\n 'GenerateExpression',\n )\n }\n}\n", "// Icon: ion:eye\n// Slug: Access signals without subscribing to changes.\n// Description: Allows accessing signals without subscribing to their changes in expressions.\n\nimport { action } from '@engine'\nimport { startPeeking, stopPeeking } from '@engine/signals'\n\naction({\n name: 'peek',\n apply(_, fn: () => any) {\n startPeeking()\n try {\n return fn()\n } finally {\n stopPeeking()\n }\n },\n})\n", "// Icon: ion:checkmark-round\n// Slug: Sets the value of all matching signals.\n// Description: Sets the value of all matching signals (or all signals if no filter is used) to the expression provided in the first argument.\n\nimport { action } from '@engine'\nimport {\n filtered,\n mergePatch,\n startPeeking,\n stopPeeking,\n} from '@engine/signals'\nimport type { SignalFilterOptions } from '@engine/types'\nimport { updateLeaves } from '@utils/paths'\n\naction({\n name: 'setAll',\n apply(_, value: any, filter: SignalFilterOptions) {\n // peek because in an effect you would be subscribing to signals and then setting them which\n // would cause an infinite loop and why would you want to infinite loop on purpose\n startPeeking()\n const masked = filtered(filter)\n updateLeaves(masked, () => value)\n mergePatch(masked)\n stopPeeking()\n },\n})\n", "// Icon: material-symbols:toggle-off\n// Slug: Toggles the value of all matching signals.\n// Description: Toggles the boolean value of all matching signals (or all signals if no filter is used).\n\nimport { action } from '@engine'\nimport {\n filtered,\n mergePatch,\n startPeeking,\n stopPeeking,\n} from '@engine/signals'\nimport type { SignalFilterOptions } from '@engine/types'\nimport { updateLeaves } from '@utils/paths'\n\naction({\n name: 'toggleAll',\n apply(_, filter: SignalFilterOptions) {\n // peek because in an effect you would be subscribing to signals and then setting them which\n // would cause an infinite loop and why would you want to infinite loop on purpose\n startPeeking()\n const masked = filtered(filter)\n updateLeaves(masked, (oldValue: any) => !oldValue)\n mergePatch(masked)\n stopPeeking()\n },\n})\n", "// Icon: ion:eye\n// Slug: Access signals without subscribing to changes.\n// Description: Allows accessing signals without subscribing to their changes in expressions.\n\nimport { action } from '@engine'\nimport { DATASTAR_FETCH_EVENT } from '@engine/consts'\nimport { filtered, startPeeking, stopPeeking } from '@engine/signals'\nimport type {\n DatastarFetchEvent,\n HTMLOrSVG,\n SignalFilterOptions,\n WatcherArgs,\n} from '@engine/types'\nimport { kebab } from '@utils/text'\n\nconst abortControllers = new WeakMap()\nconst methodSupportsRequestBody = (method: string): boolean =>\n !['GET', 'DELETE'].includes(method)\n\nconst createHttpMethod = (\n name: string,\n method: string,\n openWhenHiddenDefault: boolean = true,\n): void =>\n action({\n name,\n apply: async (\n { el, evt, error, cleanups },\n url: string,\n {\n selector,\n headers: userHeaders,\n contentType = 'json',\n filterSignals: { include = /.*/, exclude = /(^|\\.)_/ } = {},\n openWhenHidden = openWhenHiddenDefault,\n payload,\n requestCancellation = 'auto',\n retry = 'auto',\n retryInterval = 1_000,\n retryScaler = 2,\n retryMaxWait = 30_000,\n retryMaxCount = 10,\n }: FetchArgs = {},\n ) => {\n const controller =\n requestCancellation instanceof AbortController\n ? requestCancellation\n : new AbortController()\n if (requestCancellation === 'auto' || requestCancellation === 'cleanup') {\n abortControllers.get(el)?.abort()\n abortControllers.set(el, controller)\n }\n if (requestCancellation === 'cleanup') {\n cleanups.get(`@${name}`)?.()\n cleanups.set(`@${name}`, async () => {\n controller.abort()\n // wait one tick for FINISHED to fire\n await Promise.resolve()\n })\n }\n\n let cleanupFn = () => {}\n\n try {\n if (!url?.length) {\n throw error('FetchNoUrlProvided', { action })\n }\n\n const initialHeaders: Record = {\n Accept: 'text/event-stream, text/html, application/json',\n 'Datastar-Request': true,\n }\n if (contentType === 'json' && methodSupportsRequestBody(method)) {\n initialHeaders['Content-Type'] = 'application/json'\n }\n const headers = Object.assign({}, initialHeaders, userHeaders)\n\n // We ignore the content-type header if using form data\n // if missing the boundary will be set automatically\n\n const req: FetchEventSourceInit = {\n input: '',\n method,\n headers,\n openWhenHidden,\n retry,\n retryInterval,\n retryScaler,\n retryMaxWait,\n retryMaxCount,\n signal: controller.signal,\n onopen: async (response: Response) => {\n if (response.status >= 400)\n dispatchFetch(ERROR, el, { status: response.status.toString() })\n },\n onmessage: (evt) => {\n if (!evt.event.startsWith('datastar')) return\n const type = evt.event\n const argsRawLines: Record = {}\n\n for (const line of evt.data.split('\\n')) {\n const i = line.indexOf(' ')\n const k = line.slice(0, i)\n const v = line.slice(i + 1)\n ;(argsRawLines[k] ||= []).push(v)\n }\n\n const argsRaw = Object.fromEntries(\n Object.entries(argsRawLines).map(([k, v]) => [k, v.join('\\n')]),\n )\n\n dispatchFetch(type, el, argsRaw)\n },\n onerror: (error) => {\n if (isWrongContent(error)) {\n // don't retry if the content-type is wrong\n throw error('FetchExpectedTextEventStream', { url })\n }\n // do nothing and it will retry\n if (error) {\n console.error(error.message)\n dispatchFetch(RETRYING, el, { message: error.message })\n }\n },\n }\n\n const buildFetchEventSourceInit = () => {\n const urlInstance = new URL(url, document.baseURI)\n const queryParams = new URLSearchParams(urlInstance.search)\n if (contentType === 'json') {\n startPeeking()\n const requestPayload =\n payload !== undefined ? payload : filtered({ include, exclude })\n stopPeeking()\n const body = JSON.stringify(requestPayload)\n if (methodSupportsRequestBody(method)) {\n req.body = body\n } else {\n queryParams.set('datastar', body)\n }\n } else if (contentType === 'form') {\n const formEl = (\n selector ? document.querySelector(selector) : el.closest('form')\n ) as HTMLFormElement\n if (!formEl) {\n throw error('FetchFormNotFound', { action, selector })\n }\n\n // Validate the form\n if (!formEl.noValidate && !formEl.checkValidity()) {\n formEl.reportValidity()\n return\n }\n\n // Collect the form data\n const formData = new FormData(formEl)\n let submitter = el as HTMLElement | null\n\n if (el === formEl && evt instanceof SubmitEvent) {\n // Get the submitter from the event\n submitter = evt.submitter\n } else {\n // Prevent the form being submitted\n const preventDefault = (evt: Event) => evt.preventDefault()\n formEl.addEventListener('submit', preventDefault)\n cleanupFn = () => {\n formEl.removeEventListener('submit', preventDefault)\n }\n }\n\n // Append the value of the form submitter if it is a valid submitter and has a name\n if (\n submitter instanceof HTMLButtonElement ||\n (submitter instanceof HTMLInputElement &&\n submitter.type === 'submit')\n ) {\n const name = submitter.getAttribute('name')\n if (name) formData.append(name, submitter.value)\n }\n\n const multipart =\n formEl.getAttribute('enctype') === 'multipart/form-data'\n // Leave the `Content-Type` header empty for multipart encoding so the browser can set it automatically with the correct boundary\n if (!multipart) {\n headers['Content-Type'] = 'application/x-www-form-urlencoded'\n }\n\n const formParams = new URLSearchParams(formData as any)\n if (methodSupportsRequestBody(method)) {\n if (multipart) {\n req.body = formData\n } else {\n req.body = formParams\n }\n } else {\n for (const [key, value] of formParams) {\n queryParams.append(key, value)\n }\n }\n } else {\n throw error('FetchInvalidContentType', { action, contentType })\n }\n urlInstance.search = queryParams.toString()\n req.input = urlInstance.toString()\n return req\n }\n\n dispatchFetch(STARTED, el, {})\n\n try {\n await fetchEventSource(el, buildFetchEventSourceInit)\n } catch (e: any) {\n if (!isWrongContent(e)) {\n throw error('FetchFailed', { method, url, error: e.message })\n }\n // exit gracefully and do nothing if the content-type is wrong\n // this can happen if the client is sending a request\n // where no response is expected, and they haven\u2019t\n // set the content-type to text/event-stream\n }\n } finally {\n dispatchFetch(FINISHED, el, {})\n cleanupFn()\n cleanups.delete(`@${name}`)\n }\n },\n })\n\ncreateHttpMethod('get', 'GET', false)\ncreateHttpMethod('patch', 'PATCH')\ncreateHttpMethod('post', 'POST')\ncreateHttpMethod('put', 'PUT')\ncreateHttpMethod('delete', 'DELETE')\n\nexport const STARTED = 'started'\nexport const FINISHED = 'finished'\nexport const ERROR = 'error'\nexport const RETRYING = 'retrying'\nexport const RETRIES_FAILED = 'retries-failed'\n\nconst dispatchFetch = (type: string, el: HTMLOrSVG, argsRaw: WatcherArgs) =>\n document.dispatchEvent(\n new CustomEvent(DATASTAR_FETCH_EVENT, {\n detail: { type, el, argsRaw },\n }),\n )\n\nconst isWrongContent = (err: any) => `${err}`.includes('text/event-stream')\n\ntype ResponseOverrides =\n | {\n selector?: string\n mode?: string\n namespace?: string\n useViewTransition?: boolean\n }\n | {\n onlyIfMissing?: boolean\n }\n\nexport type FetchArgs = {\n selector?: string\n headers?: Record\n contentType?: 'json' | 'form'\n filterSignals?: SignalFilterOptions\n openWhenHidden?: boolean\n payload?: any\n requestCancellation?: 'auto' | 'cleanup' | 'disabled' | AbortController\n responseOverrides?: ResponseOverrides\n retry?: 'auto' | 'error' | 'always' | 'never'\n retryInterval?: number\n retryScaler?: number\n retryMaxWait?: number\n retryMaxCount?: number\n}\n\n// Below originally from https://github.com/Azure/fetch-event-source/blob/main/LICENSE\n\n/**\n * Represents a message sent in an event stream\n * https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#Event_stream_format\n */\n\ninterface EventSourceMessage {\n id: string\n event: string\n data: string\n retry?: number\n}\n\n/**\n * Converts a ReadableStream into a callback pattern.\n * @param stream The input ReadableStream.\n * @param onChunk A function that will be called on each new byte chunk in the stream.\n * @returns {Promise} A promise that will be resolved when the stream closes.\n */\nconst getBytes = async (\n stream: ReadableStream,\n onChunk: (arr: Uint8Array) => void,\n): Promise => {\n const reader = stream.getReader()\n let result = await reader.read()\n while (!result.done) {\n onChunk(result.value)\n result = await reader.read()\n }\n}\n\nconst getLines = (onLine: (line: Uint8Array, fieldLength: number) => void) => {\n let buffer: Uint8Array | undefined\n let position: number // current read position\n let fieldLength: number // length of the `field` portion of the line\n let discardTrailingNewline = false\n\n // return a function that can process each incoming byte chunk:\n return (arr: Uint8Array) => {\n if (!buffer) {\n buffer = arr\n position = 0\n fieldLength = -1\n } else {\n // we're still parsing the old line. Append the new bytes into buffer:\n buffer = concat(buffer, arr)\n }\n\n const bufLength = buffer.length\n let lineStart = 0 // index where the current line starts\n while (position < bufLength) {\n if (discardTrailingNewline) {\n if (buffer[position] === 10) lineStart = ++position // skip to next char\n discardTrailingNewline = false\n }\n\n // start looking forward till the end of line:\n let lineEnd = -1 // index of the \\r or \\n char\n for (; position < bufLength && lineEnd === -1; ++position) {\n switch (buffer[position]) {\n case 58: // :\n if (fieldLength === -1) {\n // first colon in line\n fieldLength = position - lineStart\n }\n break\n // @ts-expect-error:7029 \\r case below should fallthrough to \\n:\n // biome-ignore lint/suspicious/noFallthroughSwitchClause: intentional fallthrough for CR to LF\n case 13: // \\r\n discardTrailingNewline = true\n case 10: // \\n\n lineEnd = position\n break\n }\n }\n\n if (lineEnd === -1) break // Wait for the next arr and then continue parsing\n\n // we've reached the line end, send it out:\n onLine(buffer.subarray(lineStart, lineEnd), fieldLength)\n lineStart = position // we're now on the next line\n fieldLength = -1\n }\n\n if (lineStart === bufLength)\n buffer = undefined // we've finished reading it\n else if (lineStart) {\n // Create a new view into buffer beginning at lineStart so we don't\n // need to copy over the previous lines when we get the new arr:\n buffer = buffer.subarray(lineStart)\n position -= lineStart\n }\n }\n}\n\nconst getMessages = (\n onId: (id: string) => void,\n onRetry: (retry: number) => void,\n onMessage?: (msg: EventSourceMessage) => void,\n): ((line: Uint8Array, fieldLength: number) => void) => {\n let message = newMessage()\n const decoder = new TextDecoder()\n\n // return a function that can process each incoming line buffer:\n return (line, fieldLength) => {\n if (!line.length) {\n // empty line denotes end of message. Trigger the callback and start a new message:\n onMessage?.(message)\n message = newMessage()\n } else if (fieldLength > 0) {\n // exclude comments and lines with no values\n // line is of format \":\" or \": \"\n // https://html.spec.whatwg.org/multipage/server-sent-events.html#event-stream-interpretation\n const field = decoder.decode(line.subarray(0, fieldLength))\n const valueOffset = fieldLength + (line[fieldLength + 1] === 32 ? 2 : 1)\n const value = decoder.decode(line.subarray(valueOffset))\n\n switch (field) {\n case 'data':\n message.data = message.data ? `${message.data}\\n${value}` : value\n break\n case 'event':\n message.event = value\n break\n case 'id':\n onId((message.id = value))\n break\n case 'retry': {\n const retry = +value\n if (!Number.isNaN(retry)) {\n // per spec, ignore non-integers\n onRetry((message.retry = retry))\n }\n break\n }\n }\n }\n }\n}\n\nconst concat = (a: Uint8Array, b: Uint8Array) => {\n const res = new Uint8Array(a.length + b.length)\n res.set(a)\n res.set(b, a.length)\n return res\n}\n\nconst newMessage = (): EventSourceMessage => ({\n // data, event, and id must be initialized to empty strings:\n // https://html.spec.whatwg.org/multipage/server-sent-events.html#event-stream-interpretation\n // retry should be initialized to undefined so we return a consistent shape\n // to the js engine all the time: https://mathiasbynens.be/notes/shapes-ics#takeaways\n data: '',\n event: '',\n id: '',\n retry: undefined,\n})\n\ntype FetchEventSourceInit =\n | (RequestInit & {\n input: RequestInfo\n headers?: Record\n onopen?: (response: Response) => Promise\n onmessage?: (ev: EventSourceMessage) => void\n onclose?: () => void\n onerror?: (err: any) => number | null | undefined | void\n openWhenHidden?: boolean\n fetch?: typeof fetch\n retry?: 'auto' | 'error' | 'always' | 'never'\n retryInterval?: number\n retryScaler?: number\n retryMaxWait?: number\n retryMaxCount?: number\n responseOverrides?: ResponseOverrides\n })\n | undefined\n\nconst fetchEventSource = (\n el: HTMLOrSVG,\n buildFetchEventSourceInit: () => FetchEventSourceInit,\n): Promise => {\n return new Promise((resolve, reject) => {\n const fetchInit = buildFetchEventSourceInit()\n if (!fetchInit) {\n return\n }\n let {\n input,\n signal: inputSignal,\n headers: inputHeaders,\n onopen: inputOnOpen,\n onmessage,\n onclose,\n onerror,\n openWhenHidden,\n fetch: inputFetch,\n retry = 'auto',\n retryInterval = 1_000,\n retryScaler = 2,\n retryMaxWait = 30_000,\n retryMaxCount = 10,\n responseOverrides,\n ...rest\n }: FetchEventSourceInit = fetchInit\n\n // make a copy of the input headers since we may modify it below:\n const headers: Record = {\n ...inputHeaders,\n }\n\n let curRequestController: AbortController\n const onVisibilityChange = () => {\n curRequestController.abort() // close existing request on every visibility change\n if (!document.hidden) {\n const currentFetchInit = buildFetchEventSourceInit()\n if (!currentFetchInit) return\n\n input = currentFetchInit.input\n rest.body = currentFetchInit.body\n create()\n }\n }\n\n if (!openWhenHidden) {\n document.addEventListener('visibilitychange', onVisibilityChange)\n }\n\n let retryTimer: ReturnType | undefined\n const dispose = () => {\n document.removeEventListener('visibilitychange', onVisibilityChange)\n clearTimeout(retryTimer)\n curRequestController.abort()\n }\n\n // if the incoming signal aborts, dispose resources and resolve:\n inputSignal?.addEventListener('abort', () => {\n dispose()\n resolve() // don't waste time constructing/logging errors\n })\n\n const fetch = inputFetch || window.fetch\n const onopen = inputOnOpen || (() => {})\n\n let retries = 0\n let baseRetryInterval = retryInterval\n const create = async () => {\n curRequestController = new AbortController()\n const curRequestSignal = curRequestController.signal\n try {\n const response = await fetch(input, {\n ...rest,\n headers,\n signal: curRequestSignal,\n })\n\n await onopen(response)\n\n const dispatchNonSSE = async (\n dispatchType: string,\n response: Response,\n name: string,\n responseOverrides?: ResponseOverrides,\n ...argNames: string[]\n ) => {\n const argsRaw: WatcherArgs = {\n [name]: await response.text(),\n }\n for (const n of argNames) {\n let v = response.headers.get(`datastar-${kebab(n)}`)\n if (responseOverrides) {\n const o = (responseOverrides as any)[n]\n if (o) v = typeof o === 'string' ? o : JSON.stringify(o)\n }\n if (v) argsRaw[n] = v\n }\n\n dispatchFetch(dispatchType, el, argsRaw)\n dispose()\n resolve()\n }\n\n const status = response.status\n const isNoContentStatus = status === 204\n const isRedirectStatus = status >= 300 && status < 400\n const isErrorStatus = status >= 400 && status < 600\n\n if (status !== 200) {\n onclose?.()\n if (\n retry !== 'never' &&\n !isNoContentStatus &&\n !isRedirectStatus &&\n (retry === 'always' || (retry === 'error' && isErrorStatus))\n ) {\n clearTimeout(retryTimer)\n retryTimer = setTimeout(create, retryInterval)\n return\n }\n dispose()\n resolve()\n return\n }\n\n // on successful connection, reset the retry logic\n retries = 0\n retryInterval = baseRetryInterval\n\n const ct = response.headers.get('Content-Type')\n if (ct?.includes('text/html')) {\n return await dispatchNonSSE(\n 'datastar-patch-elements',\n response,\n 'elements',\n responseOverrides,\n 'selector',\n 'mode',\n 'namespace',\n 'useViewTransition',\n )\n }\n\n if (ct?.includes('application/json')) {\n return await dispatchNonSSE(\n 'datastar-patch-signals',\n response,\n 'signals',\n responseOverrides,\n 'onlyIfMissing',\n )\n }\n\n if (ct?.includes('text/javascript')) {\n const script = document.createElement('script')\n const scriptAttributesHeader = response.headers.get(\n 'datastar-script-attributes',\n )\n\n if (scriptAttributesHeader) {\n for (const [name, value] of Object.entries(\n JSON.parse(scriptAttributesHeader),\n )) {\n script.setAttribute(name, value as string)\n }\n }\n script.textContent = await response.text()\n document.head.appendChild(script)\n dispose()\n return\n }\n\n await getBytes(\n response.body!,\n getLines(\n getMessages(\n (id) => {\n if (id) {\n // signals the id and send it back on the next retry:\n headers['last-event-id'] = id\n } else {\n // don't send the last-event-id header anymore:\n delete headers['last-event-id']\n }\n },\n (retry) => {\n baseRetryInterval = retryInterval = retry\n },\n onmessage,\n ),\n ),\n )\n\n onclose?.()\n\n if (retry === 'always' && !isRedirectStatus) {\n clearTimeout(retryTimer)\n retryTimer = setTimeout(create, retryInterval)\n return\n }\n\n dispose()\n resolve()\n } catch (err) {\n if (!curRequestSignal.aborted) {\n // if we haven\u2019t aborted the request ourselves:\n try {\n // check if we need to retry:\n const interval: any = onerror?.(err) || retryInterval\n clearTimeout(retryTimer)\n retryTimer = setTimeout(create, interval)\n retryInterval = Math.min(\n retryInterval * retryScaler,\n retryMaxWait,\n ) // exponential backoff\n if (++retries >= retryMaxCount) {\n dispatchFetch(RETRIES_FAILED, el, {})\n // we should not retry anymore:\n dispose()\n reject('Max retries reached.') // Max retries reached, check your server or network connection\n } else {\n console.error(\n `Datastar failed to reach ${input.toString()} retrying in ${interval}ms.`,\n )\n }\n } catch (innerErr) {\n // we should not retry anymore:\n dispose()\n reject(innerErr)\n }\n }\n }\n }\n\n create()\n })\n}\n", "// Icon: material-symbols:edit-attributes-outline\n// Slug: Syncs the value of an attribute with an expression.\n// Description: Sets the value of any HTML attribute to an expression, and keeps it in sync.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\n\nattribute({\n name: 'attr',\n requirement: { value: 'must' },\n returnsValue: true,\n apply({ el, key, rx }) {\n const syncAttr = (key: string, val: any) => {\n if (val === '' || val === true) {\n el.setAttribute(key, '')\n } else if (val === false || val == null) {\n el.removeAttribute(key)\n } else if (typeof val === 'string') {\n el.setAttribute(key, val)\n } else if (typeof val === 'function') {\n el.setAttribute(key, val.toString())\n } else {\n el.setAttribute(\n key,\n JSON.stringify(val, (_k, v) =>\n typeof v === 'function' ? v.toString() : v,\n ),\n )\n }\n }\n\n const update = key\n ? () => {\n observer.disconnect()\n const val = rx() as string\n syncAttr(key, val)\n observer.observe(el, {\n attributeFilter: [key],\n })\n }\n : () => {\n observer.disconnect()\n const obj = rx() as Record\n const attributeFilter = Object.keys(obj)\n for (const key of attributeFilter) {\n syncAttr(key, obj[key])\n }\n observer.observe(el, {\n attributeFilter,\n })\n }\n\n const observer = new MutationObserver(update)\n const cleanup = effect(update)\n\n return () => {\n observer.disconnect()\n cleanup()\n }\n },\n})\n", "// Icon: akar-icons:link-chain\n// Slug: Creates a signal with two-way data binding.\n// Description: Creates a signal (if one doesn\u2019t already exist) and sets up two-way data binding between it and an element\u2019s value.\n\nimport { attribute } from '@engine'\nimport { DATASTAR_PROP_CHANGE_EVENT } from '@engine/consts'\nimport { effect, getPath, mergePaths } from '@engine/signals'\nimport type { Paths } from '@engine/types'\nimport { hasOwn } from '@utils/polyfills'\nimport { aliasify, camel, modifyCasing } from '@utils/text'\n\ntype SignalFile = {\n name: string\n contents: string\n mime: string\n}\n\ntype BindAdapter = {\n get: (el: any, type: string) => any\n set: (el: any, value: any) => void\n events: string[]\n}\n\nconst propAdapter = (prop: string, ...events: string[]): BindAdapter => ({\n get: (el: any) => el[prop],\n set: (el: any, value: any) => {\n el[prop] = value\n },\n events,\n})\n\nconst attrAdapter = (attr: string, ...events: string[]): BindAdapter => ({\n get: (el: Element) => el.getAttribute(attr),\n set: (el: Element, value: any) => {\n el.setAttribute(attr, `${value}`)\n },\n events,\n})\n\nconst valueAdapter = (\n treatUndefinedAsString = false,\n ...events: string[]\n): BindAdapter => ({\n get: (el: HTMLInputElement | HTMLSelectElement, type: string) =>\n type === 'string' || (treatUndefinedAsString && type === 'undefined')\n ? el.value\n : +el.value,\n set: (el: HTMLInputElement | HTMLSelectElement, value: string | number) => {\n el.value = `${value}`\n },\n events,\n})\n\nconst dataURIRegex = /^data:(?[^;]+);base64,(?.*)$/\nconst empty = Symbol('empty')\n\nconst boundPath = (\n el: Element,\n key: string | null | undefined,\n rawKey: string,\n signalName: string,\n adapter: BindAdapter,\n initialValue: any,\n) => {\n const rawAttribute = aliasify(CSS.escape(rawKey))\n const selector = key\n ? `[${rawAttribute}]`\n : `[${rawAttribute}=\"${CSS.escape(signalName)}\"]`\n if (\n initialValue === undefined &&\n el instanceof HTMLInputElement &&\n el.type === 'radio'\n ) {\n const checked = [...document.querySelectorAll(selector)].find(\n (input): input is HTMLInputElement =>\n input instanceof HTMLInputElement && input.checked,\n )\n // Missing radio binds adopt the checked option.\n if (checked) {\n mergePaths([[signalName, checked.value]], { ifMissing: true })\n }\n }\n\n if (\n !Array.isArray(initialValue) ||\n (el instanceof HTMLSelectElement && el.multiple)\n ) {\n mergePaths([[signalName, adapter.get(el, typeof initialValue)]], {\n ifMissing: true,\n })\n return signalName\n }\n\n const inputs = document.querySelectorAll(selector) as NodeListOf\n\n const paths: Paths = []\n let i = 0\n for (const input of inputs) {\n // Missing proxy slots materialize as '', which breaks `ifMissing`.\n paths.push([\n `${signalName}.${i}`,\n adapter.get(\n input,\n typeof (hasOwn(initialValue, i) ? initialValue[i] : undefined),\n ),\n ])\n if (el === input) {\n break\n }\n i++\n }\n mergePaths(paths, { ifMissing: true })\n return `${signalName}.${i}`\n}\n\nattribute({\n name: 'bind',\n requirement: 'exclusive',\n apply({ el, key, rawKey, mods, value, error }) {\n const signalName = key != null ? modifyCasing(key, mods) : value\n\n const props = mods.get('prop')\n const events = mods.get('event')\n let adapter: BindAdapter | null = null\n\n if (el instanceof HTMLInputElement) {\n switch (el.type) {\n case 'range':\n case 'number':\n adapter = valueAdapter(false, 'input')\n break\n case 'checkbox':\n adapter = {\n get: (el: HTMLInputElement, type: string) => {\n if (el.value !== 'on') {\n return type === 'boolean'\n ? el.checked\n : el.checked\n ? el.value\n : ''\n }\n return type === 'string'\n ? el.checked\n ? el.value\n : ''\n : el.checked\n },\n set: (el: HTMLInputElement, value: string | boolean) => {\n el.checked =\n typeof value === 'string' ? value === el.value : value\n },\n events: ['input'],\n }\n break\n case 'radio':\n if (!el.getAttribute('name')?.length) {\n el.setAttribute('name', signalName)\n }\n adapter = {\n get: (el: HTMLInputElement, type: string) =>\n el.checked ? (type === 'number' ? +el.value : el.value) : empty,\n set: (el: HTMLInputElement, value: string | number) => {\n el.checked =\n value === (typeof value === 'number' ? +el.value : el.value)\n },\n events: ['input'],\n }\n break\n case 'file': {\n const syncSignal = () => {\n const files = [...(el.files || [])]\n const signalFiles: SignalFile[] = []\n Promise.all(\n files.map(\n (f) =>\n new Promise((resolve) => {\n const reader = new FileReader()\n reader.onload = () => {\n if (typeof reader.result !== 'string') {\n throw error('InvalidFileResultType', {\n resultType: typeof reader.result,\n })\n }\n const match = reader.result.match(dataURIRegex)\n if (!match?.groups) {\n throw error('InvalidDataUri', {\n result: reader.result,\n })\n }\n signalFiles.push({\n name: f.name,\n contents: match.groups.contents,\n mime: match.groups.mime,\n })\n }\n reader.onloadend = () => resolve()\n reader.readAsDataURL(f)\n }),\n ),\n ).then(() => {\n mergePaths([[signalName, signalFiles]])\n })\n }\n\n el.addEventListener('change', syncSignal)\n return () => {\n el.removeEventListener('change', syncSignal)\n }\n }\n default:\n adapter = valueAdapter(true, 'input')\n }\n } else if (el instanceof HTMLSelectElement && el.multiple) {\n const typeMap = new Map()\n adapter = {\n get: (el: HTMLSelectElement) =>\n [...el.selectedOptions].map((option) => {\n const type = typeMap.get(option.value)\n return type === 'string' || type == null\n ? option.value\n : +option.value\n }),\n set: (el: HTMLSelectElement, value: (string | number)[]) => {\n for (const option of el.options) {\n if (value.includes(option.value)) {\n typeMap.set(option.value, 'string')\n option.selected = true\n } else if (value.includes(+option.value)) {\n typeMap.set(option.value, 'number')\n option.selected = true\n } else {\n option.selected = false\n }\n }\n },\n events: ['change'],\n }\n } else if (el instanceof HTMLSelectElement) {\n adapter = valueAdapter(true, 'change')\n } else if (el instanceof HTMLTextAreaElement) {\n adapter = propAdapter('value', 'input')\n } else if (el instanceof HTMLElement && el.tagName.includes('-')) {\n adapter =\n 'value' in el\n ? propAdapter('value', 'input', 'change')\n : attrAdapter('value', 'input', 'change')\n } else if (el instanceof HTMLElement && 'value' in el) {\n adapter = propAdapter('value', 'change')\n } else {\n adapter = attrAdapter('value', 'change')\n }\n if (!adapter) {\n throw error('InvalidBindAdapter')\n }\n\n const firstProp = props && [...props][0]\n if (props && !firstProp) throw error('BindPropNameMissing')\n if (firstProp) {\n const prop = camel(firstProp)\n adapter = propAdapter(prop, ...(events ? [...events] : adapter.events))\n } else if (events) {\n adapter.events = [...events]\n }\n\n const initialValue = getPath(signalName)\n const path = boundPath(\n el,\n key,\n rawKey,\n signalName,\n adapter,\n initialValue,\n )\n\n const syncSignal = () => {\n const signalValue = getPath(path)\n if (signalValue != null) {\n const value = adapter.get(el, typeof signalValue)\n if (value !== empty) {\n mergePaths([[path, value]])\n }\n }\n }\n\n for (const eventName of adapter.events) {\n el.addEventListener(eventName, syncSignal)\n }\n el.addEventListener(DATASTAR_PROP_CHANGE_EVENT, syncSignal)\n const cleanup = effect(() => {\n adapter.set(el, getPath(path))\n })\n\n return () => {\n cleanup()\n for (const eventName of adapter.events) {\n el.removeEventListener(eventName, syncSignal)\n }\n el.removeEventListener(DATASTAR_PROP_CHANGE_EVENT, syncSignal)\n }\n },\n})\n", "// Icon: ic:baseline-format-paint\n// Slug: Adds or removes a class based on an expression.\n// Description: Adds or removes a class to or from an element based on an expression.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\nimport { modifyCasing } from '@utils/text'\n\nattribute({\n name: 'class',\n requirement: {\n value: 'must',\n },\n returnsValue: true,\n apply({ key, el, mods, rx }) {\n key &&= modifyCasing(key, mods, 'kebab')\n\n let classes: Record\n const callback = () => {\n observer.disconnect()\n\n classes = key\n ? { [key]: rx() as boolean }\n : (rx() as Record)\n\n for (const k in classes) {\n const classNames = k.split(/\\s+/).filter((cn) => cn.length > 0)\n if (classes[k]) {\n for (const name of classNames) {\n if (!el.classList.contains(name)) {\n el.classList.add(name)\n }\n }\n } else {\n for (const name of classNames) {\n if (el.classList.contains(name)) {\n el.classList.remove(name)\n }\n }\n }\n }\n\n observer.observe(el, { attributeFilter: ['class'] })\n }\n\n const observer = new MutationObserver(callback)\n const cleanup = effect(callback)\n\n return () => {\n observer.disconnect()\n cleanup()\n\n for (const k in classes) {\n const classNames = k.split(/\\s+/).filter((cn) => cn.length > 0)\n for (const name of classNames) {\n el.classList.remove(name)\n }\n }\n }\n },\n})\n", "// Icon: streamline-ultimate:wifi-signal-2\n// Slug: Creates a computed signal.\n// Description: Creates a signal that is computed based on an expression.\n\nimport { attribute } from '@engine'\nimport { computed, mergePaths, mergePatch } from '@engine/signals'\nimport { modifyCasing } from '@utils/text'\nimport { updateLeaves } from '@utils/paths'\n\nattribute({\n name: 'computed',\n requirement: {\n value: 'must',\n },\n returnsValue: true,\n apply({ key, mods, rx, error }) {\n if (key) {\n mergePaths([[modifyCasing(key, mods), computed(rx)]])\n } else {\n const patch = Object.assign({}, rx() as Record any>)\n updateLeaves(patch, (old) => {\n if (typeof old === 'function') {\n return computed(old)\n } else {\n throw error('ComputedExpectedFunction')\n }\n })\n mergePatch(patch)\n }\n },\n})\n", "// Icon: oui:security-signal\n// Slug: Executes an expression when signals change.\n// Description: Executes an expression on page load and whenever any signals in the expression change.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\n\nattribute({\n name: 'effect',\n requirement: {\n key: 'denied',\n value: 'must',\n },\n apply: ({ rx }) => effect(rx),\n})\n", "// Icon: streamline:signal-loading-remix\n// Slug: Creates an indicator for whether an SSE request is in flight.\n// Description: Creates a signal and sets its value to `true` while an SSE request request is in flight, otherwise `false`.\n\nimport { attribute } from '@engine'\nimport { DATASTAR_FETCH_EVENT } from '@engine/consts'\nimport { mergePaths } from '@engine/signals'\nimport type { DatastarFetchEvent } from '@engine/types'\nimport { FINISHED, STARTED } from '@plugins/actions/fetch'\nimport { modifyCasing } from '@utils/text'\n\nattribute({\n name: 'indicator',\n requirement: 'exclusive',\n apply({ el, key, mods, value }) {\n const signalName = key != null ? modifyCasing(key, mods) : value\n let activeFetches = 0\n\n mergePaths([[signalName, false]])\n\n const watcher = ((event: CustomEvent) => {\n const { type, el: elt } = event.detail\n if (elt !== el) {\n return\n }\n switch (type) {\n case STARTED:\n activeFetches++\n mergePaths([[signalName, true]])\n break\n case FINISHED:\n activeFetches = Math.max(0, activeFetches - 1)\n mergePaths([[signalName, activeFetches > 0]])\n break\n }\n }) as EventListener\n document.addEventListener(DATASTAR_FETCH_EVENT, watcher)\n return () => {\n activeFetches = 0\n mergePaths([[signalName, false]])\n document.removeEventListener(DATASTAR_FETCH_EVENT, watcher)\n }\n },\n})\n", "export const tagToMs = (args: Set) => {\n if (!args || args.size <= 0) return 0\n for (const arg of args) {\n if (arg.endsWith('ms')) {\n return +arg.replace('ms', '')\n }\n if (arg.endsWith('s')) {\n return +arg.replace('s', '') * 1000\n }\n try {\n return Number.parseFloat(arg)\n } catch (_) {}\n }\n return 0\n}\n\nexport const tagHas = (\n tags: Set,\n tag: string,\n defaultValue = false,\n) => {\n if (!tags) return defaultValue\n return tags.has(tag.toLowerCase())\n}\n\nexport const tagFirst = (tags?: Set, defaultValue = ''): string => {\n if (tags && tags.size > 0) {\n for (const tag of tags) {\n return tag\n }\n }\n return defaultValue\n}\n", "import type { EventCallbackHandler, Modifiers } from '@engine/types'\nimport { tagHas, tagToMs } from '@utils/tags'\n\nexport const delay = (\n callback: EventCallbackHandler,\n wait: number,\n): EventCallbackHandler => {\n return (...args: any[]) => {\n setTimeout(() => {\n callback(...args)\n }, wait)\n }\n}\n\nexport const throttle = (\n callback: EventCallbackHandler,\n wait: number,\n leading = true,\n trailing = false,\n debounce = false,\n): EventCallbackHandler => {\n let lastArgs: Parameters | null = null\n let timer: ReturnType | number = 0\n\n return (...args: any[]) => {\n if (leading && !timer) {\n callback(...args)\n lastArgs = null\n } else {\n lastArgs = args\n }\n if (!timer || debounce) {\n if (timer) {\n clearTimeout(timer)\n }\n timer = setTimeout(() => {\n if (trailing && lastArgs !== null) {\n callback(...lastArgs)\n }\n lastArgs = null\n timer = 0\n }, wait)\n }\n }\n}\n\nexport const modifyTiming = (\n callback: EventCallbackHandler,\n mods: Modifiers,\n): EventCallbackHandler => {\n const delayArgs = mods.get('delay')\n if (delayArgs) {\n const wait = tagToMs(delayArgs)\n callback = delay(callback, wait)\n }\n\n const debounceArgs = mods.get('debounce')\n if (debounceArgs) {\n const wait = tagToMs(debounceArgs)\n const leading = tagHas(debounceArgs, 'leading', false)\n const trailing = !tagHas(debounceArgs, 'notrailing', false)\n callback = throttle(callback, wait, leading, trailing, true)\n }\n\n const throttleArgs = mods.get('throttle')\n if (throttleArgs) {\n const wait = tagToMs(throttleArgs)\n const leading = !tagHas(throttleArgs, 'noleading', false)\n const trailing = tagHas(throttleArgs, 'trailing', false)\n callback = throttle(callback, wait, leading, trailing)\n }\n\n return callback\n}\n", "import type { EventCallbackHandler, Modifiers } from '@engine/types'\n\nexport const supportsViewTransitions = !!document.startViewTransition\n\nexport const modifyViewTransition = (\n callback: EventCallbackHandler,\n mods: Modifiers,\n): EventCallbackHandler => {\n if (mods.has('viewtransition') && supportsViewTransitions) {\n const cb = callback // I hate javascript\n callback = (...args: any[]) =>\n document.startViewTransition(() => cb(...args))\n }\n\n return callback\n}\n", "// Icon: material-symbols:timer-play-outline\n// Slug: Runs an expression when loaded into the DOM.\n// Description: Runs an expression when the element is loaded into the DOM.\n\nimport { attribute } from '@engine'\nimport { beginBatch, endBatch } from '@engine/signals'\nimport { tagToMs } from '@utils/tags'\nimport { delay } from '@utils/timing'\nimport { modifyViewTransition } from '@utils/view-transitions'\n\nattribute({\n name: 'init',\n requirement: {\n key: 'denied',\n value: 'must',\n },\n apply({ rx, mods }) {\n let callback = () => {\n beginBatch()\n rx()\n endBatch()\n }\n callback = modifyViewTransition(callback, mods)\n let wait = 0\n const delayArgs = mods.get('delay')\n if (delayArgs) {\n wait = tagToMs(delayArgs)\n if (wait > 0) {\n callback = delay(callback, wait)\n }\n }\n callback()\n },\n})\n", "// Icon: si:json-fill\n// Slug: Outputs a JSON stringified version of signals.\n// Description: Sets the text content of an element to a reactive JSON stringified version of signals.\n\nimport { attribute } from '@engine'\nimport { effect, filtered } from '@engine/signals'\nimport type { SignalFilterOptions } from '@engine/types'\nimport { jsStrToObject } from '@utils/text'\n\nattribute({\n name: 'json-signals',\n requirement: {\n key: 'denied',\n },\n apply({ el, value, mods }) {\n const spaces = mods.has('terse') ? 0 : 2\n let filters: SignalFilterOptions = {}\n if (value) {\n filters = jsStrToObject(value)\n }\n\n const callback = () => {\n observer.disconnect()\n el.textContent = JSON.stringify(filtered(filters), null, spaces)\n observer.observe(el, {\n childList: true,\n characterData: true,\n subtree: true,\n })\n }\n const observer = new MutationObserver(callback)\n const cleanup = effect(callback)\n\n return () => {\n observer.disconnect()\n cleanup()\n }\n },\n})\n", "// Icon: material-symbols:mail\n// Slug: Attaches an event listener to an element.\n// Description: Attaches an event listener to an element, executing an expression whenever the event is triggered.\n\nimport { attribute } from '@engine'\nimport {\n DATASTAR_FETCH_EVENT,\n DATASTAR_SIGNAL_PATCH_EVENT,\n} from '@engine/consts'\nimport { beginBatch, endBatch } from '@engine/signals'\nimport { modifyCasing } from '@utils/text'\nimport { modifyTiming } from '@utils/timing'\nimport { modifyViewTransition } from '@utils/view-transitions'\n\nattribute({\n name: 'on',\n requirement: 'must',\n argNames: ['evt'],\n apply({ el, key, mods, rx }) {\n let target: Element | Window | Document = el\n if (mods.has('window')) {\n target = window\n } else if (mods.has('document')) {\n target = document\n }\n let callback = (evt?: Event) => {\n beginBatch()\n rx(evt)\n endBatch()\n }\n callback = modifyViewTransition(callback, mods)\n callback = modifyTiming(callback, mods)\n const eventName = modifyCasing(key, mods, 'kebab')\n const evtListOpts: AddEventListenerOptions = {\n capture: mods.has('capture'),\n passive: mods.has('passive'),\n once: mods.has('once'),\n }\n if (mods.has('outside')) {\n target = document\n const cb = callback\n callback = (evt?: Event) => {\n if (!el.contains(evt?.target as HTMLElement)) {\n cb(evt)\n }\n }\n }\n // Listen for Datastar events on the document\n if (\n eventName === DATASTAR_FETCH_EVENT ||\n eventName === DATASTAR_SIGNAL_PATCH_EVENT\n ) {\n target = document\n }\n // Apply event-side effects before timing/view-transition wrappers run.\n const listener = (evt?: Event) => {\n if (evt) {\n if (mods.has('prevent')) evt.preventDefault()\n if (mods.has('stop')) evt.stopPropagation()\n // Keep data-on:submit from falling through to native form submission.\n if (el instanceof HTMLFormElement && eventName === 'submit') evt.preventDefault()\n }\n callback(evt)\n }\n target.addEventListener(eventName, listener, evtListOpts)\n return () => {\n target.removeEventListener(eventName, listener, evtListOpts)\n }\n },\n})\n", "export const clamp = (value: number, min: number, max: number): number => {\n return Math.max(min, Math.min(max, value))\n}\n\nexport const lerp = (\n min: number,\n max: number,\n t: number,\n clamped = true,\n): number => {\n const v = min + (max - min) * t\n return clamped ? clamp(v, min, max) : v\n}\n\nexport const inverseLerp = (\n min: number,\n max: number,\n value: number,\n clamped = true,\n): number => {\n if (value < min) return 0\n if (value > max) return 1\n const v = (value - min) / (max - min)\n return clamped ? clamp(v, min, max) : v\n}\n\nexport const fit = (\n value: number,\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n clamped = true,\n rounded = false,\n): number => {\n const t = inverseLerp(inMin, inMax, value, clamped)\n const fitted = lerp(outMin, outMax, t, clamped)\n return rounded ? Math.round(fitted) : fitted\n}\n", "// Icon: mdi-light:vector-intersection\n// Slug: Runs an expression on intersection.\n// Description: Runs an expression when the element intersects with the viewport.\n\nimport { attribute } from '@engine'\nimport { beginBatch, endBatch } from '@engine/signals'\nimport type { HTMLOrSVG } from '@engine/types'\nimport { clamp } from '@utils/math'\nimport { tagFirst } from '@utils/tags'\nimport { modifyTiming } from '@utils/timing'\nimport { modifyViewTransition } from '@utils/view-transitions'\n\nconst once = new WeakSet()\n\nattribute({\n name: 'on-intersect',\n requirement: {\n key: 'denied',\n value: 'must',\n },\n apply({ el, mods, rx }) {\n let callback = () => {\n beginBatch()\n rx()\n endBatch()\n }\n callback = modifyViewTransition(callback, mods)\n callback = modifyTiming(callback, mods)\n const options = { threshold: 0 }\n if (mods.has('full')) {\n options.threshold = 1\n } else if (mods.has('half')) {\n options.threshold = 0.5\n } else {\n const threshold = mods.get('threshold')\n if (threshold) {\n options.threshold = clamp(Number(tagFirst(threshold)), 0, 100) / 100\n }\n }\n const exit = mods.has('exit')\n let observer: IntersectionObserver | null = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting !== exit) {\n callback()\n if (observer && once.has(el)) {\n observer.disconnect()\n }\n }\n }\n },\n options,\n )\n observer.observe(el)\n if (mods.has('once')) {\n once.add(el)\n }\n return () => {\n if (!mods.has('once')) {\n once.delete(el)\n }\n if (observer) {\n observer.disconnect()\n observer = null\n }\n }\n },\n})\n", "// Icon: material-symbols:timer-outline\n// Slug: Runs an expression at a regular interval.\n// Description: Runs an expression at a regular interval.\n\nimport { attribute } from '@engine'\nimport { beginBatch, endBatch } from '@engine/signals'\nimport { tagHas, tagToMs } from '@utils/tags'\nimport { modifyViewTransition } from '@utils/view-transitions'\n\nattribute({\n name: 'on-interval',\n requirement: {\n key: 'denied',\n value: 'must',\n },\n apply({ mods, rx }) {\n let callback = () => {\n beginBatch()\n rx()\n endBatch()\n }\n callback = modifyViewTransition(callback, mods)\n let duration = 1000\n const durationArgs = mods.get('duration')\n if (durationArgs) {\n duration = tagToMs(durationArgs)\n const leading = tagHas(durationArgs, 'leading', false)\n if (leading) {\n callback()\n }\n }\n const intervalId = setInterval(callback, duration)\n return () => {\n clearInterval(intervalId)\n }\n },\n})\n", "// Icon: material-symbols:change-circle-outline\n// Slug: Runs an expression when signals are patched.\n// Description: Runs an expression whenever one or more signals are patched.\n\nimport { attribute } from '@engine'\nimport { DATASTAR_SIGNAL_PATCH_EVENT } from '@engine/consts'\nimport { beginBatch, endBatch, filtered } from '@engine/signals'\nimport type { JSONPatch, SignalFilterOptions } from '@engine/types'\nimport { isEmpty } from '@utils/paths'\nimport { aliasify, jsStrToObject } from '@utils/text'\nimport { modifyTiming } from '@utils/timing'\n\nattribute({\n name: 'on-signal-patch',\n requirement: {\n value: 'must',\n },\n argNames: ['patch'],\n returnsValue: true,\n apply({ el, key, mods, rx, error }) {\n if (!!key && key !== 'filter') {\n throw error('KeyNotAllowed')\n }\n\n const filterAttr = aliasify(`${this.name}-filter`)\n const filtersRaw = el.getAttribute(filterAttr)\n let filters: SignalFilterOptions = {}\n if (filtersRaw) {\n filters = jsStrToObject(filtersRaw)\n }\n\n let running = false\n\n const callback: EventListener = modifyTiming(\n (evt: CustomEvent) => {\n if (running) return\n const watched = filtered(filters, evt.detail)\n if (!isEmpty(watched)) {\n running = true\n beginBatch()\n try {\n rx(watched)\n } finally {\n endBatch()\n running = false\n }\n }\n },\n mods,\n )\n\n document.addEventListener(DATASTAR_SIGNAL_PATCH_EVENT, callback)\n return () => {\n document.removeEventListener(DATASTAR_SIGNAL_PATCH_EVENT, callback)\n }\n },\n})\n", "// Icon: mdi:cursor-pointer\n// Slug: Creates a reference to an element.\n// Description: Creates a new signal that is a reference to the element on which the data attribute is placed.\n\nimport { attribute } from '@engine'\nimport { mergePaths } from '@engine/signals'\nimport { modifyCasing } from '@utils/text'\n\nattribute({\n name: 'ref',\n requirement: 'exclusive',\n apply({ el, key, mods, value }) {\n const signalName = key != null ? modifyCasing(key, mods) : value\n mergePaths([[signalName, el]])\n },\n})\n", "// Icon: streamline:interface-edit-view-eye-eyeball-open-view\n// Slug: Shows or hides an element.\n// Description: Shows or hides an element based on whether an expression evaluates to `true` or `false`.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\n\nconst NONE = 'none'\nconst DISPLAY = 'display'\n\nattribute({\n name: 'show',\n requirement: {\n key: 'denied',\n value: 'must',\n },\n returnsValue: true,\n apply({ el, rx }) {\n const update = () => {\n observer.disconnect()\n const shouldShow = rx()\n if (shouldShow) {\n if (el.style.display === NONE) el.style.removeProperty(DISPLAY)\n } else {\n el.style.setProperty(DISPLAY, NONE)\n }\n observer.observe(el, { attributeFilter: ['style'] })\n }\n const observer = new MutationObserver(update)\n const cleanup = effect(update)\n\n return () => {\n observer.disconnect()\n cleanup()\n }\n },\n})\n", "// Icon: streamline:wifi-signal-full-remix\n// Slug: Patches signals into the existing signals.\n// Description: Patches (adds, updates or removes) one or more signals into the existing signals.\n\nimport { attribute } from '@engine'\nimport { mergePatch, mergePaths } from '@engine/signals'\nimport { modifyCasing } from '@utils/text'\n\nattribute({\n name: 'signals',\n returnsValue: true,\n apply({ key, mods, rx }) {\n const ifMissing = mods.has('ifmissing')\n\n if (key) {\n key = modifyCasing(key, mods)\n const value = rx?.()\n mergePaths([[key, value]], { ifMissing })\n } else {\n const patch = Object.assign({}, rx?.() as Record)\n mergePatch(patch, { ifMissing })\n }\n },\n})\n", "// Icon: material-symbols:format-paint-outline\n// Slug: Sets inline styles on an element based on an expression.\n// Description: Sets CSS styles on an element using either key-based or object syntax, and keeps them in sync with reactive signals.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\nimport { kebab } from '@utils/text'\n\nattribute({\n name: 'style',\n requirement: {\n value: 'must',\n },\n returnsValue: true,\n apply({ key, el, rx }) {\n const { style } = el\n const initialStyles = new Map()\n\n const apply = (prop: string, value: any) => {\n const initial = initialStyles.get(prop)\n if (!value && value !== 0) {\n initial !== undefined &&\n (initial\n ? style.setProperty(prop, initial)\n : style.removeProperty(prop))\n } else {\n initial === undefined &&\n initialStyles.set(prop, style.getPropertyValue(prop))\n style.setProperty(prop, String(value))\n }\n }\n\n const update = () => {\n observer.disconnect()\n\n if (key) {\n apply(key, rx())\n } else {\n const styles = rx() as Record\n\n for (const [prop, initial] of initialStyles) {\n prop in styles ||\n (initial\n ? style.setProperty(prop, initial)\n : style.removeProperty(prop))\n }\n\n for (const prop in styles) {\n apply(kebab(prop), styles[prop])\n }\n }\n\n observer.observe(el, { attributeFilter: ['style'] })\n }\n\n const observer = new MutationObserver(update)\n const cleanup = effect(update)\n\n return () => {\n observer.disconnect()\n cleanup()\n for (const [prop, initial] of initialStyles) {\n initial ? style.setProperty(prop, initial) : style.removeProperty(prop)\n }\n }\n },\n})\n", "// Icon: icon-park-outline:text\n// Slug: Binds the text content of an element.\n// Description: Binds the text content of an element to an expression.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\n\nattribute({\n name: 'text',\n requirement: {\n key: 'denied',\n value: 'must',\n },\n returnsValue: true,\n apply({ el, rx }) {\n const update = () => {\n observer.disconnect()\n el.textContent = `${rx()}`\n observer.observe(el, {\n childList: true,\n characterData: true,\n subtree: true,\n })\n }\n\n const observer = new MutationObserver(update)\n const cleanup = effect(update)\n\n return () => {\n observer.disconnect()\n cleanup()\n }\n },\n})\n", "// Icon: material-symbols:cloud-download\n// Slug: Patches elements into the DOM.\n// Description: Patches elements into the DOM.\n\nimport { watcher } from '@engine'\nimport {\n DATASTAR_PROP_CHANGE_EVENT,\n DATASTAR_SCOPE_CHILDREN_EVENT,\n} from '@engine/consts'\nimport type { WatcherArgsValue, WatcherContext } from '@engine/types'\nimport { isHTMLOrSVG } from '@utils/dom'\nimport { aliasify } from '@utils/text'\nimport { supportsViewTransitions } from '@utils/view-transitions'\n\nconst isValidType = (\n arr: T,\n value: string,\n): value is T[number] => (arr as readonly string[]).includes(value)\n\nconst PATCH_MODES = [\n 'remove',\n 'outer',\n 'inner',\n 'replace',\n 'prepend',\n 'append',\n 'before',\n 'after',\n] as const\ntype PatchElementsMode = (typeof PATCH_MODES)[number]\n\nconst NAMESPACES = ['html', 'svg', 'mathml'] as const\ntype Namespace = (typeof NAMESPACES)[number]\n\ntype PatchElementsArgs = {\n selector: string\n mode: PatchElementsMode\n namespace: Namespace\n useViewTransition: boolean\n elements: WatcherArgsValue\n}\n\nwatcher({\n name: 'datastar-patch-elements',\n apply(ctx, args) {\n const selector = typeof args.selector === 'string' ? args.selector : ''\n const mode = typeof args.mode === 'string' ? args.mode : 'outer'\n const namespace =\n typeof args.namespace === 'string' ? args.namespace : 'html'\n const useViewTransitionRaw =\n typeof args.useViewTransition === 'string' ? args.useViewTransition : ''\n const elements = args.elements\n\n if (!isValidType(PATCH_MODES, mode)) {\n throw ctx.error('PatchElementsInvalidMode', { mode })\n }\n\n if (!selector && mode !== 'outer' && mode !== 'replace') {\n throw ctx.error('PatchElementsExpectedSelector')\n }\n\n if (!isValidType(NAMESPACES, namespace)) {\n throw ctx.error('PatchElementsInvalidNamespace', { namespace })\n }\n\n const args2: PatchElementsArgs = {\n selector,\n mode,\n namespace,\n useViewTransition: useViewTransitionRaw.trim() === 'true',\n elements,\n }\n\n if (supportsViewTransitions && args2.useViewTransition) {\n document.startViewTransition(() => onPatchElements(ctx, args2))\n } else {\n onPatchElements(ctx, args2)\n }\n },\n})\n\nconst onPatchElements = (\n { error }: WatcherContext,\n { selector, mode, namespace, elements }: PatchElementsArgs,\n) => {\n let newContent = document.createDocumentFragment()\n let consume = typeof elements !== 'string' && !!elements\n\n if (typeof elements === 'string') {\n const elementsWithSvgsRemoved = elements.replace(\n /]*>|>)([\\s\\S]*?)<\\/svg>/gim,\n '',\n )\n const hasHtml = /<\\/html>/.test(elementsWithSvgsRemoved)\n const hasHead = /<\\/head>/.test(elementsWithSvgsRemoved)\n const hasBody = /<\\/body>/.test(elementsWithSvgsRemoved)\n\n const wrapperTag =\n namespace === 'svg' ? 'svg' : namespace === 'mathml' ? 'math' : ''\n const wrappedEls = wrapperTag\n ? `<${wrapperTag}>${elements}`\n : elements\n\n const newDocument = new DOMParser().parseFromString(\n hasHtml || hasHead || hasBody\n ? elements\n : ``,\n 'text/html',\n )\n\n if (hasHtml) {\n newContent.appendChild(newDocument.documentElement)\n } else if (hasHead && hasBody) {\n newContent.appendChild(newDocument.head)\n newContent.appendChild(newDocument.body)\n } else if (hasHead) {\n newContent.appendChild(newDocument.head)\n } else if (hasBody) {\n newContent.appendChild(newDocument.body)\n } else if (wrapperTag) {\n const wrapperEl = newDocument\n .querySelector('template')!\n .content.querySelector(wrapperTag)!\n for (const child of wrapperEl.childNodes) {\n newContent.appendChild(child)\n }\n } else {\n newContent = newDocument.querySelector('template')!.content\n }\n } else if (elements) {\n if (elements instanceof DocumentFragment) {\n newContent = elements\n } else if (elements instanceof Element) {\n newContent.appendChild(elements)\n }\n }\n\n if (!selector && (mode === 'outer' || mode === 'replace')) {\n const children = Array.from(newContent.children)\n for (const child of children) {\n let target: Element\n if (child instanceof HTMLHtmlElement) {\n target = document.documentElement\n } else if (child instanceof HTMLBodyElement) {\n target = document.body\n } else if (child instanceof HTMLHeadElement) {\n target = document.head\n } else {\n target = document.getElementById(child.id)!\n if (!target) {\n console.warn(error('PatchElementsNoTargetsFound'), {\n element: { id: child.id },\n })\n continue\n }\n }\n\n // Consume the new content so we don\u2019t deep clone.\n applyToTargets(mode as PatchElementsMode, child, [target], true)\n }\n } else {\n const targets = document.querySelectorAll(selector)\n if (!targets.length) {\n console.warn(error('PatchElementsNoTargetsFound'), { selector })\n return\n }\n\n const targetList = consume && mode !== 'remove' ? [targets[0]!] : targets\n\n // If only one target exists, we can safely consume the new content which prevents deep cloning (https://github.com/starfederation/datastar/issues/1155).\n if (targetList.length === 1) {\n consume = true\n }\n\n applyToTargets(mode as PatchElementsMode, newContent, targetList, consume)\n }\n}\n\nconst scripts = new WeakSet()\nfor (const script of document.querySelectorAll('script')) {\n scripts.add(script)\n}\n\nconst execute = (target: Element): void => {\n const elScripts =\n target instanceof HTMLScriptElement\n ? [target]\n : target.querySelectorAll('script')\n for (const old of elScripts) {\n if (!scripts.has(old)) {\n const script = document.createElement('script')\n for (const { name, value } of old.attributes) {\n script.setAttribute(name, value)\n }\n script.text = old.text\n old.replaceWith(script)\n scripts.add(script)\n }\n }\n}\n\nconst applyPatchMode = (\n targets: Iterable,\n element: DocumentFragment | Element,\n action: string,\n consume: boolean,\n) => {\n let used = false\n for (const target of targets) {\n if (consume && used) {\n break\n }\n const nextNode = consume ? element : (element.cloneNode(true) as Element)\n execute(nextNode as Element)\n // @ts-expect-error - calling dynamic method path on DOM element\n target[action](nextNode)\n used = true\n }\n}\n\nconst applyToTargets = (\n mode: PatchElementsMode,\n element: DocumentFragment | Element,\n targets: Iterable,\n consume: boolean,\n) => {\n switch (mode) {\n case 'remove':\n for (const target of targets) {\n target.remove()\n }\n break\n case 'outer':\n case 'inner':\n {\n let used = false\n for (const target of targets) {\n if (consume && used) {\n break\n }\n const nextNode = consume ? element : (element.cloneNode(true) as Element)\n morph(target, nextNode, mode)\n execute(target)\n const scopeHost = target.closest('[data-scope-children]')\n if (scopeHost) {\n scopeHost.dispatchEvent(\n new CustomEvent(DATASTAR_SCOPE_CHILDREN_EVENT, {\n bubbles: false,\n }),\n )\n }\n used = true\n }\n }\n break\n case 'replace':\n applyPatchMode(targets, element, 'replaceWith', consume)\n break\n case 'prepend':\n case 'append':\n case 'before':\n case 'after':\n applyPatchMode(targets, element, mode, consume)\n }\n}\n\nconst ctxIdMap = new Map>()\nconst ctxPersistentIds = new Set()\nconst oldIdTagNameMap = new Map()\nconst duplicateIds = new Set()\nconst ctxPantry = document.createElement('div')\nctxPantry.hidden = true\n\nconst aliasedIgnoreMorph = aliasify('ignore-morph')\nconst aliasedIgnoreMorphAttr = `[${aliasedIgnoreMorph}]`\nexport const morph = (\n oldElt: Element | ShadowRoot,\n newContent: DocumentFragment | Element,\n mode: 'outer' | 'inner' = 'outer',\n): void => {\n if (\n (isHTMLOrSVG(oldElt) &&\n isHTMLOrSVG(newContent) &&\n oldElt.hasAttribute(aliasedIgnoreMorph) &&\n newContent.hasAttribute(aliasedIgnoreMorph)) ||\n oldElt.parentElement?.closest(aliasedIgnoreMorphAttr)\n ) {\n return\n }\n\n const normalizedElt = document.createElement('div')\n normalizedElt.append(newContent)\n document.body.insertAdjacentElement('afterend', ctxPantry)\n\n // Computes the set of IDs that persist between the two contents excluding duplicates\n const oldIdElements = oldElt.querySelectorAll('[id]')\n for (const { id, tagName } of oldIdElements) {\n if (oldIdTagNameMap.has(id)) {\n duplicateIds.add(id)\n } else {\n oldIdTagNameMap.set(id, tagName)\n }\n }\n if (oldElt instanceof Element && oldElt.id) {\n if (oldIdTagNameMap.has(oldElt.id)) {\n duplicateIds.add(oldElt.id)\n } else {\n oldIdTagNameMap.set(oldElt.id, oldElt.tagName)\n }\n }\n\n ctxPersistentIds.clear()\n const newIdElements = normalizedElt.querySelectorAll('[id]')\n for (const { id, tagName } of newIdElements) {\n if (ctxPersistentIds.has(id)) {\n duplicateIds.add(id)\n } else if (oldIdTagNameMap.get(id) === tagName) {\n ctxPersistentIds.add(id)\n }\n }\n\n for (const id of duplicateIds) {\n ctxPersistentIds.delete(id)\n }\n\n oldIdTagNameMap.clear()\n duplicateIds.clear()\n ctxIdMap.clear()\n\n const parent = mode === 'outer' ? oldElt.parentElement! : oldElt\n populateIdMapWithTree(parent, oldIdElements)\n populateIdMapWithTree(normalizedElt, newIdElements)\n\n morphChildren(\n parent,\n normalizedElt,\n mode === 'outer' ? oldElt : null,\n oldElt.nextSibling,\n )\n\n ctxPantry.remove()\n}\n\n// This is the core algorithm for matching up children.\n// The idea is to use ID sets to try to match up nodes as faithfully as possible.\n// We greedily match, which allows us to keep the algorithm fast,\n// but by using ID sets, we are able to better match up with content deeper in the DOM.\nconst morphChildren = (\n oldParent: Element | ShadowRoot, // the old content that we are merging the new content into\n newParent: Element, // the parent element of the new content\n insertionPoint: Node | null = null, // the point in the DOM we start morphing at (defaults to first child)\n endPoint: Node | null = null, // the point in the DOM we stop morphing at (defaults to after last child)\n): void => {\n // normalize\n if (\n oldParent instanceof HTMLTemplateElement &&\n newParent instanceof HTMLTemplateElement\n ) {\n // we can pretend the DocumentElement is an Element\n oldParent = oldParent.content as unknown as Element\n newParent = newParent.content as unknown as Element\n }\n insertionPoint ??= oldParent.firstChild\n\n // run through all the new content\n for (const newChild of newParent.childNodes) {\n // once we reach the end of the old parent content skip to the end and insert the rest\n if (insertionPoint && insertionPoint !== endPoint) {\n const bestMatch = findBestMatch(newChild, insertionPoint, endPoint)\n if (bestMatch) {\n // if the node to morph is not at the insertion point then remove/move up to it\n if (bestMatch !== insertionPoint) {\n let cursor: Node | null = insertionPoint\n // Remove nodes between the start and end nodes\n while (cursor && cursor !== bestMatch) {\n const tempNode = cursor\n cursor = cursor.nextSibling\n removeNode(tempNode)\n }\n }\n morphNode(bestMatch, newChild)\n insertionPoint = bestMatch.nextSibling\n continue\n }\n }\n\n // if the matching node is elsewhere in the original content\n if (newChild instanceof Element && ctxPersistentIds.has(newChild.id)) {\n // move it and all its children here and morph, will always be found\n // Search for an element by ID within the document and pantry, and move it using moveBefore.\n const movedChild = document.getElementById(newChild.id) as Element\n\n // Removes an element from its ancestors' ID maps.\n // This is needed when an element is moved from the \"future\" via `moveBeforeId`.\n // Otherwise, its erstwhile ancestors could be mistakenly moved to the pantry rather than being deleted,\n // preventing their removal hooks from being called.\n let current = movedChild\n while ((current = current.parentNode as Element)) {\n const idSet = ctxIdMap.get(current)\n if (idSet) {\n idSet.delete(newChild.id)\n if (!idSet.size) {\n ctxIdMap.delete(current)\n }\n }\n }\n\n moveBefore(oldParent, movedChild, insertionPoint)\n morphNode(movedChild, newChild)\n insertionPoint = movedChild.nextSibling\n continue\n }\n\n // This performs the action of inserting a new node while handling situations where the node contains\n // elements with persistent IDs and possible state info we can still preserve by moving in and then morphing\n if (ctxIdMap.has(newChild)) {\n // node has children with IDs with possible state so create a dummy elt of same type and apply full morph algorithm\n const namespaceURI = (newChild as Element).namespaceURI\n const tagName = (newChild as Element).tagName\n const newEmptyChild =\n namespaceURI && namespaceURI !== 'http://www.w3.org/1999/xhtml'\n ? document.createElementNS(namespaceURI, tagName)\n : document.createElement(tagName)\n oldParent.insertBefore(newEmptyChild, insertionPoint)\n morphNode(newEmptyChild, newChild)\n insertionPoint = newEmptyChild.nextSibling\n } else {\n // optimization: no id state to preserve so we can just insert a clone of the newChild and its descendants\n const newClonedChild = document.importNode(newChild, true) // importNode to not mutate newParent\n oldParent.insertBefore(newClonedChild, insertionPoint)\n insertionPoint = newClonedChild.nextSibling\n }\n }\n\n // remove any remaining old nodes that didn't match up with new content\n while (insertionPoint && insertionPoint !== endPoint) {\n const tempNode = insertionPoint\n insertionPoint = insertionPoint.nextSibling\n removeNode(tempNode)\n }\n}\n\n// Scans forward from the startPoint to the endPoint looking for a match for the node.\n// It looks for an id set match first, then a soft match.\n// We abort soft matching if we find two future soft matches, to reduce churn.\nconst findBestMatch = (\n node: Node,\n startPoint: Node | null,\n endPoint: Node | null,\n): Node | null => {\n let bestMatch: Node | null | undefined = null\n let nextSibling = node.nextSibling\n let siblingSoftMatchCount = 0\n let displaceMatchCount = 0\n\n // Max ID matches we are willing to displace in our search\n const nodeMatchCount = ctxIdMap.get(node)?.size || 0\n\n let cursor = startPoint\n while (cursor && cursor !== endPoint) {\n // soft matching is a prerequisite for id set matching\n if (isSoftMatch(cursor, node)) {\n let isIdSetMatch = false\n const oldSet = ctxIdMap.get(cursor)\n const newSet = ctxIdMap.get(node)\n\n if (newSet && oldSet) {\n for (const id of oldSet) {\n // a potential match is an id in the new and old nodes that\n // has not already been merged into the DOM\n // But the newNode content we call this on has not been\n // merged yet and we don't allow duplicate IDs so it is simple\n if (newSet.has(id)) {\n isIdSetMatch = true\n break\n }\n }\n }\n\n if (isIdSetMatch) {\n return cursor // found an id set match, we're done!\n }\n\n // we haven\u2019t yet saved a soft match fallback\n // the current soft match will hard match something else in the future, leave it\n if (!bestMatch && !ctxIdMap.has(cursor)) {\n // optimization: if node can't id set match, we can just return the soft match immediately\n if (!nodeMatchCount) {\n return cursor\n }\n // save this as the fallback if we get through the loop without finding a hard match\n bestMatch = cursor\n }\n }\n\n // check for IDs we may be displaced when matching\n displaceMatchCount += ctxIdMap.get(cursor)?.size || 0\n if (displaceMatchCount > nodeMatchCount) {\n // if we are going to displace more IDs than the node contains then\n // we do not have a good candidate for an ID match, so return\n break\n }\n\n if (bestMatch === null && nextSibling && isSoftMatch(cursor, nextSibling)) {\n // The next new node has a soft match with this node, so\n // increment the count of future soft matches\n siblingSoftMatchCount++\n nextSibling = nextSibling.nextSibling\n\n // If there are two future soft matches, block soft matching for this node to allow\n // future siblings to soft match. This is to reduce churn in the DOM when an element\n // is prepended.\n if (siblingSoftMatchCount >= 2) {\n bestMatch = undefined\n }\n }\n\n cursor = cursor.nextSibling\n }\n\n return bestMatch || null\n}\n\n// ok to cast: if one is not element, `id` and `tagName` will be null and we'll just compare that.\nconst isSoftMatch = (oldNode: Node, newNode: Node): boolean =>\n oldNode.nodeType === newNode.nodeType &&\n (oldNode as Element).tagName === (newNode as Element).tagName &&\n // If oldElt has an `id` with possible state and it doesn\u2019t match newElt.id then avoid morphing.\n // We'll still match an anonymous node with an IDed newElt, though, because if it got this far,\n // its not persistent, and new nodes can't have any hidden state.\n (!(oldNode as Element).id ||\n (oldNode as Element).id === (newNode as Element).id)\n\n// Gets rid of an unwanted DOM node; strategy depends on nature of its reuse:\n// - Persistent nodes will be moved to the pantry for later reuse\n// - Other nodes will have their hooks called, and then are removed\nconst removeNode = (node: Node): void => {\n // are we going to id set match this later?\n ctxIdMap.has(node)\n ? // skip callbacks and move to pantry\n moveBefore(ctxPantry, node, null)\n : // remove for realsies\n node.parentNode?.removeChild(node)\n}\n\n// Moves an element before another element within the same parent.\n// Uses the proposed `moveBefore` API if available (and working), otherwise falls back to `insertBefore`.\n// This is essentially a forward-compat wrapper.\nconst moveBefore = (parentNode: Node, node: Node, after: Node | null): void => {\n if ('moveBefore' in parentNode) {\n const moveableParent = parentNode as Node & {\n moveBefore: (node: Node, child: Node | null) => Node\n }\n moveableParent.moveBefore(node, after)\n return\n }\n parentNode.insertBefore(node, after)\n}\n\nconst aliasedPreserveAttr = aliasify('preserve-attr')\n\n// syncs the oldNode to the newNode, copying over all attributes and\n// inner element state from the newNode to the oldNode\nconst morphNode = (\n oldNode: Node, // root node to merge content into\n newNode: Node, // new content to merge\n): Node => {\n const type = newNode.nodeType\n\n // if is an element type, sync the attributes from the\n // new node into the new node\n if (type === 1 /* element type */) {\n const oldElt = oldNode as Element\n const newElt = newNode as Element\n const shouldScopeChildren = oldElt.hasAttribute('data-scope-children')\n if (\n oldElt.hasAttribute(aliasedIgnoreMorph) &&\n newElt.hasAttribute(aliasedIgnoreMorph)\n ) {\n return oldNode\n }\n\n // The following logic for handling inputs, textareas, and options is finnicky.\n // Only change with extreme caution and lots of testing!\n // --\n // many bothans died to bring us this information:\n // https://github.com/patrick-steele-idem/morphdom/blob/master/src/specialElHandlers.js\n // https://github.com/choojs/nanomorph/blob/master/lib/morph.js#L113\n // --\n\n const preserveAttrs = (\n (newNode as HTMLElement).getAttribute(aliasedPreserveAttr) ?? ''\n ).split(' ')\n\n const updateElementProp = (\n oldElt: Element,\n newElt: Element,\n name: string,\n ): boolean => {\n const newEltHasAttr = newElt.hasAttribute(name)\n if (\n oldElt.hasAttribute(name) !== newEltHasAttr &&\n !preserveAttrs.includes(name)\n ) {\n // @ts-expect-error - setting dynamic property for native DOM properties\n oldElt[name] = newEltHasAttr\n return true\n }\n return false\n }\n\n let shouldDispatchPropChangeEvent = false\n if (\n oldElt instanceof HTMLInputElement &&\n newElt instanceof HTMLInputElement &&\n newElt.type !== 'file'\n ) {\n // Modify the value only if the new element\u2019s value attribute is different from the old element\u2019s value attribute\n const newValue = newElt.getAttribute('value')\n if (\n oldElt.getAttribute('value') !== newValue &&\n !preserveAttrs.includes('value')\n ) {\n oldElt.value = newValue ?? ''\n shouldDispatchPropChangeEvent = true\n }\n // Update checked and disabled properties\n shouldDispatchPropChangeEvent =\n updateElementProp(oldElt, newElt, 'checked') ||\n shouldDispatchPropChangeEvent\n updateElementProp(oldElt, newElt, 'disabled')\n } else if (\n oldElt instanceof HTMLTextAreaElement &&\n newElt instanceof HTMLTextAreaElement\n ) {\n // Modify the value only if the new element\u2019s value is different from the old element\u2019s default value\n const newValue = newElt.value\n if (oldElt.defaultValue !== newValue) {\n oldElt.value = newValue\n shouldDispatchPropChangeEvent = true\n }\n } else if (\n oldElt instanceof HTMLOptionElement &&\n newElt instanceof HTMLOptionElement\n ) {\n shouldDispatchPropChangeEvent =\n updateElementProp(oldElt, newElt, 'selected') ||\n shouldDispatchPropChangeEvent\n }\n\n for (const { name, value } of newElt.attributes) {\n if (\n oldElt.getAttribute(name) !== value &&\n !preserveAttrs.includes(name)\n ) {\n oldElt.setAttribute(name, value)\n }\n }\n\n // Create a static copy, so we can iterate forward safely as we remove attributes\n for (const { name } of Array.from(oldElt.attributes)) {\n if (!newElt.hasAttribute(name) && !preserveAttrs.includes(name)) {\n oldElt.removeAttribute(name)\n }\n }\n\n if (shouldDispatchPropChangeEvent) {\n const dispatchElt =\n oldElt instanceof HTMLOptionElement ? oldElt.closest('select') : oldElt\n dispatchElt?.dispatchEvent(\n new Event(DATASTAR_PROP_CHANGE_EVENT, { bubbles: true }),\n )\n }\n\n // Preserve the scope marker even if the incoming markup doesn't carry it.\n if (shouldScopeChildren && !oldElt.hasAttribute('data-scope-children')) {\n oldElt.setAttribute('data-scope-children', '')\n }\n\n if (\n oldElt instanceof HTMLTemplateElement &&\n newElt instanceof HTMLTemplateElement\n ) {\n oldElt.innerHTML = newElt.innerHTML\n } else if (!oldElt.isEqualNode(newElt)) {\n morphChildren(oldElt, newElt)\n }\n\n if (shouldScopeChildren) {\n oldElt.dispatchEvent(\n new CustomEvent(DATASTAR_SCOPE_CHILDREN_EVENT, { bubbles: false }),\n )\n }\n }\n\n if (type === 8 /* comment */ || type === 3 /* text */) {\n if (oldNode.nodeValue !== newNode.nodeValue) {\n oldNode.nodeValue = newNode.nodeValue\n }\n }\n\n return oldNode\n}\n\n// A bottom-up algorithm that populates a map of Element -> IdSet.\n// The ID set for a given element is the set of all IDs contained within its subtree.\n// As an optimization, we filter these IDs through the given list of persistent IDs,\n// because we don't need to bother considering IDed elements that won't be in the new content.\nconst populateIdMapWithTree = (\n root: Element | ShadowRoot | null,\n elements: Iterable,\n): void => {\n for (const elt of elements) {\n if (ctxPersistentIds.has(elt.id)) {\n let current: Element | null = elt\n // walk up the parent hierarchy of that element, adding the ID of element to the parent's ID set\n while (current && current !== root) {\n let idSet = ctxIdMap.get(current)\n // if the ID set doesn\u2019t exist, create it and insert it in the map\n if (!idSet) {\n idSet = new Set()\n ctxIdMap.set(current, idSet)\n }\n idSet.add(elt.id)\n current = current.parentElement\n }\n }\n }\n}\n", "// Icon: material-symbols:settings-input-antenna\n// Slug: Patches signals.\n// Description: Patches signals.\n\nimport { watcher } from '@engine'\nimport { mergePatch } from '@engine/signals'\nimport { jsStrToObject } from '@utils/text'\n\nwatcher({\n name: 'datastar-patch-signals',\n apply({ error }, { signals, onlyIfMissing }) {\n if (typeof signals !== 'string') {\n throw error('PatchSignalsExpectedSignals')\n }\n\n const ifMissing =\n typeof onlyIfMissing === 'string' && onlyIfMissing.trim() === 'true'\n mergePatch(jsStrToObject(signals), { ifMissing })\n },\n})\n"], - "mappings": "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", - "names": ["lol", "DSP", "DSS", "DATASTAR_FETCH_EVENT", "DATASTAR_PROP_CHANGE_EVENT", "DATASTAR_READY_EVENT", "DATASTAR_SCOPE_CHILDREN_EVENT", "DATASTAR_SIGNAL_PATCH_EVENT", "hasOwn", "isPojo", "obj", "isEmpty", "prop", "hasOwn", "updateLeaves", "fn", "key", "val", "pathToObj", "paths", "result", "path", "value", "keys", "lastKey", "acc", "currentPatch", "queuedEffects", "batchDepth", "notifyIndex", "queuedEffectsLength", "prevSub", "activeSub", "version", "beginBatch", "endBatch", "flush", "dispatch", "startPeeking", "sub", "stopPeeking", "signal", "initialValue", "signalOper", "value_", "flags_", "computedSymbol", "computed", "getter", "c", "computedOper", "effect", "fn", "e", "fn_", "link", "effectOper", "run", "update", "updateComputed", "updateSignal", "startTracking", "oldValue", "endTracking", "s", "value", "notify", "flags", "subs", "subs_", "sub_", "checkDirty", "deps_", "dep", "dep_", "depFlags", "nextDep_", "propagate", "currentValue", "shallowPropagate", "unlink", "prevDep", "depsTail_", "nextDep", "version_", "subsTail_", "newLink", "prevDep_", "prevSub_", "nextSub_", "toRemove", "next", "stack", "top", "isValidLink", "subSubs", "nextSub", "prev_", "checkDepth", "dirty", "firstSub", "hasMultipleSubs", "checkLink", "getPath", "path", "result", "root", "split", "hasOwn", "deep", "prefix", "isArr", "isPojo", "deepObj", "key", "keys", "_", "prop", "newValue", "diff", "patch", "i", "pathStr", "nextVal", "detail", "pathToObj", "DATASTAR_SIGNAL_PATCH_EVENT", "mergePatch", "ifMissing", "mergeInner", "mergePaths", "paths", "options", "target", "targetParent", "toRegExp", "val", "filtered", "include", "exclude", "obj", "includeRe", "excludeRe", "node", "isHTMLOrSVG", "el", "kebab", "str", "camel", "x", "snake", "RE_FUNCTION_LITERAL", "jsStrToObject", "raw", "options", "reviveFunctionStrings", "_k", "value", "trimmed", "revived", "caseFns", "str", "x", "modifyCasing", "mods", "defaultCase", "c", "aliasify", "name", "unaliasify", "url", "error", "ctx", "reason", "metadata", "e", "r", "snake", "q", "c", "actionPlugins", "attributePlugins", "watcherPlugins", "actions", "_", "prop", "removals", "queuedAttributes", "queuedAttributeNames", "observedRoots", "datastarReadyDispatched", "attribute", "plugin", "roots", "root", "applyQueued", "action", "DATASTAR_FETCH_EVENT", "evt", "watcher", "cleanupEls", "els", "el", "elCleanups", "attrCleanups", "cleanup", "aliasedIgnore", "aliasify", "aliasedIgnoreAttr", "shouldIgnore", "applyEls", "onlyNew", "appliedKeys", "key", "attrKey", "applyAttributePlugin", "attr", "observe", "mutations", "target", "type", "attributeName", "addedNodes", "removedNodes", "node", "isHTMLOrSVG", "rawAttrKey", "unaliasify", "value", "mutationObserver", "parseAttributeKey", "rawKey", "namePart", "rawModifiers", "pluginName", "mods", "rawMod", "label", "mod", "isDocumentObserverActive", "dispatchDatastarReady", "DATASTAR_READY_EVENT", "observeRoot", "applyAttributePlugin", "el", "attrKey", "value", "onlyNew", "rawKey", "unaliasify", "pluginName", "key", "mods", "parseAttributeKey", "plugin", "attributePlugins", "queuedAttributeNames", "ctx", "error", "actionPlugins", "keyReq", "valueReq", "keyProvided", "valueProvided", "cleanups", "cachedRx", "args", "genRx", "cleanup", "elCleanups", "removals", "attrCleanups", "oldCleanup", "returnsValue", "argNames", "expr", "statementRe", "statements", "lastIdx", "last", "escaped", "escapeRe", "DSP", "DSS", "counter", "match", "k", "v", "quoted", "interpolationExpr", "signalName", "_", "innerSignalName", "acc", "part", "fn", "action", "name", "evt", "err", "actions", "root", "e", "action", "_", "fn", "startPeeking", "stopPeeking", "action", "_", "value", "filter", "startPeeking", "masked", "filtered", "updateLeaves", "mergePatch", "stopPeeking", "action", "_", "filter", "startPeeking", "masked", "filtered", "updateLeaves", "oldValue", "mergePatch", "stopPeeking", "abortControllers", "methodSupportsRequestBody", "method", "createHttpMethod", "name", "openWhenHiddenDefault", "action", "el", "evt", "error", "cleanups", "url", "selector", "userHeaders", "contentType", "include", "exclude", "openWhenHidden", "payload", "requestCancellation", "retry", "retryInterval", "retryScaler", "retryMaxWait", "retryMaxCount", "controller", "cleanupFn", "initialHeaders", "headers", "req", "response", "dispatchFetch", "ERROR", "type", "argsRawLines", "line", "i", "k", "v", "argsRaw", "isWrongContent", "RETRYING", "buildFetchEventSourceInit", "urlInstance", "queryParams", "startPeeking", "requestPayload", "filtered", "stopPeeking", "body", "formEl", "formData", "submitter", "preventDefault", "multipart", "formParams", "key", "value", "STARTED", "fetchEventSource", "e", "FINISHED", "RETRIES_FAILED", "DATASTAR_FETCH_EVENT", "err", "getBytes", "stream", "onChunk", "reader", "result", "getLines", "onLine", "buffer", "position", "fieldLength", "discardTrailingNewline", "arr", "concat", "bufLength", "lineStart", "lineEnd", "getMessages", "onId", "onRetry", "onMessage", "message", "newMessage", "decoder", "field", "valueOffset", "a", "b", "res", "resolve", "reject", "fetchInit", "input", "inputSignal", "inputHeaders", "inputOnOpen", "onmessage", "onclose", "onerror", "inputFetch", "responseOverrides", "rest", "curRequestController", "onVisibilityChange", "currentFetchInit", "create", "retryTimer", "dispose", "fetch", "onopen", "retries", "baseRetryInterval", "curRequestSignal", "dispatchNonSSE", "dispatchType", "argNames", "n", "kebab", "o", "status", "isNoContentStatus", "isRedirectStatus", "isErrorStatus", "ct", "script", "scriptAttributesHeader", "id", "interval", "innerErr", "attribute", "el", "key", "rx", "syncAttr", "val", "_k", "v", "update", "observer", "obj", "attributeFilter", "cleanup", "effect", "propAdapter", "prop", "events", "el", "value", "attrAdapter", "attr", "valueAdapter", "treatUndefinedAsString", "type", "dataURIRegex", "empty", "boundPath", "key", "rawKey", "signalName", "adapter", "initialValue", "rawAttribute", "aliasify", "selector", "checked", "input", "mergePaths", "inputs", "paths", "i", "hasOwn", "attribute", "mods", "error", "modifyCasing", "props", "syncSignal", "files", "signalFiles", "f", "resolve", "reader", "match", "typeMap", "option", "firstProp", "camel", "getPath", "path", "signalValue", "eventName", "DATASTAR_PROP_CHANGE_EVENT", "cleanup", "effect", "attribute", "key", "el", "mods", "rx", "modifyCasing", "classes", "callback", "observer", "k", "classNames", "cn", "name", "cleanup", "effect", "attribute", "key", "mods", "rx", "error", "mergePaths", "modifyCasing", "computed", "patch", "updateLeaves", "old", "mergePatch", "attribute", "rx", "effect", "attribute", "el", "key", "mods", "value", "signalName", "modifyCasing", "activeFetches", "mergePaths", "watcher", "event", "type", "elt", "STARTED", "FINISHED", "DATASTAR_FETCH_EVENT", "tagToMs", "args", "arg", "tagHas", "tags", "tag", "defaultValue", "tagFirst", "delay", "callback", "wait", "args", "throttle", "leading", "trailing", "debounce", "lastArgs", "timer", "modifyTiming", "mods", "delayArgs", "tagToMs", "debounceArgs", "tagHas", "throttleArgs", "supportsViewTransitions", "modifyViewTransition", "callback", "mods", "cb", "args", "attribute", "rx", "mods", "callback", "beginBatch", "endBatch", "modifyViewTransition", "wait", "delayArgs", "tagToMs", "delay", "attribute", "el", "value", "mods", "spaces", "filters", "jsStrToObject", "callback", "observer", "filtered", "cleanup", "effect", "attribute", "el", "key", "mods", "rx", "target", "callback", "evt", "beginBatch", "endBatch", "modifyViewTransition", "modifyTiming", "eventName", "modifyCasing", "evtListOpts", "cb", "DATASTAR_FETCH_EVENT", "DATASTAR_SIGNAL_PATCH_EVENT", "listener", "clamp", "value", "min", "max", "once", "attribute", "el", "mods", "rx", "callback", "beginBatch", "endBatch", "modifyViewTransition", "modifyTiming", "options", "threshold", "clamp", "tagFirst", "exit", "observer", "entries", "entry", "attribute", "mods", "rx", "callback", "beginBatch", "endBatch", "modifyViewTransition", "duration", "durationArgs", "tagToMs", "tagHas", "intervalId", "attribute", "el", "key", "mods", "rx", "error", "filterAttr", "aliasify", "filtersRaw", "filters", "jsStrToObject", "running", "callback", "modifyTiming", "evt", "watched", "filtered", "isEmpty", "beginBatch", "endBatch", "DATASTAR_SIGNAL_PATCH_EVENT", "attribute", "el", "key", "mods", "value", "signalName", "modifyCasing", "mergePaths", "NONE", "DISPLAY", "attribute", "el", "rx", "update", "observer", "cleanup", "effect", "attribute", "key", "mods", "rx", "ifMissing", "modifyCasing", "value", "mergePaths", "patch", "mergePatch", "attribute", "key", "el", "rx", "style", "initialStyles", "apply", "prop", "value", "initial", "update", "observer", "styles", "kebab", "cleanup", "effect", "attribute", "el", "rx", "update", "observer", "cleanup", "effect", "isValidType", "arr", "value", "PATCH_MODES", "NAMESPACES", "watcher", "ctx", "args", "selector", "mode", "namespace", "useViewTransitionRaw", "elements", "args2", "supportsViewTransitions", "onPatchElements", "error", "newContent", "consume", "elementsWithSvgsRemoved", "hasHtml", "hasHead", "hasBody", "wrapperTag", "wrappedEls", "newDocument", "wrapperEl", "child", "children", "target", "applyToTargets", "targets", "targetList", "scripts", "script", "execute", "elScripts", "old", "name", "applyPatchMode", "element", "action", "used", "nextNode", "morph", "scopeHost", "DATASTAR_SCOPE_CHILDREN_EVENT", "ctxIdMap", "ctxPersistentIds", "oldIdTagNameMap", "duplicateIds", "ctxPantry", "aliasedIgnoreMorph", "aliasify", "aliasedIgnoreMorphAttr", "oldElt", "isHTMLOrSVG", "normalizedElt", "oldIdElements", "id", "tagName", "newIdElements", "parent", "populateIdMapWithTree", "morphChildren", "oldParent", "newParent", "insertionPoint", "endPoint", "newChild", "bestMatch", "findBestMatch", "cursor", "tempNode", "removeNode", "morphNode", "movedChild", "current", "idSet", "moveBefore", "namespaceURI", "newEmptyChild", "newClonedChild", "node", "startPoint", "nextSibling", "siblingSoftMatchCount", "displaceMatchCount", "nodeMatchCount", "isSoftMatch", "isIdSetMatch", "oldSet", "newSet", "oldNode", "newNode", "parentNode", "after", "aliasedPreserveAttr", "type", "newElt", "shouldScopeChildren", "preserveAttrs", "updateElementProp", "newEltHasAttr", "shouldDispatchPropChangeEvent", "newValue", "DATASTAR_PROP_CHANGE_EVENT", "root", "elt", "watcher", "error", "signals", "onlyIfMissing", "ifMissing", "mergePatch", "jsStrToObject"] + "sourcesContent": ["const lol = /\uD83D\uDD95JS_DS\uD83D\uDE80/.source\nexport const DSP = lol.slice(0, 5)\nexport const DSS = lol.slice(4)\nexport const DATASTAR_FETCH_EVENT = 'datastar-fetch'\nexport const DATASTAR_PROP_CHANGE_EVENT = 'datastar-prop-change'\nexport const DATASTAR_READY_EVENT = 'datastar-ready'\nexport const DATASTAR_SCOPE_CHILDREN_EVENT = 'datastar-scope-children'\nexport const DATASTAR_SIGNAL_PATCH_EVENT = 'datastar-signal-patch'\n", "export const hasOwn: (obj: object, prop: PropertyKey) => boolean =\n // @ts-expect-error\n Object.hasOwn ?? Object.prototype.hasOwnProperty.call\n", "import type { Paths } from '@engine/types'\nimport { hasOwn } from '@utils/polyfills'\n\nexport const isPojo = (obj: any): obj is Record =>\n obj !== null &&\n typeof obj === 'object' &&\n (Object.getPrototypeOf(obj) === Object.prototype ||\n Object.getPrototypeOf(obj) === null)\n\nexport const isEmpty = (obj: Record): boolean => {\n for (const prop in obj) {\n if (hasOwn(obj, prop)) {\n return false\n }\n }\n return true\n}\n\nexport const updateLeaves = (\n obj: Record,\n fn: (oldValue: any) => any,\n) => {\n for (const key in obj) {\n const val = obj[key]\n if (isPojo(val) || Array.isArray(val)) {\n updateLeaves(val, fn)\n } else {\n obj[key] = fn(val)\n }\n }\n}\n\nexport const pathToObj = (paths: Paths): Record => {\n const result: Record = {}\n for (const [path, value] of paths) {\n const keys = path.split('.')\n const lastKey = keys.pop()!\n const obj = keys.reduce((acc, key) => (acc[key] ??= {}), result)\n obj[lastKey] = value\n }\n return result\n}\n", "import { DATASTAR_SIGNAL_PATCH_EVENT } from '@engine/consts'\nimport type {\n Computed,\n Effect,\n JSONPatch,\n MergePatchArgs,\n Paths,\n Signal,\n SignalFilterOptions,\n} from '@engine/types'\nimport { isPojo, pathToObj } from '@utils/paths'\nimport { hasOwn } from '@utils/polyfills'\n\ninterface ReactiveNode {\n deps_?: Link\n depsTail_?: Link\n subs_?: Link\n subsTail_?: Link\n flags_: ReactiveFlags\n}\n\ninterface Link {\n version_: number\n dep_: ReactiveNode\n sub_: ReactiveNode\n prevSub_?: Link\n nextSub_?: Link\n prevDep_?: Link\n nextDep_?: Link\n}\n\ninterface Stack {\n value_: T\n prev_?: Stack\n}\n\nenum ReactiveFlags {\n None = 0,\n Mutable = 1 << 0,\n Watching = 1 << 1,\n RecursedCheck = 1 << 2,\n Recursed = 1 << 3,\n Dirty = 1 << 4,\n Pending = 1 << 5,\n}\n\nenum EffectFlags {\n Queued = 1 << 6,\n}\n\ninterface AlienEffect extends ReactiveNode {\n fn_(): void\n}\n\ninterface AlienComputed extends ReactiveNode {\n value_?: T\n getter(previousValue?: T): T\n}\n\ninterface AlienSignal extends ReactiveNode {\n previousValue: T\n value_: T\n}\n\nconst currentPatch: Paths = []\nconst queuedEffects: (AlienEffect | undefined)[] = []\nlet batchDepth = 0\nlet notifyIndex = 0\nlet queuedEffectsLength = 0\nlet prevSub: ReactiveNode | undefined\nlet activeSub: ReactiveNode | undefined\nlet version = 0\n\nexport const beginBatch = (): void => {\n batchDepth++\n}\n\nexport const endBatch = (): void => {\n if (!--batchDepth) {\n flush()\n dispatch()\n }\n}\n\nexport const startPeeking = (sub?: ReactiveNode): void => {\n prevSub = activeSub\n activeSub = sub\n}\n\nexport const stopPeeking = (): void => {\n activeSub = prevSub\n prevSub = undefined\n}\n\nexport const signal = (initialValue?: T): Signal => {\n return signalOper.bind(0, {\n previousValue: initialValue,\n value_: initialValue,\n flags_: 1 satisfies ReactiveFlags.Mutable,\n }) as Signal\n}\n\nconst computedSymbol = Symbol('computed')\nexport const computed = (getter: (previousValue?: T) => T): Computed => {\n const c = computedOper.bind(0, {\n flags_: 17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty,\n getter,\n }) as Computed\n // @ts-expect-error\n c[computedSymbol] = 1\n return c\n}\n\nexport const effect = (fn: () => void): Effect => {\n const e: AlienEffect = {\n fn_: fn,\n flags_: 2 satisfies ReactiveFlags.Watching,\n }\n if (activeSub) {\n link(e, activeSub)\n }\n startPeeking(e)\n beginBatch()\n try {\n e.fn_()\n } finally {\n endBatch()\n stopPeeking()\n }\n return effectOper.bind(0, e)\n}\n\nconst flush = () => {\n while (notifyIndex < queuedEffectsLength) {\n const effect = queuedEffects[notifyIndex]!\n queuedEffects[notifyIndex++] = undefined\n run(effect, (effect.flags_ &= ~EffectFlags.Queued))\n }\n notifyIndex = 0\n queuedEffectsLength = 0\n}\n\nconst update = (signal: AlienSignal | AlienComputed): boolean => {\n if ('getter' in signal) {\n return updateComputed(signal)\n }\n return updateSignal(signal, signal.value_)\n}\n\nconst updateComputed = (c: AlienComputed): boolean => {\n startPeeking(c)\n startTracking(c)\n try {\n const oldValue = c.value_\n return oldValue !== (c.value_ = c.getter(oldValue))\n } finally {\n stopPeeking()\n endTracking(c)\n }\n}\n\nconst updateSignal = (s: AlienSignal, value: T): boolean => {\n s.flags_ = 1 satisfies ReactiveFlags.Mutable\n return s.previousValue !== (s.previousValue = value)\n}\n\nconst notify = (e: AlienEffect): void => {\n const flags = e.flags_\n if (!(flags & EffectFlags.Queued)) {\n e.flags_ = flags | EffectFlags.Queued\n const subs = e.subs_\n if (subs) {\n notify(subs.sub_ as AlienEffect)\n } else {\n queuedEffects[queuedEffectsLength++] = e\n }\n }\n}\n\nconst run = (e: AlienEffect, flags: ReactiveFlags): void => {\n if (\n flags & (16 satisfies ReactiveFlags.Dirty) ||\n (flags & (32 satisfies ReactiveFlags.Pending) && checkDirty(e.deps_!, e))\n ) {\n startPeeking(e)\n startTracking(e)\n beginBatch()\n try {\n e.fn_()\n } finally {\n endBatch()\n stopPeeking()\n endTracking(e)\n }\n return\n }\n if (flags & (32 satisfies ReactiveFlags.Pending)) {\n e.flags_ = flags & ~(32 satisfies ReactiveFlags.Pending)\n }\n let link = e.deps_\n while (link) {\n const dep = link.dep_\n const depFlags = dep.flags_\n if (depFlags & EffectFlags.Queued) {\n run(dep as AlienEffect, (dep.flags_ = depFlags & ~EffectFlags.Queued))\n }\n link = link.nextDep_\n }\n}\n\nconst signalOper = (s: AlienSignal, ...value: [T]): T | boolean => {\n if (value.length) {\n if (s.value_ !== (s.value_ = value[0])) {\n s.flags_ = 17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty\n const subs = s.subs_\n if (subs) {\n propagate(subs)\n if (!batchDepth) {\n flush()\n }\n }\n return true\n }\n return false\n }\n const currentValue = s.value_\n if (s.flags_ & (16 satisfies ReactiveFlags.Dirty)) {\n if (updateSignal(s, currentValue)) {\n const subs_ = s.subs_\n if (subs_) {\n shallowPropagate(subs_)\n }\n }\n }\n if (activeSub) {\n link(s, activeSub)\n }\n return currentValue\n}\n\nconst computedOper = (c: AlienComputed): T => {\n const flags = c.flags_\n if (\n flags & (16 satisfies ReactiveFlags.Dirty) ||\n (flags & (32 satisfies ReactiveFlags.Pending) && checkDirty(c.deps_!, c))\n ) {\n if (updateComputed(c)) {\n const subs = c.subs_\n if (subs) {\n shallowPropagate(subs)\n }\n }\n } else if (flags & (32 satisfies ReactiveFlags.Pending)) {\n c.flags_ = flags & ~(32 satisfies ReactiveFlags.Pending)\n }\n if (activeSub) {\n link(c, activeSub)\n }\n return c.value_!\n}\n\nconst effectOper = (e: AlienEffect): void => {\n let dep = e.deps_\n while (dep) {\n dep = unlink(dep, e)\n }\n const sub = e.subs_\n if (sub) {\n unlink(sub)\n }\n e.flags_ = 0 satisfies ReactiveFlags.None\n}\n\nconst link = (dep: ReactiveNode, sub: ReactiveNode): void => {\n const prevDep = sub.depsTail_\n if (prevDep && prevDep.dep_ === dep) {\n return\n }\n const nextDep = prevDep ? prevDep.nextDep_ : sub.deps_\n if (nextDep && nextDep.dep_ === dep) {\n nextDep.version_ = version\n sub.depsTail_ = nextDep\n return\n }\n const prevSub = dep.subsTail_\n if (prevSub && prevSub.version_ === version && prevSub.sub_ === sub) {\n return\n }\n const newLink =\n (sub.depsTail_ =\n dep.subsTail_ =\n {\n version_: version,\n dep_: dep,\n sub_: sub,\n prevDep_: prevDep,\n nextDep_: nextDep,\n prevSub_: prevSub,\n })\n if (nextDep) {\n nextDep.prevDep_ = newLink\n }\n if (prevDep) {\n prevDep.nextDep_ = newLink\n } else {\n sub.deps_ = newLink\n }\n if (prevSub) {\n prevSub.nextSub_ = newLink\n } else {\n dep.subs_ = newLink\n }\n}\n\nconst unlink = (link: Link, sub = link.sub_): Link | undefined => {\n const dep_ = link.dep_\n const prevDep_ = link.prevDep_\n const nextDep_ = link.nextDep_\n const nextSub_ = link.nextSub_\n const prevSub_ = link.prevSub_\n if (nextDep_) {\n nextDep_.prevDep_ = prevDep_\n } else {\n sub.depsTail_ = prevDep_\n }\n if (prevDep_) {\n prevDep_.nextDep_ = nextDep_\n } else {\n sub.deps_ = nextDep_\n }\n if (nextSub_) {\n nextSub_.prevSub_ = prevSub_\n } else {\n dep_.subsTail_ = prevSub_\n }\n if (prevSub_) {\n prevSub_.nextSub_ = nextSub_\n } else if (!(dep_.subs_ = nextSub_)) {\n if ('getter' in dep_) {\n let toRemove = dep_.deps_\n if (toRemove) {\n dep_.flags_ = 17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty\n do {\n toRemove = unlink(toRemove, dep_)\n } while (toRemove)\n }\n } else if (!('previousValue' in dep_)) {\n effectOper(dep_ as AlienEffect)\n }\n }\n return nextDep_\n}\n\nconst propagate = (link: Link): void => {\n let next = link.nextSub_\n let stack: Stack | undefined\n\n top: while (true) {\n const sub = link.sub_\n\n let flags = sub.flags_\n\n if (\n !(\n flags &\n (60 as\n | ReactiveFlags.RecursedCheck\n | ReactiveFlags.Recursed\n | ReactiveFlags.Dirty\n | ReactiveFlags.Pending)\n )\n ) {\n sub.flags_ = flags | (32 satisfies ReactiveFlags.Pending)\n } else if (\n !(flags & (12 as ReactiveFlags.RecursedCheck | ReactiveFlags.Recursed))\n ) {\n flags = 0 satisfies ReactiveFlags.None\n } else if (!(flags & (4 satisfies ReactiveFlags.RecursedCheck))) {\n sub.flags_ =\n (flags & ~(8 satisfies ReactiveFlags.Recursed)) |\n (32 satisfies ReactiveFlags.Pending)\n } else if (\n !(flags & (48 as ReactiveFlags.Dirty | ReactiveFlags.Pending)) &&\n isValidLink(link, sub)\n ) {\n sub.flags_ =\n flags | (40 as ReactiveFlags.Recursed | ReactiveFlags.Pending)\n flags &= 1 satisfies ReactiveFlags.Mutable\n } else {\n flags = 0 satisfies ReactiveFlags.None\n }\n\n if (flags & (2 satisfies ReactiveFlags.Watching)) {\n notify(sub as AlienEffect)\n }\n\n if (flags & (1 satisfies ReactiveFlags.Mutable)) {\n const subSubs = sub.subs_\n if (subSubs) {\n const nextSub = (link = subSubs).nextSub_\n if (nextSub) {\n stack = { value_: next, prev_: stack }\n next = nextSub\n }\n continue\n }\n }\n\n if ((link = next!)) {\n next = link.nextSub_\n continue\n }\n\n while (stack) {\n link = stack.value_!\n stack = stack.prev_\n if (link) {\n next = link.nextSub_\n continue top\n }\n }\n\n break\n }\n}\n\nconst startTracking = (sub: ReactiveNode): void => {\n version++\n sub.depsTail_ = undefined\n sub.flags_ =\n (sub.flags_ &\n ~(56 as\n | ReactiveFlags.Recursed\n | ReactiveFlags.Dirty\n | ReactiveFlags.Pending)) |\n (4 satisfies ReactiveFlags.RecursedCheck)\n}\n\nconst endTracking = (sub: ReactiveNode): void => {\n const depsTail_ = sub.depsTail_\n let toRemove = depsTail_ ? depsTail_.nextDep_ : sub.deps_\n while (toRemove) {\n toRemove = unlink(toRemove, sub)\n }\n sub.flags_ &= ~(4 satisfies ReactiveFlags.RecursedCheck)\n}\n\nconst checkDirty = (link: Link, sub: ReactiveNode): boolean => {\n let stack: Stack | undefined\n let checkDepth = 0\n let dirty = false\n\n top: while (true) {\n const dep = link.dep_\n const flags = dep.flags_\n\n if (sub.flags_ & (16 satisfies ReactiveFlags.Dirty)) {\n dirty = true\n } else if (\n (flags & (17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty)) ===\n (17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty)\n ) {\n if (update(dep as AlienSignal | AlienComputed)) {\n const subs = dep.subs_!\n if (subs.nextSub_) {\n shallowPropagate(subs)\n }\n dirty = true\n }\n } else if (\n (flags & (33 as ReactiveFlags.Mutable | ReactiveFlags.Pending)) ===\n (33 as ReactiveFlags.Mutable | ReactiveFlags.Pending)\n ) {\n if (link.nextSub_ || link.prevSub_) {\n stack = { value_: link, prev_: stack }\n }\n link = dep.deps_!\n sub = dep\n ++checkDepth\n continue\n }\n\n if (!dirty) {\n const nextDep = link.nextDep_\n if (nextDep) {\n link = nextDep\n continue\n }\n }\n\n while (checkDepth--) {\n const firstSub = sub.subs_!\n const hasMultipleSubs = firstSub.nextSub_\n if (hasMultipleSubs) {\n link = stack!.value_\n stack = stack!.prev_\n } else {\n link = firstSub\n }\n if (dirty) {\n if (update(sub as AlienSignal | AlienComputed)) {\n if (hasMultipleSubs) {\n shallowPropagate(firstSub)\n }\n sub = link.sub_\n continue\n }\n dirty = false\n } else {\n sub.flags_ &= ~(32 satisfies ReactiveFlags.Pending)\n }\n sub = link.sub_\n if (link.nextDep_) {\n link = link.nextDep_\n continue top\n }\n }\n\n return dirty\n }\n}\n\nconst shallowPropagate = (link: Link): void => {\n do {\n const sub = link.sub_\n const flags = sub.flags_\n if (\n (flags & (48 as ReactiveFlags.Pending | ReactiveFlags.Dirty)) ===\n (32 satisfies ReactiveFlags.Pending)\n ) {\n sub.flags_ = flags | (16 satisfies ReactiveFlags.Dirty)\n if (flags & (2 satisfies ReactiveFlags.Watching)) {\n notify(sub as AlienEffect)\n }\n }\n } while ((link = link.nextSub_!))\n}\n\nconst isValidLink = (checkLink: Link, sub: ReactiveNode): boolean => {\n let link = sub.depsTail_\n while (link) {\n if (link === checkLink) {\n return true\n }\n link = link.prevDep_\n }\n return false\n}\n\nexport const getPath = (path: string): T | undefined => {\n let result = root\n const split = path.split('.')\n for (const path of split) {\n if (result == null || !hasOwn(result, path)) {\n return\n }\n result = result[path]\n }\n return result as T\n}\n\nconst deep = (value: any, prefix = ''): any => {\n const isArr = Array.isArray(value)\n if (isArr || isPojo(value)) {\n const deepObj = (isArr ? [] : {}) as Record>\n for (const key in value) {\n deepObj[key] = signal(\n deep((value as Record>)[key], `${prefix + key}.`),\n )\n }\n const keys = signal(0)\n return new Proxy(deepObj, {\n get(_, prop: string) {\n // JSON.stringify calls `.toJSON()` directly instead of checking if it exists on the object\n // so we have to check if `toJSON` is being called and prevent a signal from automatically\n // being made so JSON.stringify can fallback to the default stringify\n if (!(prop === 'toJSON' && !hasOwn(deepObj, prop))) {\n // special case for when prop is an array function because every array function needs to\n // be reactive to when the keys change\n if (isArr && prop in Array.prototype) {\n keys()\n return deepObj[prop]\n }\n // if prop is a symbol just return the symbol because we don't want to make up that theres\n // an iterator symbol on an object or not\n if (typeof prop === 'symbol') {\n return deepObj[prop]\n }\n // if obj doesnt have prop OR prop is null or undefined then create a signal and default\n // to an empty string\n if (!hasOwn(deepObj, prop) || deepObj[prop]() == null) {\n deepObj[prop] = signal('')\n dispatch(prefix + prop, '')\n keys(keys() + 1)\n }\n return deepObj[prop]()\n }\n },\n set(_, prop: string, newValue) {\n const path = prefix + prop\n // special case for when setting length so we can make a diff patch\n if (isArr && prop === 'length') {\n const diff = (deepObj[prop] as unknown as number) - newValue\n deepObj[prop] = newValue\n // manually make a diff patch for now, shouldnt have to do this when object diffing is\n // implemented. see https://github.com/starfederation/datastar-dev/issues/274\n if (diff > 0) {\n const patch: Record = {}\n for (let i = newValue; i < deepObj[prop]; i++) {\n patch[i] = null\n }\n dispatch(prefix.slice(0, -1), patch)\n keys(keys() + 1)\n }\n } else if (hasOwn(deepObj, prop)) {\n if (newValue == null) {\n delete deepObj[prop]\n // if newValue is a computed set the computed directly instead of wrapping in signal\n } else if (hasOwn(newValue, computedSymbol)) {\n deepObj[prop] = newValue\n dispatch(path, '')\n // if prop changed after setting it then dispatch\n } else {\n const currentValue = deepObj[prop]()\n const pathStr = `${path}.`\n if (isPojo(currentValue) && isPojo(newValue)) {\n for (const key in currentValue) {\n if (!hasOwn(newValue, key)) {\n delete currentValue[key]\n dispatch(pathStr + key, null)\n }\n }\n for (const key in newValue) {\n const nextVal = newValue[key]\n if (currentValue[key] !== nextVal) {\n currentValue[key] = nextVal\n }\n }\n } else if (deepObj[prop](deep(newValue, pathStr))) {\n dispatch(path, newValue)\n }\n }\n // if newValue is null or undefined then noop\n } else if (newValue != null) {\n // if newValue is a computed set the computed directly instead of wrapping in signal\n if (hasOwn(newValue, computedSymbol)) {\n deepObj[prop] = newValue\n dispatch(path, '')\n } else {\n deepObj[prop] = signal(deep(newValue, `${path}.`))\n dispatch(path, newValue)\n }\n keys(keys() + 1)\n }\n\n return true\n },\n deleteProperty(_, prop: string) {\n delete deepObj[prop]\n keys(keys() + 1)\n return true\n },\n ownKeys() {\n keys()\n return Reflect.ownKeys(deepObj)\n },\n has(_, prop) {\n keys()\n return prop in deepObj\n },\n })\n }\n return value\n}\n\nconst dispatch = (path?: string, value?: any) => {\n if (path !== undefined && value !== undefined) {\n currentPatch.push([path, value])\n }\n if (!batchDepth && currentPatch.length) {\n const detail = pathToObj(currentPatch)\n currentPatch.length = 0\n document.dispatchEvent(\n new CustomEvent(DATASTAR_SIGNAL_PATCH_EVENT, {\n detail,\n }),\n )\n }\n}\n\nexport const mergePatch = (\n patch: JSONPatch,\n { ifMissing }: MergePatchArgs = {},\n): void => {\n beginBatch()\n for (const key in patch) {\n if (patch[key] == null) {\n if (!ifMissing) {\n delete root[key]\n }\n } else {\n mergeInner(patch[key], key, root, '', ifMissing)\n }\n }\n endBatch()\n}\n\nexport const mergePaths = (paths: Paths, options?: MergePatchArgs): void =>\n mergePatch(pathToObj(paths), options)\n\nconst mergeInner = (\n patch: any,\n target: string,\n targetParent: Record,\n prefix: string,\n ifMissing: boolean | undefined,\n): void => {\n if (isPojo(patch)) {\n if (\n !(\n hasOwn(targetParent, target) &&\n (isPojo(targetParent[target]) || Array.isArray(targetParent[target]))\n )\n ) {\n targetParent[target] = {}\n }\n\n for (const key in patch) {\n if (patch[key] == null) {\n if (!ifMissing) {\n delete targetParent[target][key]\n }\n } else {\n mergeInner(\n patch[key],\n key,\n targetParent[target],\n `${prefix + target}.`,\n ifMissing,\n )\n }\n }\n } else if (!(ifMissing && hasOwn(targetParent, target))) {\n targetParent[target] = patch\n }\n}\n\nconst toRegExp = (val: string | RegExp): RegExp =>\n typeof val === 'string' ? RegExp(val.replace(/^\\/|\\/$/g, '')) : val\n\n/**\n * Filters the root store based on an include and exclude RegExp\n *\n * @returns The filtered object\n */\nexport const filtered = (\n { include = /.*/, exclude = /(?!)/ }: SignalFilterOptions = {},\n obj: JSONPatch = root,\n): Record => {\n const includeRe = toRegExp(include)\n const excludeRe = toRegExp(exclude)\n const paths: Paths = []\n const stack: [any, string][] = [[obj, '']]\n\n while (stack.length) {\n const [node, prefix] = stack.pop()!\n\n for (const key in node) {\n const path = prefix + key\n if (isPojo(node[key])) {\n stack.push([node[key], `${path}.`])\n } else if (includeRe.test(path) && !excludeRe.test(path)) {\n paths.push([path, getPath(path)])\n }\n }\n }\n\n return pathToObj(paths)\n}\n\nexport const root: Record = deep({})\n", "import type { HTMLOrSVG } from '@engine/types'\n\nexport const isHTMLOrSVG = (el: Node): el is HTMLOrSVG =>\n el instanceof HTMLElement ||\n el instanceof SVGElement ||\n el instanceof MathMLElement\n", "import type { Modifiers } from '@engine/types'\n\nexport const kebab = (str: string): string =>\n str\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1-$2')\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/([a-z])([0-9]+)/gi, '$1-$2')\n .replace(/([0-9]+)([a-z])/gi, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase()\n\nexport const camel = (str: string): string =>\n kebab(str).replace(/-./g, (x) => x[1].toUpperCase())\n\nexport const snake = (str: string): string => kebab(str).replace(/-/g, '_')\n\nexport const pascal = (str: string): string =>\n camel(str).replace(/(^.|(?<=\\.).)/g, (x) => x[0].toUpperCase())\n\nexport const title = (str: string): string =>\n str.replace(/\\b\\w/g, (char) => char.toUpperCase())\n\nconst RE_FUNCTION_LITERAL =\n /^(?:(?:async\\s+)?function\\b|(?:async\\s*)?(?:\\([^)]*\\)|[A-Za-z_$][\\w$]*)\\s*=>)/\n\ntype JsStrToObjectOptions = {\n reviveFunctionStrings?: boolean\n}\n\nexport const jsStrToObject = (\n raw: string,\n options: JsStrToObjectOptions = {},\n) => {\n const { reviveFunctionStrings = false } = options\n try {\n if (!reviveFunctionStrings) return JSON.parse(raw)\n return JSON.parse(raw, (_k, value) => {\n if (typeof value !== 'string') return value\n const trimmed = value.trim()\n if (!RE_FUNCTION_LITERAL.test(trimmed)) return value\n try {\n const revived = Function(`return (${trimmed})`)()\n return typeof revived === 'function' ? revived : value\n } catch {\n return value\n }\n })\n } catch {\n // If JSON parsing fails, try to evaluate as a JavaScript object\n // This is less safe and should be used with caution\n return Function(`return (${raw})`)()\n }\n}\n\nconst caseFns: Record string> = {\n camel: (str) => str.replace(/-[a-z]/g, (x) => x[1].toUpperCase()),\n snake: (str) => str.replace(/-/g, '_'),\n pascal: (str) => str[0].toUpperCase() + caseFns.camel(str.slice(1)),\n}\n\nexport const modifyCasing = (\n str: string,\n mods: Modifiers,\n defaultCase = 'camel',\n): string => {\n for (const c of mods.get('case') || [defaultCase]) {\n str = caseFns[c]?.(str) || str\n }\n return str\n}\n\nexport const aliasify = (name: string) =>\n ALIAS ? `data-${ALIAS}-${name}` : `data-${name}`\n\nexport const unaliasify = (name: string) => {\n if (!ALIAS) return name\n if (!name.startsWith(`${ALIAS}-`)) return null\n return name.slice(ALIAS.length + 1)\n}\n", "import {\n DATASTAR_FETCH_EVENT,\n DATASTAR_READY_EVENT,\n DSP,\n DSS,\n} from '@engine/consts'\nimport { root } from '@engine/signals'\nimport type {\n ActionContext,\n ActionPlugin,\n AttributeContext,\n AttributePlugin,\n DatastarFetchEvent,\n HTMLOrSVG,\n Modifiers,\n Requirement,\n WatcherPlugin,\n} from '@engine/types'\nimport { isHTMLOrSVG } from '@utils/dom'\nimport { aliasify, snake, unaliasify } from '@utils/text'\n\nconst url = 'https://data-star.dev/errors'\n\nconst error = (\n ctx: Record,\n reason: string,\n metadata: Record = {},\n) => {\n Object.assign(metadata, ctx)\n const e = new Error()\n const r = snake(reason)\n const q = new URLSearchParams({\n metadata: JSON.stringify(metadata),\n }).toString()\n const c = JSON.stringify(metadata, null, 2)\n e.message = `${reason}\\nMore info: ${url}/${r}?${q}\\nContext: ${c}`\n return e\n}\n\nconst actionPlugins: Map = new Map()\nconst attributePlugins: Map = new Map()\nconst watcherPlugins: Map = new Map()\n\nexport const actions: Record<\n string,\n (ctx: ActionContext, ...args: any[]) => any\n> = new Proxy(\n {},\n {\n get: (_, prop: string) => actionPlugins.get(prop)?.apply,\n has: (_, prop: string) => actionPlugins.has(prop),\n ownKeys: () => Reflect.ownKeys(actionPlugins),\n set: () => false,\n deleteProperty: () => false,\n },\n)\n\n// Map of cleanups keyed by element, attribute name, and cleanup name\nconst removals = new Map void>>>()\n\nconst queuedAttributes: AttributePlugin[] = []\nconst queuedAttributeNames = new Set()\nconst observedRoots = new Set()\nlet datastarReadyDispatched = false\n\nexport const attribute = (\n plugin: AttributePlugin,\n): void => {\n queuedAttributes.push(plugin as unknown as AttributePlugin)\n\n if (queuedAttributes.length === 1) {\n setTimeout(() => {\n for (const attribute of queuedAttributes) {\n queuedAttributeNames.add(attribute.name)\n attributePlugins.set(attribute.name, attribute)\n }\n queuedAttributes.length = 0\n const roots = observedRoots.size\n ? [...observedRoots]\n : [document.documentElement]\n for (const root of roots) {\n applyQueued(root, !observedRoots.has(root))\n }\n queuedAttributeNames.clear()\n })\n }\n}\n\nexport const action = (plugin: ActionPlugin): void => {\n actionPlugins.set(plugin.name, plugin)\n}\n\ndocument.addEventListener(DATASTAR_FETCH_EVENT, ((\n evt: CustomEvent,\n) => {\n const plugin = watcherPlugins.get(evt.detail.type)\n if (plugin) {\n plugin.apply(\n {\n error: error.bind(0, {\n plugin: { type: 'watcher', name: plugin.name },\n element: {\n id: (evt.target as Element).id,\n tag: (evt.target as Element).tagName,\n },\n }),\n },\n evt.detail.argsRaw,\n )\n }\n}) as EventListener)\n\nexport const watcher = (plugin: WatcherPlugin): void => {\n watcherPlugins.set(plugin.name, plugin)\n}\n\nconst cleanupEls = (els: Iterable): void => {\n for (const el of els) {\n const elCleanups = removals.get(el)\n if (elCleanups && removals.delete(el)) {\n for (const attrCleanups of elCleanups.values()) {\n for (const cleanup of attrCleanups.values()) {\n cleanup()\n }\n }\n }\n }\n}\n\nconst aliasedIgnore = aliasify('ignore')\nconst aliasedIgnoreAttr = `[${aliasedIgnore}]`\nconst shouldIgnore = (el: HTMLOrSVG) =>\n el.hasAttribute(`${aliasedIgnore}__self`) || !!el.closest(aliasedIgnoreAttr)\n\nconst applyEls = (els: Iterable, onlyNew?: boolean): void => {\n for (const el of els) {\n if (!shouldIgnore(el)) {\n const appliedKeys = new Set()\n for (const key in el.dataset) {\n const attrKey = key.replace(/[A-Z]/g, '-$&').toLowerCase()\n appliedKeys.add(attrKey)\n applyAttributePlugin(el, attrKey, el.dataset[key]!, onlyNew)\n }\n for (const attr of Array.from(el.attributes)) {\n if (!attr.name.startsWith('data-')) continue\n const attrKey = attr.name.slice(5)\n if (appliedKeys.has(attrKey)) continue\n applyAttributePlugin(el, attrKey, attr.value, onlyNew)\n }\n }\n }\n}\n\nconst observe = (mutations: MutationRecord[]) => {\n for (const {\n target,\n type,\n attributeName,\n addedNodes,\n removedNodes,\n } of mutations) {\n if (type === 'childList') {\n for (const node of removedNodes) {\n if (isHTMLOrSVG(node)) {\n cleanupEls([node])\n cleanupEls(node.querySelectorAll('*'))\n }\n }\n\n for (const node of addedNodes) {\n if (isHTMLOrSVG(node)) {\n applyEls([node])\n applyEls(node.querySelectorAll('*'))\n }\n }\n } else if (\n type === 'attributes' &&\n attributeName!.startsWith('data-') &&\n isHTMLOrSVG(target) &&\n !shouldIgnore(target)\n ) {\n // skip over 'data-'\n const rawAttrKey = attributeName!.slice(5)\n const key = unaliasify(rawAttrKey)\n if (!key) continue\n const value = target.getAttribute(attributeName!)\n if (value === null) {\n const elCleanups = removals.get(target)\n if (elCleanups) {\n const attrCleanups = elCleanups.get(key)\n if (attrCleanups) {\n for (const cleanup of attrCleanups.values()) {\n cleanup()\n }\n elCleanups.delete(key)\n }\n }\n } else {\n applyAttributePlugin(target, rawAttrKey, value)\n }\n }\n }\n}\n\n// TODO: mutation observer per root so applying to web component doesnt overwrite main observer\nconst mutationObserver = new MutationObserver(observe)\n\nexport const parseAttributeKey = (\n rawKey: string,\n): {\n pluginName: string\n key: string | undefined\n mods: Modifiers\n} => {\n const [namePart, ...rawModifiers] = rawKey.split('__')\n const [pluginName, key] = namePart.split(/:(.+)/)\n const mods: Modifiers = new Map()\n\n for (const rawMod of rawModifiers) {\n const [label, ...mod] = rawMod.split('.')\n mods.set(label, new Set(mod))\n }\n\n return { pluginName, key, mods }\n}\n\nexport const isDocumentObserverActive = () =>\n observedRoots.has(document.documentElement)\n\nconst dispatchDatastarReady = () => {\n if (datastarReadyDispatched || !isDocumentObserverActive()) return\n datastarReadyDispatched = true\n document.dispatchEvent(new Event(DATASTAR_READY_EVENT))\n}\n\nconst applyQueued = (\n root: HTMLOrSVG | ShadowRoot = document.documentElement,\n observeRoot = true,\n): void => {\n if (isHTMLOrSVG(root)) {\n applyEls([root], true)\n }\n applyEls(root.querySelectorAll('*'), true)\n\n if (observeRoot) {\n mutationObserver.observe(root, {\n subtree: true,\n childList: true,\n attributes: true,\n })\n observedRoots.add(root)\n dispatchDatastarReady()\n }\n}\n\nexport const apply = (\n root: HTMLOrSVG | ShadowRoot = document.documentElement,\n observeRoot = true,\n): void => {\n if (isHTMLOrSVG(root)) {\n applyEls([root])\n }\n applyEls(root.querySelectorAll('*'))\n\n if (observeRoot) {\n mutationObserver.observe(root, {\n subtree: true,\n childList: true,\n attributes: true,\n })\n observedRoots.add(root)\n dispatchDatastarReady()\n }\n}\n\nexport const applyElement = (el: HTMLOrSVG, onlyNew = false): void => {\n applyEls([el], onlyNew)\n}\n\nconst applyAttributePlugin = (\n el: HTMLOrSVG,\n attrKey: string,\n value: string,\n onlyNew?: boolean,\n): void => {\n const rawKey = unaliasify(attrKey)\n if (!rawKey) return\n const { pluginName, key, mods } = parseAttributeKey(rawKey)\n const plugin = attributePlugins.get(pluginName)\n const shouldApply =\n (!onlyNew || queuedAttributeNames.has(pluginName)) && !!plugin\n if (shouldApply) {\n const ctx = {\n el,\n rawKey,\n mods,\n error: error.bind(0, {\n plugin: { type: 'attribute', name: plugin.name },\n element: { id: el.id, tag: el.tagName },\n expression: { rawKey, key, value },\n }),\n key,\n value,\n loadedPluginNames: {\n actions: new Set(actionPlugins.keys()),\n attributes: new Set(attributePlugins.keys()),\n },\n rx: undefined,\n } as AttributeContext\n\n const keyReq =\n (plugin.requirement &&\n (typeof plugin.requirement === 'string'\n ? plugin.requirement\n : plugin.requirement.key)) ||\n 'allowed'\n const valueReq =\n (plugin.requirement &&\n (typeof plugin.requirement === 'string'\n ? plugin.requirement\n : plugin.requirement.value)) ||\n 'allowed'\n\n const keyProvided = key !== undefined && key !== null && key !== ''\n const valueProvided = value !== undefined && value !== null && value !== ''\n\n if (keyProvided) {\n if (keyReq === 'denied') {\n throw ctx.error('KeyNotAllowed')\n }\n } else if (keyReq === 'must') {\n throw ctx.error('KeyRequired')\n }\n\n if (valueProvided) {\n if (valueReq === 'denied') {\n throw ctx.error('ValueNotAllowed')\n }\n } else if (valueReq === 'must') {\n throw ctx.error('ValueRequired')\n }\n\n if (keyReq === 'exclusive' || valueReq === 'exclusive') {\n if (keyProvided && valueProvided) {\n throw ctx.error('KeyAndValueProvided')\n }\n if (!keyProvided && !valueProvided) {\n throw ctx.error('KeyOrValueRequired')\n }\n }\n\n const cleanups = new Map void>()\n if (valueProvided) {\n let cachedRx: GenRxFn\n ctx.rx = (...args: any[]) => {\n if (!cachedRx) {\n cachedRx = genRx(value, {\n returnsValue: plugin.returnsValue,\n argNames: plugin.argNames,\n cleanups,\n })\n }\n return cachedRx(el, ...args)\n }\n }\n\n const cleanup = plugin.apply(ctx)\n if (cleanup) {\n cleanups.set('attribute', cleanup)\n }\n\n let elCleanups = removals.get(el)\n if (elCleanups) {\n const attrCleanups = elCleanups.get(rawKey)\n if (attrCleanups) {\n for (const oldCleanup of attrCleanups.values()) {\n oldCleanup()\n }\n }\n } else {\n elCleanups = new Map()\n removals.set(el, elCleanups)\n }\n elCleanups.set(rawKey, cleanups)\n }\n}\n\ntype GenRxOptions = {\n returnsValue?: boolean\n argNames?: string[]\n cleanups?: Map void>\n}\n\ntype GenRxFn = (el: HTMLOrSVG, ...args: any[]) => T\n\nexport const genRx = (\n value: string,\n {\n returnsValue = false,\n argNames = [],\n cleanups = new Map(),\n }: GenRxOptions = {},\n): GenRxFn => {\n let expr = ''\n if (returnsValue) {\n // This regex allows Datastar expressions to support nested\n // regex and strings that contain ; without breaking.\n //\n // Each of these regex defines a block type we want to match\n // (importantly we ignore the content within these blocks):\n //\n // regex \\/(\\\\\\/|[^\\/])*\\/\n // double quotes \"(\\\\\"|[^\\\"])*\"\n // single quotes '(\\\\'|[^'])*'\n // ticks `(\\\\`|[^`])*`\n // iife \\(\\s*((function)\\s*\\(\\s*\\)|(\\(\\s*\\))\\s*=>)\\s*(?:\\{[\\s\\S]*?\\}|[^;)\\{]*)\\s*\\)\\s*\\(\\s*\\)\n //\n // The iife support is (intentionally) limited. It only supports\n // function and arrow syntax with no arguments, and no nested IIFEs.\n //\n // We also want to match the non delimiter part of statements\n // note we only support ; statement delimiters:\n //\n // [^;]\n //\n const statementRe =\n /(\\/(\\\\\\/|[^/])*\\/|\"(\\\\\"|[^\"])*\"|'(\\\\'|[^'])*'|`(\\\\`|[^`])*`|\\(\\s*((function)\\s*\\(\\s*\\)|(\\(\\s*\\))\\s*=>)\\s*(?:\\{[\\s\\S]*?\\}|[^;){]*)\\s*\\)\\s*\\(\\s*\\)|[^;])+/gm\n const statements = value.trim().match(statementRe)\n if (statements) {\n const lastIdx = statements.length - 1\n const last = statements[lastIdx].trim()\n if (!last.startsWith('return')) {\n statements[lastIdx] = `return (${last});`\n }\n expr = statements.join(';\\n')\n }\n } else {\n expr = value.trim()\n }\n\n // Ignore any escaped values\n const escaped = new Map()\n const escapeRe = RegExp(`(?:${DSP})(.*?)(?:${DSS})`, 'gm')\n let counter = 0\n for (const match of expr.matchAll(escapeRe)) {\n const k = match[1]\n const v = `__escaped${counter++}`\n escaped.set(v, k)\n expr = expr.replace(DSP + k + DSS, v)\n }\n\n // Replace signal references with bracket notation\n // Examples:\n // $count -> $['count']\n // $count-- -> $['count']--\n // $foo.bar -> $['foo']['bar']\n // $foo-bar -> $['foo-bar']\n // $foo.bar-baz -> $['foo']['bar-baz']\n // $foo-$bar -> $['foo']-$['bar']\n // $arr[$index] -> $['arr'][$['index']]\n // $['foo'] -> $['foo']\n // $foo[obj.bar] -> $['foo'][obj.bar]\n // $foo['bar.baz'] -> $['foo']['bar.baz']\n // $123 -> $['123']\n // $foo.0.name -> $['foo']['0']['name']\n\n // Skip replacements inside string/template literals.\n // Template interpolation support rewrites `${...}` only when braces are non-nested.\n expr = expr.replace(\n /(\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*'|`(?:\\\\.|[^`\\\\$]|\\$(?!\\{))*`)|\\$\\{([^{}]*)\\}|\\$([a-zA-Z_\\d]\\w*(?:[.-]\\w+)*)/g,\n (match, quoted, interpolationExpr, signalName) => {\n if (quoted) return match\n if (interpolationExpr !== undefined) {\n return `\\${${interpolationExpr.replace(\n /\\$([a-zA-Z_\\d]\\w*(?:[.-]\\w+)*)/g,\n (_: string, innerSignalName: string) =>\n innerSignalName\n .split('.')\n .reduce((acc: string, part: string) => `${acc}['${part}']`, '$'),\n )}}`\n }\n return signalName\n .split('.')\n .reduce((acc: string, part: string) => `${acc}['${part}']`, '$')\n },\n )\n\n expr = expr.replaceAll(/@([A-Za-z_$][\\w$]*)\\(/g, '__action(\"$1\",evt,')\n\n // Replace any escaped values\n for (const [k, v] of escaped) {\n expr = expr.replace(k, v)\n }\n\n try {\n const fn = Function('el', '$', '__action', 'evt', ...argNames, expr)\n return (el: HTMLOrSVG, ...args: any[]) => {\n const action = (name: string, evt: Event | undefined, ...args: any[]) => {\n const err = error.bind(0, {\n plugin: { type: 'action', name },\n element: { id: el.id, tag: el.tagName },\n expression: {\n fnContent: expr,\n value,\n },\n })\n const fn = actions[name]\n if (fn) {\n return fn(\n {\n el,\n evt,\n error: err,\n cleanups,\n },\n ...args,\n )\n }\n throw err('UndefinedAction')\n }\n try {\n return fn(el, root, action, undefined, ...args)\n } catch (e: any) {\n console.error(e)\n throw error(\n {\n element: { id: el.id, tag: el.tagName },\n expression: {\n fnContent: expr,\n value,\n },\n error: e.message,\n },\n 'ExecuteExpression',\n )\n }\n }\n } catch (e: any) {\n console.error(e)\n throw error(\n {\n expression: {\n fnContent: expr,\n value,\n },\n error: e.message,\n },\n 'GenerateExpression',\n )\n }\n}\n", "// Icon: ion:eye\n// Slug: Access signals without subscribing to changes.\n// Description: Allows accessing signals without subscribing to their changes in expressions.\n\nimport { action } from '@engine'\nimport { startPeeking, stopPeeking } from '@engine/signals'\n\naction({\n name: 'peek',\n apply(_, fn: () => any) {\n startPeeking()\n try {\n return fn()\n } finally {\n stopPeeking()\n }\n },\n})\n", "// Icon: ion:checkmark-round\n// Slug: Sets the value of all matching signals.\n// Description: Sets the value of all matching signals (or all signals if no filter is used) to the expression provided in the first argument.\n\nimport { action } from '@engine'\nimport {\n filtered,\n mergePatch,\n startPeeking,\n stopPeeking,\n} from '@engine/signals'\nimport type { SignalFilterOptions } from '@engine/types'\nimport { updateLeaves } from '@utils/paths'\n\naction({\n name: 'setAll',\n apply(_, value: any, filter: SignalFilterOptions) {\n // peek because in an effect you would be subscribing to signals and then setting them which\n // would cause an infinite loop and why would you want to infinite loop on purpose\n startPeeking()\n const masked = filtered(filter)\n updateLeaves(masked, () => value)\n mergePatch(masked)\n stopPeeking()\n },\n})\n", "// Icon: material-symbols:toggle-off\n// Slug: Toggles the value of all matching signals.\n// Description: Toggles the boolean value of all matching signals (or all signals if no filter is used).\n\nimport { action } from '@engine'\nimport {\n filtered,\n mergePatch,\n startPeeking,\n stopPeeking,\n} from '@engine/signals'\nimport type { SignalFilterOptions } from '@engine/types'\nimport { updateLeaves } from '@utils/paths'\n\naction({\n name: 'toggleAll',\n apply(_, filter: SignalFilterOptions) {\n // peek because in an effect you would be subscribing to signals and then setting them which\n // would cause an infinite loop and why would you want to infinite loop on purpose\n startPeeking()\n const masked = filtered(filter)\n updateLeaves(masked, (oldValue: any) => !oldValue)\n mergePatch(masked)\n stopPeeking()\n },\n})\n", "// Icon: ion:eye\n// Slug: Access signals without subscribing to changes.\n// Description: Allows accessing signals without subscribing to their changes in expressions.\n\nimport { action } from '@engine'\nimport { DATASTAR_FETCH_EVENT } from '@engine/consts'\nimport { filtered, startPeeking, stopPeeking } from '@engine/signals'\nimport type {\n DatastarFetchEvent,\n HTMLOrSVG,\n SignalFilterOptions,\n WatcherArgs,\n} from '@engine/types'\nimport { kebab } from '@utils/text'\n\nconst abortControllers = new WeakMap()\nconst methodSupportsRequestBody = (method: string): boolean =>\n !['GET', 'DELETE'].includes(method)\n\nconst createHttpMethod = (\n name: string,\n method: string,\n openWhenHiddenDefault: boolean = true,\n): void =>\n action({\n name,\n apply: async (\n { el, evt, error, cleanups },\n url: string,\n {\n selector,\n headers: userHeaders,\n contentType = 'json',\n filterSignals: { include = /.*/, exclude = /(^|\\.)_/ } = {},\n openWhenHidden = openWhenHiddenDefault,\n payload,\n requestCancellation = 'auto',\n retry = 'auto',\n retryInterval = 1_000,\n retryScaler = 2,\n retryMaxWait = 30_000,\n retryMaxCount = 10,\n }: FetchArgs = {},\n ) => {\n const controller =\n requestCancellation instanceof AbortController\n ? requestCancellation\n : new AbortController()\n if (requestCancellation === 'auto' || requestCancellation === 'cleanup') {\n abortControllers.get(el)?.abort()\n abortControllers.set(el, controller)\n }\n if (requestCancellation === 'cleanup') {\n cleanups.get(`@${name}`)?.()\n cleanups.set(`@${name}`, async () => {\n controller.abort()\n // wait one tick for FINISHED to fire\n await Promise.resolve()\n })\n }\n\n let cleanupFn = () => {}\n\n try {\n if (!url?.length) {\n throw error('FetchNoUrlProvided', { action })\n }\n\n const initialHeaders: Record = {\n Accept: 'text/event-stream, text/html, application/json',\n 'Datastar-Request': true,\n }\n if (contentType === 'json' && methodSupportsRequestBody(method)) {\n initialHeaders['Content-Type'] = 'application/json'\n }\n const headers = Object.assign({}, initialHeaders, userHeaders)\n\n // We ignore the content-type header if using form data\n // if missing the boundary will be set automatically\n\n const req: FetchEventSourceInit = {\n input: '',\n method,\n headers,\n openWhenHidden,\n retry,\n retryInterval,\n retryScaler,\n retryMaxWait,\n retryMaxCount,\n signal: controller.signal,\n onopen: async (response: Response) => {\n if (response.status >= 400)\n dispatchFetch(ERROR, el, { status: response.status.toString() })\n },\n onmessage: (evt) => {\n if (!evt.event.startsWith('datastar')) return\n const type = evt.event\n const argsRawLines: Record = {}\n\n for (const line of evt.data.split('\\n')) {\n const i = line.indexOf(' ')\n const k = line.slice(0, i)\n const v = line.slice(i + 1)\n ;(argsRawLines[k] ||= []).push(v)\n }\n\n const argsRaw = Object.fromEntries(\n Object.entries(argsRawLines).map(([k, v]) => [k, v.join('\\n')]),\n )\n\n dispatchFetch(type, el, argsRaw)\n },\n onerror: (error) => {\n if (isWrongContent(error)) {\n // don't retry if the content-type is wrong\n throw error('FetchExpectedTextEventStream', { url })\n }\n // do nothing and it will retry\n if (error) {\n console.error(error.message)\n dispatchFetch(RETRYING, el, { message: error.message })\n }\n },\n }\n\n const buildFetchEventSourceInit = () => {\n const urlInstance = new URL(url, document.baseURI)\n const queryParams = new URLSearchParams(urlInstance.search)\n if (contentType === 'json') {\n startPeeking()\n const requestPayload =\n payload !== undefined ? payload : filtered({ include, exclude })\n stopPeeking()\n const body = JSON.stringify(requestPayload)\n if (methodSupportsRequestBody(method)) {\n req.body = body\n } else {\n queryParams.set('datastar', body)\n }\n } else if (contentType === 'form') {\n const formEl = (\n selector ? document.querySelector(selector) : el.closest('form')\n ) as HTMLFormElement\n if (!formEl) {\n throw error('FetchFormNotFound', { action, selector })\n }\n\n // Validate the form\n if (!formEl.noValidate && !formEl.checkValidity()) {\n formEl.reportValidity()\n return\n }\n\n // Collect the form data\n const formData = new FormData(formEl)\n let submitter = el as HTMLElement | null\n\n if (el === formEl && evt instanceof SubmitEvent) {\n // Get the submitter from the event\n submitter = evt.submitter\n } else {\n // Prevent the form being submitted\n const preventDefault = (evt: Event) => evt.preventDefault()\n formEl.addEventListener('submit', preventDefault)\n cleanupFn = () => {\n formEl.removeEventListener('submit', preventDefault)\n }\n }\n\n // Append the value of the form submitter if it is a valid submitter and has a name\n if (\n submitter instanceof HTMLButtonElement ||\n (submitter instanceof HTMLInputElement &&\n submitter.type === 'submit')\n ) {\n const name = submitter.getAttribute('name')\n if (name) formData.append(name, submitter.value)\n }\n\n const multipart =\n formEl.getAttribute('enctype') === 'multipart/form-data'\n // Leave the `Content-Type` header empty for multipart encoding so the browser can set it automatically with the correct boundary\n if (!multipart) {\n headers['Content-Type'] = 'application/x-www-form-urlencoded'\n }\n\n const formParams = new URLSearchParams(formData as any)\n if (methodSupportsRequestBody(method)) {\n if (multipart) {\n req.body = formData\n } else {\n req.body = formParams\n }\n } else {\n for (const [key, value] of formParams) {\n queryParams.append(key, value)\n }\n }\n } else {\n throw error('FetchInvalidContentType', { action, contentType })\n }\n urlInstance.search = queryParams.toString()\n req.input = urlInstance.toString()\n return req\n }\n\n dispatchFetch(STARTED, el, {})\n\n try {\n await fetchEventSource(el, buildFetchEventSourceInit)\n } catch (e: any) {\n if (!isWrongContent(e)) {\n throw error('FetchFailed', { method, url, error: e.message })\n }\n // exit gracefully and do nothing if the content-type is wrong\n // this can happen if the client is sending a request\n // where no response is expected, and they haven\u2019t\n // set the content-type to text/event-stream\n }\n } finally {\n dispatchFetch(FINISHED, el, {})\n cleanupFn()\n cleanups.delete(`@${name}`)\n }\n },\n })\n\ncreateHttpMethod('get', 'GET', false)\ncreateHttpMethod('patch', 'PATCH')\ncreateHttpMethod('post', 'POST')\ncreateHttpMethod('put', 'PUT')\ncreateHttpMethod('delete', 'DELETE')\n\nexport const STARTED = 'started'\nexport const FINISHED = 'finished'\nexport const ERROR = 'error'\nexport const RETRYING = 'retrying'\nexport const RETRIES_FAILED = 'retries-failed'\n\nconst dispatchFetch = (type: string, el: HTMLOrSVG, argsRaw: WatcherArgs) =>\n document.dispatchEvent(\n new CustomEvent(DATASTAR_FETCH_EVENT, {\n detail: { type, el, argsRaw },\n }),\n )\n\nconst isWrongContent = (err: any) => `${err}`.includes('text/event-stream')\n\ntype ResponseOverrides =\n | {\n selector?: string\n mode?: string\n namespace?: string\n useViewTransition?: boolean\n }\n | {\n onlyIfMissing?: boolean\n }\n\nexport type FetchArgs = {\n selector?: string\n headers?: Record\n contentType?: 'json' | 'form'\n filterSignals?: SignalFilterOptions\n openWhenHidden?: boolean\n payload?: any\n requestCancellation?: 'auto' | 'cleanup' | 'disabled' | AbortController\n responseOverrides?: ResponseOverrides\n retry?: 'auto' | 'error' | 'always' | 'never'\n retryInterval?: number\n retryScaler?: number\n retryMaxWait?: number\n retryMaxCount?: number\n}\n\n// Below originally from https://github.com/Azure/fetch-event-source/blob/main/LICENSE\n\n/**\n * Represents a message sent in an event stream\n * https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#Event_stream_format\n */\n\ninterface EventSourceMessage {\n id: string\n event: string\n data: string\n retry?: number\n}\n\n/**\n * Converts a ReadableStream into a callback pattern.\n * @param stream The input ReadableStream.\n * @param onChunk A function that will be called on each new byte chunk in the stream.\n * @returns {Promise} A promise that will be resolved when the stream closes.\n */\nconst getBytes = async (\n stream: ReadableStream,\n onChunk: (arr: Uint8Array) => void,\n): Promise => {\n const reader = stream.getReader()\n let result = await reader.read()\n while (!result.done) {\n onChunk(result.value)\n result = await reader.read()\n }\n}\n\nconst getLines = (onLine: (line: Uint8Array, fieldLength: number) => void) => {\n let buffer: Uint8Array | undefined\n let position: number // current read position\n let fieldLength: number // length of the `field` portion of the line\n let discardTrailingNewline = false\n\n // return a function that can process each incoming byte chunk:\n return (arr: Uint8Array) => {\n if (!buffer) {\n buffer = arr\n position = 0\n fieldLength = -1\n } else {\n // we're still parsing the old line. Append the new bytes into buffer:\n buffer = concat(buffer, arr)\n }\n\n const bufLength = buffer.length\n let lineStart = 0 // index where the current line starts\n while (position < bufLength) {\n if (discardTrailingNewline) {\n if (buffer[position] === 10) lineStart = ++position // skip to next char\n discardTrailingNewline = false\n }\n\n // start looking forward till the end of line:\n let lineEnd = -1 // index of the \\r or \\n char\n for (; position < bufLength && lineEnd === -1; ++position) {\n switch (buffer[position]) {\n case 58: // :\n if (fieldLength === -1) {\n // first colon in line\n fieldLength = position - lineStart\n }\n break\n // @ts-expect-error:7029 \\r case below should fallthrough to \\n:\n // biome-ignore lint/suspicious/noFallthroughSwitchClause: intentional fallthrough for CR to LF\n case 13: // \\r\n discardTrailingNewline = true\n case 10: // \\n\n lineEnd = position\n break\n }\n }\n\n if (lineEnd === -1) break // Wait for the next arr and then continue parsing\n\n // we've reached the line end, send it out:\n onLine(buffer.subarray(lineStart, lineEnd), fieldLength)\n lineStart = position // we're now on the next line\n fieldLength = -1\n }\n\n if (lineStart === bufLength)\n buffer = undefined // we've finished reading it\n else if (lineStart) {\n // Create a new view into buffer beginning at lineStart so we don't\n // need to copy over the previous lines when we get the new arr:\n buffer = buffer.subarray(lineStart)\n position -= lineStart\n }\n }\n}\n\nconst getMessages = (\n onId: (id: string) => void,\n onRetry: (retry: number) => void,\n onMessage?: (msg: EventSourceMessage) => void,\n): ((line: Uint8Array, fieldLength: number) => void) => {\n let message = newMessage()\n const decoder = new TextDecoder()\n\n // return a function that can process each incoming line buffer:\n return (line, fieldLength) => {\n if (!line.length) {\n // empty line denotes end of message. Trigger the callback and start a new message:\n onMessage?.(message)\n message = newMessage()\n } else if (fieldLength > 0) {\n // exclude comments and lines with no values\n // line is of format \":\" or \": \"\n // https://html.spec.whatwg.org/multipage/server-sent-events.html#event-stream-interpretation\n const field = decoder.decode(line.subarray(0, fieldLength))\n const valueOffset = fieldLength + (line[fieldLength + 1] === 32 ? 2 : 1)\n const value = decoder.decode(line.subarray(valueOffset))\n\n switch (field) {\n case 'data':\n message.data = message.data ? `${message.data}\\n${value}` : value\n break\n case 'event':\n message.event = value\n break\n case 'id':\n onId((message.id = value))\n break\n case 'retry': {\n const retry = +value\n if (!Number.isNaN(retry)) {\n // per spec, ignore non-integers\n onRetry((message.retry = retry))\n }\n break\n }\n }\n }\n }\n}\n\nconst concat = (a: Uint8Array, b: Uint8Array) => {\n const res = new Uint8Array(a.length + b.length)\n res.set(a)\n res.set(b, a.length)\n return res\n}\n\nconst newMessage = (): EventSourceMessage => ({\n // data, event, and id must be initialized to empty strings:\n // https://html.spec.whatwg.org/multipage/server-sent-events.html#event-stream-interpretation\n // retry should be initialized to undefined so we return a consistent shape\n // to the js engine all the time: https://mathiasbynens.be/notes/shapes-ics#takeaways\n data: '',\n event: '',\n id: '',\n retry: undefined,\n})\n\ntype FetchEventSourceInit =\n | (RequestInit & {\n input: RequestInfo\n headers?: Record\n onopen?: (response: Response) => Promise\n onmessage?: (ev: EventSourceMessage) => void\n onclose?: () => void\n onerror?: (err: any) => void\n openWhenHidden?: boolean\n fetch?: typeof fetch\n retry?: 'auto' | 'error' | 'always' | 'never'\n retryInterval?: number\n retryScaler?: number\n retryMaxWait?: number\n retryMaxCount?: number\n responseOverrides?: ResponseOverrides\n })\n | undefined\n\nconst fetchEventSource = (\n el: HTMLOrSVG,\n buildFetchEventSourceInit: () => FetchEventSourceInit,\n): Promise => {\n return new Promise((resolve, reject) => {\n const fetchInit = buildFetchEventSourceInit()\n if (!fetchInit) {\n return\n }\n let {\n input,\n signal: inputSignal,\n headers: inputHeaders,\n onopen: inputOnOpen,\n onmessage,\n onclose,\n onerror,\n openWhenHidden,\n fetch: inputFetch,\n retry = 'auto',\n retryInterval = 1_000,\n retryScaler = 2,\n retryMaxWait = 30_000,\n retryMaxCount = 10,\n responseOverrides,\n ...rest\n }: FetchEventSourceInit = fetchInit\n\n // make a copy of the input headers since we may modify it below:\n const headers: Record = {\n ...inputHeaders,\n }\n\n let curRequestController: AbortController\n const onVisibilityChange = () => {\n curRequestController.abort() // close existing request on every visibility change\n if (!document.hidden) {\n const currentFetchInit = buildFetchEventSourceInit()\n if (!currentFetchInit) return\n\n input = currentFetchInit.input\n rest.body = currentFetchInit.body\n create()\n }\n }\n\n if (!openWhenHidden) {\n document.addEventListener('visibilitychange', onVisibilityChange)\n }\n\n let retryTimer: ReturnType | undefined\n const dispose = () => {\n document.removeEventListener('visibilitychange', onVisibilityChange)\n clearTimeout(retryTimer)\n curRequestController.abort()\n }\n\n // if the incoming signal aborts, dispose resources and resolve:\n inputSignal?.addEventListener('abort', () => {\n dispose()\n resolve() // don't waste time constructing/logging errors\n })\n\n const fetch = inputFetch || window.fetch\n const onopen = inputOnOpen || (() => {})\n\n let retries = 0\n let baseRetryInterval = retryInterval\n\n const retryRequest = () => {\n retries++\n if (retries <= retryMaxCount) {\n clearTimeout(retryTimer)\n console.error(\n `Datastar failed to reach ${input.toString()} retrying in ${retryInterval}ms.`,\n )\n retryTimer = setTimeout(create, retryInterval)\n\n // Prepare the interval for the next retry (exponential backoff)\n retryInterval = Math.min(retryInterval * retryScaler, retryMaxWait)\n } else {\n dispatchFetch(RETRIES_FAILED, el, {})\n dispose()\n reject('Max retries reached.')\n }\n }\n\n const create = async () => {\n curRequestController = new AbortController()\n const curRequestSignal = curRequestController.signal\n try {\n const response = await fetch(input, {\n ...rest,\n headers,\n signal: curRequestSignal,\n })\n\n await onopen(response)\n\n const dispatchNonSSE = async (\n dispatchType: string,\n response: Response,\n name: string,\n responseOverrides?: ResponseOverrides,\n ...argNames: string[]\n ) => {\n const argsRaw: WatcherArgs = {\n [name]: await response.text(),\n }\n for (const n of argNames) {\n let v = response.headers.get(`datastar-${kebab(n)}`)\n if (responseOverrides) {\n const o = (responseOverrides as any)[n]\n if (o) v = typeof o === 'string' ? o : JSON.stringify(o)\n }\n if (v) argsRaw[n] = v\n }\n\n dispatchFetch(dispatchType, el, argsRaw)\n dispose()\n resolve()\n }\n\n const status = response.status\n const isNoContentStatus = status === 204\n const isRedirectStatus = status >= 300 && status < 400\n const isErrorStatus = status >= 400 && status < 600\n\n if (status !== 200) {\n onclose?.()\n if (\n retry !== 'never' &&\n !isNoContentStatus &&\n !isRedirectStatus &&\n (retry === 'always' || (retry === 'error' && isErrorStatus))\n ) {\n retryRequest()\n return\n }\n dispose()\n resolve()\n return\n }\n\n // on successful connection, reset the retry logic\n retries = 0\n retryInterval = baseRetryInterval\n\n const ct = response.headers.get('Content-Type')\n if (ct?.includes('text/html')) {\n return await dispatchNonSSE(\n 'datastar-patch-elements',\n response,\n 'elements',\n responseOverrides,\n 'selector',\n 'mode',\n 'namespace',\n 'useViewTransition',\n )\n }\n\n if (ct?.includes('application/json')) {\n return await dispatchNonSSE(\n 'datastar-patch-signals',\n response,\n 'signals',\n responseOverrides,\n 'onlyIfMissing',\n )\n }\n\n if (ct?.includes('text/javascript')) {\n const script = document.createElement('script')\n const scriptAttributesHeader = response.headers.get(\n 'datastar-script-attributes',\n )\n\n if (scriptAttributesHeader) {\n for (const [name, value] of Object.entries(\n JSON.parse(scriptAttributesHeader),\n )) {\n script.setAttribute(name, value as string)\n }\n }\n script.textContent = await response.text()\n document.head.appendChild(script)\n dispose()\n return\n }\n\n await getBytes(\n response.body!,\n getLines(\n getMessages(\n (id) => {\n if (id) {\n // signals the id and send it back on the next retry:\n headers['last-event-id'] = id\n } else {\n // don't send the last-event-id header anymore:\n delete headers['last-event-id']\n }\n },\n (retry) => {\n baseRetryInterval = retryInterval = retry\n },\n onmessage,\n ),\n ),\n )\n\n onclose?.()\n\n if (retry === 'always' && !isRedirectStatus) {\n retryRequest()\n return\n }\n\n dispose()\n resolve()\n } catch {\n if (!curRequestSignal.aborted) {\n try {\n retryRequest()\n } catch (innerErr) {\n dispose()\n reject(innerErr)\n }\n }\n }\n }\n\n create()\n })\n}\n", "// Icon: material-symbols:edit-attributes-outline\n// Slug: Syncs the value of an attribute with an expression.\n// Description: Sets the value of any HTML attribute to an expression, and keeps it in sync.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\n\nattribute({\n name: 'attr',\n requirement: { value: 'must' },\n returnsValue: true,\n apply({ el, key, rx }) {\n const syncAttr = (key: string, val: any) => {\n if (val === '' || val === true) {\n el.setAttribute(key, '')\n } else if (val === false || val == null) {\n el.removeAttribute(key)\n } else if (typeof val === 'string') {\n el.setAttribute(key, val)\n } else if (typeof val === 'function') {\n el.setAttribute(key, val.toString())\n } else {\n el.setAttribute(\n key,\n JSON.stringify(val, (_k, v) =>\n typeof v === 'function' ? v.toString() : v,\n ),\n )\n }\n }\n\n const update = key\n ? () => {\n observer.disconnect()\n const val = rx() as string\n syncAttr(key, val)\n observer.observe(el, {\n attributeFilter: [key],\n })\n }\n : () => {\n observer.disconnect()\n const obj = rx() as Record\n const attributeFilter = Object.keys(obj)\n for (const key of attributeFilter) {\n syncAttr(key, obj[key])\n }\n observer.observe(el, {\n attributeFilter,\n })\n }\n\n const observer = new MutationObserver(update)\n const cleanup = effect(update)\n\n return () => {\n observer.disconnect()\n cleanup()\n }\n },\n})\n", "// Icon: akar-icons:link-chain\n// Slug: Creates a signal with two-way data binding.\n// Description: Creates a signal (if one doesn\u2019t already exist) and sets up two-way data binding between it and an element\u2019s value.\n\nimport { attribute } from '@engine'\nimport { DATASTAR_PROP_CHANGE_EVENT } from '@engine/consts'\nimport { effect, getPath, mergePaths } from '@engine/signals'\nimport type { Paths } from '@engine/types'\nimport { hasOwn } from '@utils/polyfills'\nimport { aliasify, camel, modifyCasing } from '@utils/text'\n\ntype SignalFile = {\n name: string\n contents: string\n mime: string\n}\n\ntype BindAdapter = {\n get: (el: any, type: string) => any\n set: (el: any, value: any) => void\n events: string[]\n}\n\nconst propAdapter = (prop: string, ...events: string[]): BindAdapter => ({\n get: (el: any) => el[prop],\n set: (el: any, value: any) => {\n el[prop] = value\n },\n events,\n})\n\nconst attrAdapter = (attr: string, ...events: string[]): BindAdapter => ({\n get: (el: Element) => el.getAttribute(attr),\n set: (el: Element, value: any) => {\n el.setAttribute(attr, `${value}`)\n },\n events,\n})\n\nconst valueAdapter = (\n treatUndefinedAsString = false,\n ...events: string[]\n): BindAdapter => ({\n get: (el: HTMLInputElement | HTMLSelectElement, type: string) =>\n type === 'string' || (treatUndefinedAsString && type === 'undefined')\n ? el.value\n : +el.value,\n set: (el: HTMLInputElement | HTMLSelectElement, value: string | number) => {\n el.value = `${value}`\n },\n events,\n})\n\nconst dataURIRegex = /^data:(?[^;]+);base64,(?.*)$/\nconst empty = Symbol('empty')\n\nconst boundPath = (\n el: Element,\n key: string | null | undefined,\n rawKey: string,\n signalName: string,\n adapter: BindAdapter,\n initialValue: any,\n) => {\n const rawAttribute = aliasify(CSS.escape(rawKey))\n const selector = key\n ? `[${rawAttribute}]`\n : `[${rawAttribute}=\"${CSS.escape(signalName)}\"]`\n if (\n initialValue === undefined &&\n el instanceof HTMLInputElement &&\n el.type === 'radio'\n ) {\n const checked = [...document.querySelectorAll(selector)].find(\n (input): input is HTMLInputElement =>\n input instanceof HTMLInputElement && input.checked,\n )\n // Missing radio binds adopt the checked option.\n if (checked) {\n mergePaths([[signalName, checked.value]], { ifMissing: true })\n }\n }\n\n if (\n !Array.isArray(initialValue) ||\n (el instanceof HTMLSelectElement && el.multiple)\n ) {\n mergePaths([[signalName, adapter.get(el, typeof initialValue)]], {\n ifMissing: true,\n })\n return signalName\n }\n\n const inputs = document.querySelectorAll(selector) as NodeListOf\n\n const paths: Paths = []\n let i = 0\n for (const input of inputs) {\n // Missing proxy slots materialize as '', which breaks `ifMissing`.\n paths.push([\n `${signalName}.${i}`,\n adapter.get(\n input,\n typeof (hasOwn(initialValue, i) ? initialValue[i] : undefined),\n ),\n ])\n if (el === input) {\n break\n }\n i++\n }\n mergePaths(paths, { ifMissing: true })\n return `${signalName}.${i}`\n}\n\nattribute({\n name: 'bind',\n requirement: 'exclusive',\n apply({ el, key, rawKey, mods, value, error }) {\n const signalName = key != null ? modifyCasing(key, mods) : value\n\n const props = mods.get('prop')\n const events = mods.get('event')\n let adapter: BindAdapter | null = null\n\n if (el instanceof HTMLInputElement) {\n switch (el.type) {\n case 'range':\n case 'number':\n adapter = valueAdapter(false, 'input')\n break\n case 'checkbox':\n adapter = {\n get: (el: HTMLInputElement, type: string) => {\n if (el.value !== 'on') {\n return type === 'boolean'\n ? el.checked\n : el.checked\n ? el.value\n : ''\n }\n return type === 'string'\n ? el.checked\n ? el.value\n : ''\n : el.checked\n },\n set: (el: HTMLInputElement, value: string | boolean) => {\n el.checked =\n typeof value === 'string' ? value === el.value : value\n },\n events: ['input'],\n }\n break\n case 'radio':\n if (!el.getAttribute('name')?.length) {\n el.setAttribute('name', signalName)\n }\n adapter = {\n get: (el: HTMLInputElement, type: string) =>\n el.checked ? (type === 'number' ? +el.value : el.value) : empty,\n set: (el: HTMLInputElement, value: string | number) => {\n el.checked =\n value === (typeof value === 'number' ? +el.value : el.value)\n },\n events: ['input'],\n }\n break\n case 'file': {\n const syncSignal = () => {\n const files = [...(el.files || [])]\n const signalFiles: SignalFile[] = []\n Promise.all(\n files.map(\n (f) =>\n new Promise((resolve) => {\n const reader = new FileReader()\n reader.onload = () => {\n if (typeof reader.result !== 'string') {\n throw error('InvalidFileResultType', {\n resultType: typeof reader.result,\n })\n }\n const match = reader.result.match(dataURIRegex)\n if (!match?.groups) {\n throw error('InvalidDataUri', {\n result: reader.result,\n })\n }\n signalFiles.push({\n name: f.name,\n contents: match.groups.contents,\n mime: match.groups.mime,\n })\n }\n reader.onloadend = () => resolve()\n reader.readAsDataURL(f)\n }),\n ),\n ).then(() => {\n mergePaths([[signalName, signalFiles]])\n })\n }\n\n el.addEventListener('change', syncSignal)\n return () => {\n el.removeEventListener('change', syncSignal)\n }\n }\n default:\n adapter = valueAdapter(true, 'input')\n }\n } else if (el instanceof HTMLSelectElement && el.multiple) {\n const typeMap = new Map()\n adapter = {\n get: (el: HTMLSelectElement) =>\n [...el.selectedOptions].map((option) => {\n const type = typeMap.get(option.value)\n return type === 'string' || type == null\n ? option.value\n : +option.value\n }),\n set: (el: HTMLSelectElement, value: (string | number)[]) => {\n for (const option of el.options) {\n if (value.includes(option.value)) {\n typeMap.set(option.value, 'string')\n option.selected = true\n } else if (value.includes(+option.value)) {\n typeMap.set(option.value, 'number')\n option.selected = true\n } else {\n option.selected = false\n }\n }\n },\n events: ['change'],\n }\n } else if (el instanceof HTMLSelectElement) {\n adapter = valueAdapter(true, 'change')\n } else if (el instanceof HTMLTextAreaElement) {\n adapter = propAdapter('value', 'input')\n } else if (el instanceof HTMLElement && el.tagName.includes('-')) {\n adapter =\n 'value' in el\n ? propAdapter('value', 'input', 'change')\n : attrAdapter('value', 'input', 'change')\n } else if (el instanceof HTMLElement && 'value' in el) {\n adapter = propAdapter('value', 'change')\n } else {\n adapter = attrAdapter('value', 'change')\n }\n if (!adapter) {\n throw error('InvalidBindAdapter')\n }\n\n const firstProp = props && [...props][0]\n if (props && !firstProp) throw error('BindPropNameMissing')\n if (firstProp) {\n const prop = camel(firstProp)\n adapter = propAdapter(prop, ...(events ? [...events] : adapter.events))\n } else if (events) {\n adapter.events = [...events]\n }\n\n const initialValue = getPath(signalName)\n const path = boundPath(\n el,\n key,\n rawKey,\n signalName,\n adapter,\n initialValue,\n )\n\n const syncSignal = () => {\n const signalValue = getPath(path)\n if (signalValue != null) {\n const value = adapter.get(el, typeof signalValue)\n if (value !== empty) {\n mergePaths([[path, value]])\n }\n }\n }\n\n for (const eventName of adapter.events) {\n el.addEventListener(eventName, syncSignal)\n }\n el.addEventListener(DATASTAR_PROP_CHANGE_EVENT, syncSignal)\n const cleanup = effect(() => {\n adapter.set(el, getPath(path))\n })\n\n return () => {\n cleanup()\n for (const eventName of adapter.events) {\n el.removeEventListener(eventName, syncSignal)\n }\n el.removeEventListener(DATASTAR_PROP_CHANGE_EVENT, syncSignal)\n }\n },\n})\n", "// Icon: ic:baseline-format-paint\n// Slug: Adds or removes a class based on an expression.\n// Description: Adds or removes a class to or from an element based on an expression.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\nimport { modifyCasing } from '@utils/text'\n\nattribute({\n name: 'class',\n requirement: {\n value: 'must',\n },\n returnsValue: true,\n apply({ key, el, mods, rx }) {\n key &&= modifyCasing(key, mods, 'kebab')\n\n let classes: Record\n const callback = () => {\n observer.disconnect()\n\n classes = key\n ? { [key]: rx() as boolean }\n : (rx() as Record)\n\n for (const k in classes) {\n const classNames = k.split(/\\s+/).filter((cn) => cn.length > 0)\n if (classes[k]) {\n for (const name of classNames) {\n if (!el.classList.contains(name)) {\n el.classList.add(name)\n }\n }\n } else {\n for (const name of classNames) {\n if (el.classList.contains(name)) {\n el.classList.remove(name)\n }\n }\n }\n }\n\n observer.observe(el, { attributeFilter: ['class'] })\n }\n\n const observer = new MutationObserver(callback)\n const cleanup = effect(callback)\n\n return () => {\n observer.disconnect()\n cleanup()\n\n for (const k in classes) {\n const classNames = k.split(/\\s+/).filter((cn) => cn.length > 0)\n for (const name of classNames) {\n el.classList.remove(name)\n }\n }\n }\n },\n})\n", "// Icon: streamline-ultimate:wifi-signal-2\n// Slug: Creates a computed signal.\n// Description: Creates a signal that is computed based on an expression.\n\nimport { attribute } from '@engine'\nimport { computed, mergePaths, mergePatch } from '@engine/signals'\nimport { modifyCasing } from '@utils/text'\nimport { updateLeaves } from '@utils/paths'\n\nattribute({\n name: 'computed',\n requirement: {\n value: 'must',\n },\n returnsValue: true,\n apply({ key, mods, rx, error }) {\n if (key) {\n mergePaths([[modifyCasing(key, mods), computed(rx)]])\n } else {\n const patch = Object.assign({}, rx() as Record any>)\n updateLeaves(patch, (old) => {\n if (typeof old === 'function') {\n return computed(old)\n } else {\n throw error('ComputedExpectedFunction')\n }\n })\n mergePatch(patch)\n }\n },\n})\n", "// Icon: oui:security-signal\n// Slug: Executes an expression when signals change.\n// Description: Executes an expression on page load and whenever any signals in the expression change.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\n\nattribute({\n name: 'effect',\n requirement: {\n key: 'denied',\n value: 'must',\n },\n apply: ({ rx }) => effect(rx),\n})\n", "// Icon: streamline:signal-loading-remix\n// Slug: Creates an indicator for whether an SSE request is in flight.\n// Description: Creates a signal and sets its value to `true` while an SSE request request is in flight, otherwise `false`.\n\nimport { attribute } from '@engine'\nimport { DATASTAR_FETCH_EVENT } from '@engine/consts'\nimport { mergePaths } from '@engine/signals'\nimport type { DatastarFetchEvent } from '@engine/types'\nimport { FINISHED, STARTED } from '@plugins/actions/fetch'\nimport { modifyCasing } from '@utils/text'\n\nattribute({\n name: 'indicator',\n requirement: 'exclusive',\n apply({ el, key, mods, value }) {\n const signalName = key != null ? modifyCasing(key, mods) : value\n let activeFetches = 0\n\n mergePaths([[signalName, false]])\n\n const watcher = ((event: CustomEvent) => {\n const { type, el: elt } = event.detail\n if (elt !== el) {\n return\n }\n switch (type) {\n case STARTED:\n activeFetches++\n mergePaths([[signalName, true]])\n break\n case FINISHED:\n activeFetches = Math.max(0, activeFetches - 1)\n mergePaths([[signalName, activeFetches > 0]])\n break\n }\n }) as EventListener\n document.addEventListener(DATASTAR_FETCH_EVENT, watcher)\n return () => {\n activeFetches = 0\n mergePaths([[signalName, false]])\n document.removeEventListener(DATASTAR_FETCH_EVENT, watcher)\n }\n },\n})\n", "export const tagToMs = (args: Set) => {\n if (!args || args.size <= 0) return 0\n for (const arg of args) {\n if (arg.endsWith('ms')) {\n return +arg.replace('ms', '')\n }\n if (arg.endsWith('s')) {\n return +arg.replace('s', '') * 1000\n }\n try {\n return Number.parseFloat(arg)\n } catch (_) {}\n }\n return 0\n}\n\nexport const tagHas = (\n tags: Set,\n tag: string,\n defaultValue = false,\n) => {\n if (!tags) return defaultValue\n return tags.has(tag.toLowerCase())\n}\n\nexport const tagFirst = (tags?: Set, defaultValue = ''): string => {\n if (tags && tags.size > 0) {\n for (const tag of tags) {\n return tag\n }\n }\n return defaultValue\n}\n", "import type { EventCallbackHandler, Modifiers } from '@engine/types'\nimport { tagHas, tagToMs } from '@utils/tags'\n\nexport const delay = (\n callback: EventCallbackHandler,\n wait: number,\n): EventCallbackHandler => {\n return (...args: any[]) => {\n setTimeout(() => {\n callback(...args)\n }, wait)\n }\n}\n\nexport const throttle = (\n callback: EventCallbackHandler,\n wait: number,\n leading = true,\n trailing = false,\n debounce = false,\n): EventCallbackHandler => {\n let lastArgs: Parameters | null = null\n let timer: ReturnType | number = 0\n\n return (...args: any[]) => {\n if (leading && !timer) {\n callback(...args)\n lastArgs = null\n } else {\n lastArgs = args\n }\n if (!timer || debounce) {\n if (timer) {\n clearTimeout(timer)\n }\n timer = setTimeout(() => {\n if (trailing && lastArgs !== null) {\n callback(...lastArgs)\n }\n lastArgs = null\n timer = 0\n }, wait)\n }\n }\n}\n\nexport const modifyTiming = (\n callback: EventCallbackHandler,\n mods: Modifiers,\n): EventCallbackHandler => {\n const delayArgs = mods.get('delay')\n if (delayArgs) {\n const wait = tagToMs(delayArgs)\n callback = delay(callback, wait)\n }\n\n const debounceArgs = mods.get('debounce')\n if (debounceArgs) {\n const wait = tagToMs(debounceArgs)\n const leading = tagHas(debounceArgs, 'leading', false)\n const trailing = !tagHas(debounceArgs, 'notrailing', false)\n callback = throttle(callback, wait, leading, trailing, true)\n }\n\n const throttleArgs = mods.get('throttle')\n if (throttleArgs) {\n const wait = tagToMs(throttleArgs)\n const leading = !tagHas(throttleArgs, 'noleading', false)\n const trailing = tagHas(throttleArgs, 'trailing', false)\n callback = throttle(callback, wait, leading, trailing)\n }\n\n return callback\n}\n", "import type { EventCallbackHandler, Modifiers } from '@engine/types'\n\nexport const supportsViewTransitions = !!document.startViewTransition\n\nexport const modifyViewTransition = (\n callback: EventCallbackHandler,\n mods: Modifiers,\n): EventCallbackHandler => {\n if (mods.has('viewtransition') && supportsViewTransitions) {\n const cb = callback // I hate javascript\n callback = (...args: any[]) =>\n document.startViewTransition(() => cb(...args))\n }\n\n return callback\n}\n", "// Icon: material-symbols:timer-play-outline\n// Slug: Runs an expression when loaded into the DOM.\n// Description: Runs an expression when the element is loaded into the DOM.\n\nimport { attribute } from '@engine'\nimport { beginBatch, endBatch } from '@engine/signals'\nimport { tagToMs } from '@utils/tags'\nimport { delay } from '@utils/timing'\nimport { modifyViewTransition } from '@utils/view-transitions'\n\nattribute({\n name: 'init',\n requirement: {\n key: 'denied',\n value: 'must',\n },\n apply({ rx, mods }) {\n let callback = () => {\n beginBatch()\n rx()\n endBatch()\n }\n callback = modifyViewTransition(callback, mods)\n let wait = 0\n const delayArgs = mods.get('delay')\n if (delayArgs) {\n wait = tagToMs(delayArgs)\n if (wait > 0) {\n callback = delay(callback, wait)\n }\n }\n callback()\n },\n})\n", "// Icon: si:json-fill\n// Slug: Outputs a JSON stringified version of signals.\n// Description: Sets the text content of an element to a reactive JSON stringified version of signals.\n\nimport { attribute } from '@engine'\nimport { effect, filtered } from '@engine/signals'\nimport type { SignalFilterOptions } from '@engine/types'\nimport { jsStrToObject } from '@utils/text'\n\nattribute({\n name: 'json-signals',\n requirement: {\n key: 'denied',\n },\n apply({ el, value, mods }) {\n const spaces = mods.has('terse') ? 0 : 2\n let filters: SignalFilterOptions = {}\n if (value) {\n filters = jsStrToObject(value)\n }\n\n const callback = () => {\n observer.disconnect()\n el.textContent = JSON.stringify(filtered(filters), null, spaces)\n observer.observe(el, {\n childList: true,\n characterData: true,\n subtree: true,\n })\n }\n const observer = new MutationObserver(callback)\n const cleanup = effect(callback)\n\n return () => {\n observer.disconnect()\n cleanup()\n }\n },\n})\n", "// Icon: material-symbols:mail\n// Slug: Attaches an event listener to an element.\n// Description: Attaches an event listener to an element, executing an expression whenever the event is triggered.\n\nimport { attribute } from '@engine'\nimport {\n DATASTAR_FETCH_EVENT,\n DATASTAR_SIGNAL_PATCH_EVENT,\n} from '@engine/consts'\nimport { beginBatch, endBatch } from '@engine/signals'\nimport { modifyCasing } from '@utils/text'\nimport { modifyTiming } from '@utils/timing'\nimport { modifyViewTransition } from '@utils/view-transitions'\n\nattribute({\n name: 'on',\n requirement: 'must',\n argNames: ['evt'],\n apply({ el, key, mods, rx }) {\n let target: Element | Window | Document = el\n if (mods.has('window')) {\n target = window\n } else if (mods.has('document')) {\n target = document\n }\n let callback = (evt?: Event) => {\n beginBatch()\n rx(evt)\n endBatch()\n }\n callback = modifyViewTransition(callback, mods)\n callback = modifyTiming(callback, mods)\n const eventName = modifyCasing(key, mods, 'kebab')\n const evtListOpts: AddEventListenerOptions = {\n capture: mods.has('capture'),\n passive: mods.has('passive'),\n once: mods.has('once'),\n }\n if (mods.has('outside')) {\n target = document\n const cb = callback\n callback = (evt?: Event) => {\n if (!el.contains(evt?.target as HTMLElement)) {\n cb(evt)\n }\n }\n }\n // Listen for Datastar events on the document\n if (\n eventName === DATASTAR_FETCH_EVENT ||\n eventName === DATASTAR_SIGNAL_PATCH_EVENT\n ) {\n target = document\n }\n // Apply event-side effects before timing/view-transition wrappers run.\n const listener = (evt?: Event) => {\n if (evt) {\n if (mods.has('prevent')) evt.preventDefault()\n if (mods.has('stop')) evt.stopPropagation()\n // Keep data-on:submit from falling through to native form submission.\n if (el instanceof HTMLFormElement && eventName === 'submit') evt.preventDefault()\n }\n callback(evt)\n }\n target.addEventListener(eventName, listener, evtListOpts)\n return () => {\n target.removeEventListener(eventName, listener, evtListOpts)\n }\n },\n})\n", "export const clamp = (value: number, min: number, max: number): number => {\n return Math.max(min, Math.min(max, value))\n}\n\nexport const lerp = (\n min: number,\n max: number,\n t: number,\n clamped = true,\n): number => {\n const v = min + (max - min) * t\n return clamped ? clamp(v, min, max) : v\n}\n\nexport const inverseLerp = (\n min: number,\n max: number,\n value: number,\n clamped = true,\n): number => {\n if (value < min) return 0\n if (value > max) return 1\n const v = (value - min) / (max - min)\n return clamped ? clamp(v, min, max) : v\n}\n\nexport const fit = (\n value: number,\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n clamped = true,\n rounded = false,\n): number => {\n const t = inverseLerp(inMin, inMax, value, clamped)\n const fitted = lerp(outMin, outMax, t, clamped)\n return rounded ? Math.round(fitted) : fitted\n}\n", "// Icon: mdi-light:vector-intersection\n// Slug: Runs an expression on intersection.\n// Description: Runs an expression when the element intersects with the viewport.\n\nimport { attribute } from '@engine'\nimport { beginBatch, endBatch } from '@engine/signals'\nimport type { HTMLOrSVG } from '@engine/types'\nimport { clamp } from '@utils/math'\nimport { tagFirst } from '@utils/tags'\nimport { modifyTiming } from '@utils/timing'\nimport { modifyViewTransition } from '@utils/view-transitions'\n\nconst once = new WeakSet()\n\nattribute({\n name: 'on-intersect',\n requirement: {\n key: 'denied',\n value: 'must',\n },\n apply({ el, mods, rx }) {\n let callback = () => {\n beginBatch()\n rx()\n endBatch()\n }\n callback = modifyViewTransition(callback, mods)\n callback = modifyTiming(callback, mods)\n const options = { threshold: 0 }\n if (mods.has('full')) {\n options.threshold = 1\n } else if (mods.has('half')) {\n options.threshold = 0.5\n } else {\n const threshold = mods.get('threshold')\n if (threshold) {\n options.threshold = clamp(Number(tagFirst(threshold)), 0, 100) / 100\n }\n }\n const exit = mods.has('exit')\n let observer: IntersectionObserver | null = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting !== exit) {\n callback()\n if (observer && once.has(el)) {\n observer.disconnect()\n }\n }\n }\n },\n options,\n )\n observer.observe(el)\n if (mods.has('once')) {\n once.add(el)\n }\n return () => {\n if (!mods.has('once')) {\n once.delete(el)\n }\n if (observer) {\n observer.disconnect()\n observer = null\n }\n }\n },\n})\n", "// Icon: material-symbols:timer-outline\n// Slug: Runs an expression at a regular interval.\n// Description: Runs an expression at a regular interval.\n\nimport { attribute } from '@engine'\nimport { beginBatch, endBatch } from '@engine/signals'\nimport { tagHas, tagToMs } from '@utils/tags'\nimport { modifyViewTransition } from '@utils/view-transitions'\n\nattribute({\n name: 'on-interval',\n requirement: {\n key: 'denied',\n value: 'must',\n },\n apply({ mods, rx }) {\n let callback = () => {\n beginBatch()\n rx()\n endBatch()\n }\n callback = modifyViewTransition(callback, mods)\n let duration = 1000\n const durationArgs = mods.get('duration')\n if (durationArgs) {\n duration = tagToMs(durationArgs)\n const leading = tagHas(durationArgs, 'leading', false)\n if (leading) {\n callback()\n }\n }\n const intervalId = setInterval(callback, duration)\n return () => {\n clearInterval(intervalId)\n }\n },\n})\n", "// Icon: material-symbols:change-circle-outline\n// Slug: Runs an expression when signals are patched.\n// Description: Runs an expression whenever one or more signals are patched.\n\nimport { attribute } from '@engine'\nimport { DATASTAR_SIGNAL_PATCH_EVENT } from '@engine/consts'\nimport { beginBatch, endBatch, filtered } from '@engine/signals'\nimport type { JSONPatch, SignalFilterOptions } from '@engine/types'\nimport { isEmpty } from '@utils/paths'\nimport { aliasify, jsStrToObject } from '@utils/text'\nimport { modifyTiming } from '@utils/timing'\n\nattribute({\n name: 'on-signal-patch',\n requirement: {\n value: 'must',\n },\n argNames: ['patch'],\n returnsValue: true,\n apply({ el, key, mods, rx, error }) {\n if (!!key && key !== 'filter') {\n throw error('KeyNotAllowed')\n }\n\n const filterAttr = aliasify(`${this.name}-filter`)\n const filtersRaw = el.getAttribute(filterAttr)\n let filters: SignalFilterOptions = {}\n if (filtersRaw) {\n filters = jsStrToObject(filtersRaw)\n }\n\n let running = false\n\n const callback: EventListener = modifyTiming(\n (evt: CustomEvent) => {\n if (running) return\n const watched = filtered(filters, evt.detail)\n if (!isEmpty(watched)) {\n running = true\n beginBatch()\n try {\n rx(watched)\n } finally {\n endBatch()\n running = false\n }\n }\n },\n mods,\n )\n\n document.addEventListener(DATASTAR_SIGNAL_PATCH_EVENT, callback)\n return () => {\n document.removeEventListener(DATASTAR_SIGNAL_PATCH_EVENT, callback)\n }\n },\n})\n", "// Icon: mdi:cursor-pointer\n// Slug: Creates a reference to an element.\n// Description: Creates a new signal that is a reference to the element on which the data attribute is placed.\n\nimport { attribute } from '@engine'\nimport { mergePaths } from '@engine/signals'\nimport { modifyCasing } from '@utils/text'\n\nattribute({\n name: 'ref',\n requirement: 'exclusive',\n apply({ el, key, mods, value }) {\n const signalName = key != null ? modifyCasing(key, mods) : value\n mergePaths([[signalName, el]])\n },\n})\n", "// Icon: streamline:interface-edit-view-eye-eyeball-open-view\n// Slug: Shows or hides an element.\n// Description: Shows or hides an element based on whether an expression evaluates to `true` or `false`.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\n\nconst NONE = 'none'\nconst DISPLAY = 'display'\n\nattribute({\n name: 'show',\n requirement: {\n key: 'denied',\n value: 'must',\n },\n returnsValue: true,\n apply({ el, rx }) {\n const update = () => {\n observer.disconnect()\n const shouldShow = rx()\n if (shouldShow) {\n if (el.style.display === NONE) el.style.removeProperty(DISPLAY)\n } else {\n el.style.setProperty(DISPLAY, NONE)\n }\n observer.observe(el, { attributeFilter: ['style'] })\n }\n const observer = new MutationObserver(update)\n const cleanup = effect(update)\n\n return () => {\n observer.disconnect()\n cleanup()\n }\n },\n})\n", "// Icon: streamline:wifi-signal-full-remix\n// Slug: Patches signals into the existing signals.\n// Description: Patches (adds, updates or removes) one or more signals into the existing signals.\n\nimport { attribute } from '@engine'\nimport { mergePatch, mergePaths } from '@engine/signals'\nimport { modifyCasing } from '@utils/text'\n\nattribute({\n name: 'signals',\n returnsValue: true,\n apply({ key, mods, rx }) {\n const ifMissing = mods.has('ifmissing')\n\n if (key) {\n key = modifyCasing(key, mods)\n const value = rx?.()\n mergePaths([[key, value]], { ifMissing })\n } else {\n const patch = Object.assign({}, rx?.() as Record)\n mergePatch(patch, { ifMissing })\n }\n },\n})\n", "// Icon: material-symbols:format-paint-outline\n// Slug: Sets inline styles on an element based on an expression.\n// Description: Sets CSS styles on an element using either key-based or object syntax, and keeps them in sync with reactive signals.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\nimport { kebab } from '@utils/text'\n\nattribute({\n name: 'style',\n requirement: {\n value: 'must',\n },\n returnsValue: true,\n apply({ key, el, rx }) {\n const { style } = el\n const initialStyles = new Map()\n\n const apply = (prop: string, value: any) => {\n const initial = initialStyles.get(prop)\n if (!value && value !== 0) {\n initial !== undefined &&\n (initial\n ? style.setProperty(prop, initial)\n : style.removeProperty(prop))\n } else {\n initial === undefined &&\n initialStyles.set(prop, style.getPropertyValue(prop))\n style.setProperty(prop, String(value))\n }\n }\n\n const update = () => {\n observer.disconnect()\n\n if (key) {\n apply(key, rx())\n } else {\n const styles = rx() as Record\n\n for (const [prop, initial] of initialStyles) {\n prop in styles ||\n (initial\n ? style.setProperty(prop, initial)\n : style.removeProperty(prop))\n }\n\n for (const prop in styles) {\n apply(kebab(prop), styles[prop])\n }\n }\n\n observer.observe(el, { attributeFilter: ['style'] })\n }\n\n const observer = new MutationObserver(update)\n const cleanup = effect(update)\n\n return () => {\n observer.disconnect()\n cleanup()\n for (const [prop, initial] of initialStyles) {\n initial ? style.setProperty(prop, initial) : style.removeProperty(prop)\n }\n }\n },\n})\n", "// Icon: icon-park-outline:text\n// Slug: Binds the text content of an element.\n// Description: Binds the text content of an element to an expression.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\n\nattribute({\n name: 'text',\n requirement: {\n key: 'denied',\n value: 'must',\n },\n returnsValue: true,\n apply({ el, rx }) {\n const update = () => {\n observer.disconnect()\n el.textContent = `${rx()}`\n observer.observe(el, {\n childList: true,\n characterData: true,\n subtree: true,\n })\n }\n\n const observer = new MutationObserver(update)\n const cleanup = effect(update)\n\n return () => {\n observer.disconnect()\n cleanup()\n }\n },\n})\n", "// Icon: material-symbols:cloud-download\n// Slug: Patches elements into the DOM.\n// Description: Patches elements into the DOM.\n\nimport { watcher } from '@engine'\nimport {\n DATASTAR_PROP_CHANGE_EVENT,\n DATASTAR_SCOPE_CHILDREN_EVENT,\n} from '@engine/consts'\nimport type { WatcherArgsValue, WatcherContext } from '@engine/types'\nimport { isHTMLOrSVG } from '@utils/dom'\nimport { aliasify } from '@utils/text'\nimport { supportsViewTransitions } from '@utils/view-transitions'\n\nconst isValidType = (\n arr: T,\n value: string,\n): value is T[number] => (arr as readonly string[]).includes(value)\n\nconst PATCH_MODES = [\n 'remove',\n 'outer',\n 'inner',\n 'replace',\n 'prepend',\n 'append',\n 'before',\n 'after',\n] as const\ntype PatchElementsMode = (typeof PATCH_MODES)[number]\n\nconst NAMESPACES = ['html', 'svg', 'mathml'] as const\ntype Namespace = (typeof NAMESPACES)[number]\n\ntype PatchElementsArgs = {\n selector: string\n mode: PatchElementsMode\n namespace: Namespace\n useViewTransition: boolean\n elements: WatcherArgsValue\n}\n\nwatcher({\n name: 'datastar-patch-elements',\n apply(ctx, args) {\n const selector = typeof args.selector === 'string' ? args.selector : ''\n const mode = typeof args.mode === 'string' ? args.mode : 'outer'\n const namespace =\n typeof args.namespace === 'string' ? args.namespace : 'html'\n const useViewTransitionRaw =\n typeof args.useViewTransition === 'string' ? args.useViewTransition : ''\n const elements = args.elements\n\n if (!isValidType(PATCH_MODES, mode)) {\n throw ctx.error('PatchElementsInvalidMode', { mode })\n }\n\n if (!selector && mode !== 'outer' && mode !== 'replace') {\n throw ctx.error('PatchElementsExpectedSelector')\n }\n\n if (!isValidType(NAMESPACES, namespace)) {\n throw ctx.error('PatchElementsInvalidNamespace', { namespace })\n }\n\n const args2: PatchElementsArgs = {\n selector,\n mode,\n namespace,\n useViewTransition: useViewTransitionRaw.trim() === 'true',\n elements,\n }\n\n if (supportsViewTransitions && args2.useViewTransition) {\n document.startViewTransition(() => onPatchElements(ctx, args2))\n } else {\n onPatchElements(ctx, args2)\n }\n },\n})\n\nconst onPatchElements = (\n { error }: WatcherContext,\n { selector, mode, namespace, elements }: PatchElementsArgs,\n) => {\n let newContent = document.createDocumentFragment()\n let consume = typeof elements !== 'string' && !!elements\n\n if (typeof elements === 'string') {\n const elementsWithSvgsRemoved = elements.replace(\n /]*>|>)([\\s\\S]*?)<\\/svg>/gim,\n '',\n )\n const hasHtml = /<\\/html>/.test(elementsWithSvgsRemoved)\n const hasHead = /<\\/head>/.test(elementsWithSvgsRemoved)\n const hasBody = /<\\/body>/.test(elementsWithSvgsRemoved)\n\n const wrapperTag =\n namespace === 'svg' ? 'svg' : namespace === 'mathml' ? 'math' : ''\n const wrappedEls = wrapperTag\n ? `<${wrapperTag}>${elements}`\n : elements\n\n const newDocument = new DOMParser().parseFromString(\n hasHtml || hasHead || hasBody\n ? elements\n : ``,\n 'text/html',\n )\n\n if (hasHtml) {\n newContent.appendChild(newDocument.documentElement)\n } else if (hasHead && hasBody) {\n newContent.appendChild(newDocument.head)\n newContent.appendChild(newDocument.body)\n } else if (hasHead) {\n newContent.appendChild(newDocument.head)\n } else if (hasBody) {\n newContent.appendChild(newDocument.body)\n } else if (wrapperTag) {\n const wrapperEl = newDocument\n .querySelector('template')!\n .content.querySelector(wrapperTag)!\n for (const child of wrapperEl.childNodes) {\n newContent.appendChild(child)\n }\n } else {\n newContent = newDocument.querySelector('template')!.content\n }\n } else if (elements) {\n if (elements instanceof DocumentFragment) {\n newContent = elements\n } else if (elements instanceof Element) {\n newContent.appendChild(elements)\n }\n }\n\n if (!selector && (mode === 'outer' || mode === 'replace')) {\n const children = Array.from(newContent.children)\n for (const child of children) {\n let target: Element\n if (child instanceof HTMLHtmlElement) {\n target = document.documentElement\n } else if (child instanceof HTMLBodyElement) {\n target = document.body\n } else if (child instanceof HTMLHeadElement) {\n target = document.head\n } else {\n target = document.getElementById(child.id)!\n if (!target) {\n console.warn(error('PatchElementsNoTargetsFound'), {\n element: { id: child.id },\n })\n continue\n }\n }\n\n // Consume the new content so we don\u2019t deep clone.\n applyToTargets(mode as PatchElementsMode, child, [target], true)\n }\n } else {\n const targets = document.querySelectorAll(selector)\n if (!targets.length) {\n console.warn(error('PatchElementsNoTargetsFound'), { selector })\n return\n }\n\n const targetList = consume && mode !== 'remove' ? [targets[0]!] : targets\n\n // If only one target exists, we can safely consume the new content which prevents deep cloning (https://github.com/starfederation/datastar/issues/1155).\n if (targetList.length === 1) {\n consume = true\n }\n\n applyToTargets(mode as PatchElementsMode, newContent, targetList, consume)\n }\n}\n\nconst scripts = new WeakSet()\nfor (const script of document.querySelectorAll('script')) {\n scripts.add(script)\n}\n\nconst execute = (target: Element): void => {\n const elScripts =\n target instanceof HTMLScriptElement\n ? [target]\n : target.querySelectorAll('script')\n for (const old of elScripts) {\n if (!scripts.has(old)) {\n const script = document.createElement('script')\n for (const { name, value } of old.attributes) {\n script.setAttribute(name, value)\n }\n script.text = old.text\n old.replaceWith(script)\n scripts.add(script)\n }\n }\n}\n\nconst applyPatchMode = (\n targets: Iterable,\n element: DocumentFragment | Element,\n action: string,\n consume: boolean,\n) => {\n let used = false\n for (const target of targets) {\n if (consume && used) {\n break\n }\n const nextNode = consume ? element : (element.cloneNode(true) as Element)\n execute(nextNode as Element)\n // @ts-expect-error - calling dynamic method path on DOM element\n target[action](nextNode)\n used = true\n }\n}\n\nconst applyToTargets = (\n mode: PatchElementsMode,\n element: DocumentFragment | Element,\n targets: Iterable,\n consume: boolean,\n) => {\n switch (mode) {\n case 'remove':\n for (const target of targets) {\n target.remove()\n }\n break\n case 'outer':\n case 'inner':\n {\n let used = false\n for (const target of targets) {\n if (consume && used) {\n break\n }\n const nextNode = consume ? element : (element.cloneNode(true) as Element)\n morph(target, nextNode, mode)\n execute(target)\n const scopeHost = target.closest('[data-scope-children]')\n if (scopeHost) {\n scopeHost.dispatchEvent(\n new CustomEvent(DATASTAR_SCOPE_CHILDREN_EVENT, {\n bubbles: false,\n }),\n )\n }\n used = true\n }\n }\n break\n case 'replace':\n applyPatchMode(targets, element, 'replaceWith', consume)\n break\n case 'prepend':\n case 'append':\n case 'before':\n case 'after':\n applyPatchMode(targets, element, mode, consume)\n }\n}\n\nconst ctxIdMap = new Map>()\nconst ctxPersistentIds = new Set()\nconst oldIdTagNameMap = new Map()\nconst duplicateIds = new Set()\nconst ctxPantry = document.createElement('div')\nctxPantry.hidden = true\n\nconst aliasedIgnoreMorph = aliasify('ignore-morph')\nconst aliasedIgnoreMorphAttr = `[${aliasedIgnoreMorph}]`\nexport const morph = (\n oldElt: Element | ShadowRoot,\n newContent: DocumentFragment | Element,\n mode: 'outer' | 'inner' = 'outer',\n): void => {\n if (\n (isHTMLOrSVG(oldElt) &&\n isHTMLOrSVG(newContent) &&\n oldElt.hasAttribute(aliasedIgnoreMorph) &&\n newContent.hasAttribute(aliasedIgnoreMorph)) ||\n oldElt.parentElement?.closest(aliasedIgnoreMorphAttr)\n ) {\n return\n }\n\n const normalizedElt = document.createElement('div')\n normalizedElt.append(newContent)\n document.body.insertAdjacentElement('afterend', ctxPantry)\n\n // Computes the set of IDs that persist between the two contents excluding duplicates\n const oldIdElements = oldElt.querySelectorAll('[id]')\n for (const { id, tagName } of oldIdElements) {\n if (oldIdTagNameMap.has(id)) {\n duplicateIds.add(id)\n } else {\n oldIdTagNameMap.set(id, tagName)\n }\n }\n if (oldElt instanceof Element && oldElt.id) {\n if (oldIdTagNameMap.has(oldElt.id)) {\n duplicateIds.add(oldElt.id)\n } else {\n oldIdTagNameMap.set(oldElt.id, oldElt.tagName)\n }\n }\n\n ctxPersistentIds.clear()\n const newIdElements = normalizedElt.querySelectorAll('[id]')\n for (const { id, tagName } of newIdElements) {\n if (ctxPersistentIds.has(id)) {\n duplicateIds.add(id)\n } else if (oldIdTagNameMap.get(id) === tagName) {\n ctxPersistentIds.add(id)\n }\n }\n\n for (const id of duplicateIds) {\n ctxPersistentIds.delete(id)\n }\n\n oldIdTagNameMap.clear()\n duplicateIds.clear()\n ctxIdMap.clear()\n\n const parent = mode === 'outer' ? oldElt.parentElement! : oldElt\n populateIdMapWithTree(parent, oldIdElements)\n populateIdMapWithTree(normalizedElt, newIdElements)\n\n morphChildren(\n parent,\n normalizedElt,\n mode === 'outer' ? oldElt : null,\n oldElt.nextSibling,\n )\n\n ctxPantry.remove()\n}\n\n// This is the core algorithm for matching up children.\n// The idea is to use ID sets to try to match up nodes as faithfully as possible.\n// We greedily match, which allows us to keep the algorithm fast,\n// but by using ID sets, we are able to better match up with content deeper in the DOM.\nconst morphChildren = (\n oldParent: Element | ShadowRoot, // the old content that we are merging the new content into\n newParent: Element, // the parent element of the new content\n insertionPoint: Node | null = null, // the point in the DOM we start morphing at (defaults to first child)\n endPoint: Node | null = null, // the point in the DOM we stop morphing at (defaults to after last child)\n): void => {\n // normalize\n if (\n oldParent instanceof HTMLTemplateElement &&\n newParent instanceof HTMLTemplateElement\n ) {\n // we can pretend the DocumentElement is an Element\n oldParent = oldParent.content as unknown as Element\n newParent = newParent.content as unknown as Element\n }\n insertionPoint ??= oldParent.firstChild\n\n // run through all the new content\n for (const newChild of newParent.childNodes) {\n // once we reach the end of the old parent content skip to the end and insert the rest\n if (insertionPoint && insertionPoint !== endPoint) {\n const bestMatch = findBestMatch(newChild, insertionPoint, endPoint)\n if (bestMatch) {\n // if the node to morph is not at the insertion point then remove/move up to it\n if (bestMatch !== insertionPoint) {\n let cursor: Node | null = insertionPoint\n // Remove nodes between the start and end nodes\n while (cursor && cursor !== bestMatch) {\n const tempNode = cursor\n cursor = cursor.nextSibling\n removeNode(tempNode)\n }\n }\n morphNode(bestMatch, newChild)\n insertionPoint = bestMatch.nextSibling\n continue\n }\n }\n\n // if the matching node is elsewhere in the original content\n if (newChild instanceof Element && ctxPersistentIds.has(newChild.id)) {\n // move it and all its children here and morph, will always be found\n // Search for an element by ID within the document and pantry, and move it using moveBefore.\n const movedChild = document.getElementById(newChild.id) as Element\n\n // Removes an element from its ancestors' ID maps.\n // This is needed when an element is moved from the \"future\" via `moveBeforeId`.\n // Otherwise, its erstwhile ancestors could be mistakenly moved to the pantry rather than being deleted,\n // preventing their removal hooks from being called.\n let current = movedChild\n while ((current = current.parentNode as Element)) {\n const idSet = ctxIdMap.get(current)\n if (idSet) {\n idSet.delete(newChild.id)\n if (!idSet.size) {\n ctxIdMap.delete(current)\n }\n }\n }\n\n moveBefore(oldParent, movedChild, insertionPoint)\n morphNode(movedChild, newChild)\n insertionPoint = movedChild.nextSibling\n continue\n }\n\n // This performs the action of inserting a new node while handling situations where the node contains\n // elements with persistent IDs and possible state info we can still preserve by moving in and then morphing\n if (ctxIdMap.has(newChild)) {\n // node has children with IDs with possible state so create a dummy elt of same type and apply full morph algorithm\n const namespaceURI = (newChild as Element).namespaceURI\n const tagName = (newChild as Element).tagName\n const newEmptyChild =\n namespaceURI && namespaceURI !== 'http://www.w3.org/1999/xhtml'\n ? document.createElementNS(namespaceURI, tagName)\n : document.createElement(tagName)\n oldParent.insertBefore(newEmptyChild, insertionPoint)\n morphNode(newEmptyChild, newChild)\n insertionPoint = newEmptyChild.nextSibling\n } else {\n // optimization: no id state to preserve so we can just insert a clone of the newChild and its descendants\n const newClonedChild = document.importNode(newChild, true) // importNode to not mutate newParent\n oldParent.insertBefore(newClonedChild, insertionPoint)\n insertionPoint = newClonedChild.nextSibling\n }\n }\n\n // remove any remaining old nodes that didn't match up with new content\n while (insertionPoint && insertionPoint !== endPoint) {\n const tempNode = insertionPoint\n insertionPoint = insertionPoint.nextSibling\n removeNode(tempNode)\n }\n}\n\n// Scans forward from the startPoint to the endPoint looking for a match for the node.\n// It looks for an id set match first, then a soft match.\n// We abort soft matching if we find two future soft matches, to reduce churn.\nconst findBestMatch = (\n node: Node,\n startPoint: Node | null,\n endPoint: Node | null,\n): Node | null => {\n let bestMatch: Node | null | undefined = null\n let nextSibling = node.nextSibling\n let siblingSoftMatchCount = 0\n let displaceMatchCount = 0\n\n // Max ID matches we are willing to displace in our search\n const nodeMatchCount = ctxIdMap.get(node)?.size || 0\n\n let cursor = startPoint\n while (cursor && cursor !== endPoint) {\n // soft matching is a prerequisite for id set matching\n if (isSoftMatch(cursor, node)) {\n let isIdSetMatch = false\n const oldSet = ctxIdMap.get(cursor)\n const newSet = ctxIdMap.get(node)\n\n if (newSet && oldSet) {\n for (const id of oldSet) {\n // a potential match is an id in the new and old nodes that\n // has not already been merged into the DOM\n // But the newNode content we call this on has not been\n // merged yet and we don't allow duplicate IDs so it is simple\n if (newSet.has(id)) {\n isIdSetMatch = true\n break\n }\n }\n }\n\n if (isIdSetMatch) {\n return cursor // found an id set match, we're done!\n }\n\n // we haven\u2019t yet saved a soft match fallback\n // the current soft match will hard match something else in the future, leave it\n if (!bestMatch && !ctxIdMap.has(cursor)) {\n // optimization: if node can't id set match, we can just return the soft match immediately\n if (!nodeMatchCount) {\n return cursor\n }\n // save this as the fallback if we get through the loop without finding a hard match\n bestMatch = cursor\n }\n }\n\n // check for IDs we may be displaced when matching\n displaceMatchCount += ctxIdMap.get(cursor)?.size || 0\n if (displaceMatchCount > nodeMatchCount) {\n // if we are going to displace more IDs than the node contains then\n // we do not have a good candidate for an ID match, so return\n break\n }\n\n if (bestMatch === null && nextSibling && isSoftMatch(cursor, nextSibling)) {\n // The next new node has a soft match with this node, so\n // increment the count of future soft matches\n siblingSoftMatchCount++\n nextSibling = nextSibling.nextSibling\n\n // If there are two future soft matches, block soft matching for this node to allow\n // future siblings to soft match. This is to reduce churn in the DOM when an element\n // is prepended.\n if (siblingSoftMatchCount >= 2) {\n bestMatch = undefined\n }\n }\n\n cursor = cursor.nextSibling\n }\n\n return bestMatch || null\n}\n\n// ok to cast: if one is not element, `id` and `tagName` will be null and we'll just compare that.\nconst isSoftMatch = (oldNode: Node, newNode: Node): boolean =>\n oldNode.nodeType === newNode.nodeType &&\n (oldNode as Element).tagName === (newNode as Element).tagName &&\n // If oldElt has an `id` with possible state and it doesn\u2019t match newElt.id then avoid morphing.\n // We'll still match an anonymous node with an IDed newElt, though, because if it got this far,\n // its not persistent, and new nodes can't have any hidden state.\n (!(oldNode as Element).id ||\n (oldNode as Element).id === (newNode as Element).id)\n\n// Gets rid of an unwanted DOM node; strategy depends on nature of its reuse:\n// - Persistent nodes will be moved to the pantry for later reuse\n// - Other nodes will have their hooks called, and then are removed\nconst removeNode = (node: Node): void => {\n // are we going to id set match this later?\n ctxIdMap.has(node)\n ? // skip callbacks and move to pantry\n moveBefore(ctxPantry, node, null)\n : // remove for realsies\n node.parentNode?.removeChild(node)\n}\n\n// Moves an element before another element within the same parent.\n// Uses the proposed `moveBefore` API if available (and working), otherwise falls back to `insertBefore`.\n// This is essentially a forward-compat wrapper.\nconst moveBefore = (parentNode: Node, node: Node, after: Node | null): void => {\n if ('moveBefore' in parentNode) {\n const moveableParent = parentNode as Node & {\n moveBefore: (node: Node, child: Node | null) => Node\n }\n moveableParent.moveBefore(node, after)\n return\n }\n parentNode.insertBefore(node, after)\n}\n\nconst aliasedPreserveAttr = aliasify('preserve-attr')\n\n// syncs the oldNode to the newNode, copying over all attributes and\n// inner element state from the newNode to the oldNode\nconst morphNode = (\n oldNode: Node, // root node to merge content into\n newNode: Node, // new content to merge\n): Node => {\n const type = newNode.nodeType\n\n // if is an element type, sync the attributes from the\n // new node into the new node\n if (type === 1 /* element type */) {\n const oldElt = oldNode as Element\n const newElt = newNode as Element\n const shouldScopeChildren = oldElt.hasAttribute('data-scope-children')\n if (\n oldElt.hasAttribute(aliasedIgnoreMorph) &&\n newElt.hasAttribute(aliasedIgnoreMorph)\n ) {\n return oldNode\n }\n\n // The following logic for handling inputs, textareas, and options is finnicky.\n // Only change with extreme caution and lots of testing!\n // --\n // many bothans died to bring us this information:\n // https://github.com/patrick-steele-idem/morphdom/blob/master/src/specialElHandlers.js\n // https://github.com/choojs/nanomorph/blob/master/lib/morph.js#L113\n // --\n\n const preserveAttrs = (\n (newNode as HTMLElement).getAttribute(aliasedPreserveAttr) ?? ''\n ).split(' ')\n\n const updateElementProp = (\n oldElt: Element,\n newElt: Element,\n name: string,\n ): boolean => {\n const newEltHasAttr = newElt.hasAttribute(name)\n if (\n oldElt.hasAttribute(name) !== newEltHasAttr &&\n !preserveAttrs.includes(name)\n ) {\n // @ts-expect-error - setting dynamic property for native DOM properties\n oldElt[name] = newEltHasAttr\n return true\n }\n return false\n }\n\n let shouldDispatchPropChangeEvent = false\n if (\n oldElt instanceof HTMLInputElement &&\n newElt instanceof HTMLInputElement &&\n newElt.type !== 'file'\n ) {\n // Modify the value only if the new element\u2019s value attribute is different from the old element\u2019s value attribute\n const newValue = newElt.getAttribute('value')\n if (\n oldElt.getAttribute('value') !== newValue &&\n !preserveAttrs.includes('value')\n ) {\n oldElt.value = newValue ?? ''\n shouldDispatchPropChangeEvent = true\n }\n // Update checked and disabled properties\n shouldDispatchPropChangeEvent =\n updateElementProp(oldElt, newElt, 'checked') ||\n shouldDispatchPropChangeEvent\n updateElementProp(oldElt, newElt, 'disabled')\n } else if (\n oldElt instanceof HTMLTextAreaElement &&\n newElt instanceof HTMLTextAreaElement\n ) {\n // Modify the value only if the new element\u2019s value is different from the old element\u2019s default value\n const newValue = newElt.value\n if (oldElt.defaultValue !== newValue) {\n oldElt.value = newValue\n shouldDispatchPropChangeEvent = true\n }\n } else if (\n oldElt instanceof HTMLOptionElement &&\n newElt instanceof HTMLOptionElement\n ) {\n shouldDispatchPropChangeEvent =\n updateElementProp(oldElt, newElt, 'selected') ||\n shouldDispatchPropChangeEvent\n }\n\n for (const { name, value } of newElt.attributes) {\n if (\n oldElt.getAttribute(name) !== value &&\n !preserveAttrs.includes(name)\n ) {\n oldElt.setAttribute(name, value)\n }\n }\n\n // Create a static copy, so we can iterate forward safely as we remove attributes\n for (const { name } of Array.from(oldElt.attributes)) {\n if (!newElt.hasAttribute(name) && !preserveAttrs.includes(name)) {\n oldElt.removeAttribute(name)\n }\n }\n\n if (shouldDispatchPropChangeEvent) {\n const dispatchElt =\n oldElt instanceof HTMLOptionElement ? oldElt.closest('select') : oldElt\n dispatchElt?.dispatchEvent(\n new Event(DATASTAR_PROP_CHANGE_EVENT, { bubbles: true }),\n )\n }\n\n // Preserve the scope marker even if the incoming markup doesn't carry it.\n if (shouldScopeChildren && !oldElt.hasAttribute('data-scope-children')) {\n oldElt.setAttribute('data-scope-children', '')\n }\n\n if (\n oldElt instanceof HTMLTemplateElement &&\n newElt instanceof HTMLTemplateElement\n ) {\n oldElt.innerHTML = newElt.innerHTML\n } else if (!oldElt.isEqualNode(newElt)) {\n morphChildren(oldElt, newElt)\n }\n\n if (shouldScopeChildren) {\n oldElt.dispatchEvent(\n new CustomEvent(DATASTAR_SCOPE_CHILDREN_EVENT, { bubbles: false }),\n )\n }\n }\n\n if (type === 8 /* comment */ || type === 3 /* text */) {\n if (oldNode.nodeValue !== newNode.nodeValue) {\n oldNode.nodeValue = newNode.nodeValue\n }\n }\n\n return oldNode\n}\n\n// A bottom-up algorithm that populates a map of Element -> IdSet.\n// The ID set for a given element is the set of all IDs contained within its subtree.\n// As an optimization, we filter these IDs through the given list of persistent IDs,\n// because we don't need to bother considering IDed elements that won't be in the new content.\nconst populateIdMapWithTree = (\n root: Element | ShadowRoot | null,\n elements: Iterable,\n): void => {\n for (const elt of elements) {\n if (ctxPersistentIds.has(elt.id)) {\n let current: Element | null = elt\n // walk up the parent hierarchy of that element, adding the ID of element to the parent's ID set\n while (current && current !== root) {\n let idSet = ctxIdMap.get(current)\n // if the ID set doesn\u2019t exist, create it and insert it in the map\n if (!idSet) {\n idSet = new Set()\n ctxIdMap.set(current, idSet)\n }\n idSet.add(elt.id)\n current = current.parentElement\n }\n }\n }\n}\n", "// Icon: material-symbols:settings-input-antenna\n// Slug: Patches signals.\n// Description: Patches signals.\n\nimport { watcher } from '@engine'\nimport { mergePatch } from '@engine/signals'\nimport { jsStrToObject } from '@utils/text'\n\nwatcher({\n name: 'datastar-patch-signals',\n apply({ error }, { signals, onlyIfMissing }) {\n if (typeof signals !== 'string') {\n throw error('PatchSignalsExpectedSignals')\n }\n\n const ifMissing =\n typeof onlyIfMissing === 'string' && onlyIfMissing.trim() === 'true'\n mergePatch(jsStrToObject(signals), { ifMissing })\n },\n})\n"], + "mappings": "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", + "names": ["lol", "DSP", "DSS", "DATASTAR_FETCH_EVENT", "DATASTAR_PROP_CHANGE_EVENT", "DATASTAR_READY_EVENT", "DATASTAR_SCOPE_CHILDREN_EVENT", "DATASTAR_SIGNAL_PATCH_EVENT", "hasOwn", "isPojo", "obj", "isEmpty", "prop", "hasOwn", "updateLeaves", "fn", "key", "val", "pathToObj", "paths", "result", "path", "value", "keys", "lastKey", "acc", "currentPatch", "queuedEffects", "batchDepth", "notifyIndex", "queuedEffectsLength", "prevSub", "activeSub", "version", "beginBatch", "endBatch", "flush", "dispatch", "startPeeking", "sub", "stopPeeking", "signal", "initialValue", "signalOper", "value_", "flags_", "computedSymbol", "computed", "getter", "c", "computedOper", "effect", "fn", "e", "fn_", "link", "effectOper", "run", "update", "updateComputed", "updateSignal", "startTracking", "oldValue", "endTracking", "s", "value", "notify", "flags", "subs", "subs_", "sub_", "checkDirty", "deps_", "dep", "dep_", "depFlags", "nextDep_", "propagate", "currentValue", "shallowPropagate", "unlink", "prevDep", "depsTail_", "nextDep", "version_", "subsTail_", "newLink", "prevDep_", "prevSub_", "nextSub_", "toRemove", "next", "stack", "top", "isValidLink", "subSubs", "nextSub", "prev_", "checkDepth", "dirty", "firstSub", "hasMultipleSubs", "checkLink", "getPath", "path", "result", "root", "split", "hasOwn", "deep", "prefix", "isArr", "isPojo", "deepObj", "key", "keys", "_", "prop", "newValue", "diff", "patch", "i", "pathStr", "nextVal", "detail", "pathToObj", "DATASTAR_SIGNAL_PATCH_EVENT", "mergePatch", "ifMissing", "mergeInner", "mergePaths", "paths", "options", "target", "targetParent", "toRegExp", "val", "filtered", "include", "exclude", "obj", "includeRe", "excludeRe", "node", "isHTMLOrSVG", "el", "kebab", "str", "camel", "x", "snake", "RE_FUNCTION_LITERAL", "jsStrToObject", "raw", "options", "reviveFunctionStrings", "_k", "value", "trimmed", "revived", "caseFns", "str", "x", "modifyCasing", "mods", "defaultCase", "c", "aliasify", "name", "unaliasify", "url", "error", "ctx", "reason", "metadata", "e", "r", "snake", "q", "c", "actionPlugins", "attributePlugins", "watcherPlugins", "actions", "_", "prop", "removals", "queuedAttributes", "queuedAttributeNames", "observedRoots", "datastarReadyDispatched", "attribute", "plugin", "roots", "root", "applyQueued", "action", "DATASTAR_FETCH_EVENT", "evt", "watcher", "cleanupEls", "els", "el", "elCleanups", "attrCleanups", "cleanup", "aliasedIgnore", "aliasify", "aliasedIgnoreAttr", "shouldIgnore", "applyEls", "onlyNew", "appliedKeys", "key", "attrKey", "applyAttributePlugin", "attr", "observe", "mutations", "target", "type", "attributeName", "addedNodes", "removedNodes", "node", "isHTMLOrSVG", "rawAttrKey", "unaliasify", "value", "mutationObserver", "parseAttributeKey", "rawKey", "namePart", "rawModifiers", "pluginName", "mods", "rawMod", "label", "mod", "isDocumentObserverActive", "dispatchDatastarReady", "DATASTAR_READY_EVENT", "observeRoot", "applyAttributePlugin", "el", "attrKey", "value", "onlyNew", "rawKey", "unaliasify", "pluginName", "key", "mods", "parseAttributeKey", "plugin", "attributePlugins", "queuedAttributeNames", "ctx", "error", "actionPlugins", "keyReq", "valueReq", "keyProvided", "valueProvided", "cleanups", "cachedRx", "args", "genRx", "cleanup", "elCleanups", "removals", "attrCleanups", "oldCleanup", "returnsValue", "argNames", "expr", "statementRe", "statements", "lastIdx", "last", "escaped", "escapeRe", "DSP", "DSS", "counter", "match", "k", "v", "quoted", "interpolationExpr", "signalName", "_", "innerSignalName", "acc", "part", "fn", "action", "name", "evt", "err", "actions", "root", "e", "action", "_", "fn", "startPeeking", "stopPeeking", "action", "_", "value", "filter", "startPeeking", "masked", "filtered", "updateLeaves", "mergePatch", "stopPeeking", "action", "_", "filter", "startPeeking", "masked", "filtered", "updateLeaves", "oldValue", "mergePatch", "stopPeeking", "abortControllers", "methodSupportsRequestBody", "method", "createHttpMethod", "name", "openWhenHiddenDefault", "action", "el", "evt", "error", "cleanups", "url", "selector", "userHeaders", "contentType", "include", "exclude", "openWhenHidden", "payload", "requestCancellation", "retry", "retryInterval", "retryScaler", "retryMaxWait", "retryMaxCount", "controller", "cleanupFn", "initialHeaders", "headers", "req", "response", "dispatchFetch", "ERROR", "type", "argsRawLines", "line", "i", "k", "v", "argsRaw", "isWrongContent", "RETRYING", "buildFetchEventSourceInit", "urlInstance", "queryParams", "startPeeking", "requestPayload", "filtered", "stopPeeking", "body", "formEl", "formData", "submitter", "preventDefault", "multipart", "formParams", "key", "value", "STARTED", "fetchEventSource", "e", "FINISHED", "RETRIES_FAILED", "DATASTAR_FETCH_EVENT", "err", "getBytes", "stream", "onChunk", "reader", "result", "getLines", "onLine", "buffer", "position", "fieldLength", "discardTrailingNewline", "arr", "concat", "bufLength", "lineStart", "lineEnd", "getMessages", "onId", "onRetry", "onMessage", "message", "newMessage", "decoder", "field", "valueOffset", "a", "b", "res", "resolve", "reject", "fetchInit", "input", "inputSignal", "inputHeaders", "inputOnOpen", "onmessage", "onclose", "onerror", "inputFetch", "responseOverrides", "rest", "curRequestController", "onVisibilityChange", "currentFetchInit", "create", "retryTimer", "dispose", "fetch", "onopen", "retries", "baseRetryInterval", "retryRequest", "curRequestSignal", "dispatchNonSSE", "dispatchType", "argNames", "n", "kebab", "o", "status", "isNoContentStatus", "isRedirectStatus", "isErrorStatus", "ct", "script", "scriptAttributesHeader", "id", "innerErr", "attribute", "el", "key", "rx", "syncAttr", "val", "_k", "v", "update", "observer", "obj", "attributeFilter", "cleanup", "effect", "propAdapter", "prop", "events", "el", "value", "attrAdapter", "attr", "valueAdapter", "treatUndefinedAsString", "type", "dataURIRegex", "empty", "boundPath", "key", "rawKey", "signalName", "adapter", "initialValue", "rawAttribute", "aliasify", "selector", "checked", "input", "mergePaths", "inputs", "paths", "i", "hasOwn", "attribute", "mods", "error", "modifyCasing", "props", "syncSignal", "files", "signalFiles", "f", "resolve", "reader", "match", "typeMap", "option", "firstProp", "camel", "getPath", "path", "signalValue", "eventName", "DATASTAR_PROP_CHANGE_EVENT", "cleanup", "effect", "attribute", "key", "el", "mods", "rx", "modifyCasing", "classes", "callback", "observer", "k", "classNames", "cn", "name", "cleanup", "effect", "attribute", "key", "mods", "rx", "error", "mergePaths", "modifyCasing", "computed", "patch", "updateLeaves", "old", "mergePatch", "attribute", "rx", "effect", "attribute", "el", "key", "mods", "value", "signalName", "modifyCasing", "activeFetches", "mergePaths", "watcher", "event", "type", "elt", "STARTED", "FINISHED", "DATASTAR_FETCH_EVENT", "tagToMs", "args", "arg", "tagHas", "tags", "tag", "defaultValue", "tagFirst", "delay", "callback", "wait", "args", "throttle", "leading", "trailing", "debounce", "lastArgs", "timer", "modifyTiming", "mods", "delayArgs", "tagToMs", "debounceArgs", "tagHas", "throttleArgs", "supportsViewTransitions", "modifyViewTransition", "callback", "mods", "cb", "args", "attribute", "rx", "mods", "callback", "beginBatch", "endBatch", "modifyViewTransition", "wait", "delayArgs", "tagToMs", "delay", "attribute", "el", "value", "mods", "spaces", "filters", "jsStrToObject", "callback", "observer", "filtered", "cleanup", "effect", "attribute", "el", "key", "mods", "rx", "target", "callback", "evt", "beginBatch", "endBatch", "modifyViewTransition", "modifyTiming", "eventName", "modifyCasing", "evtListOpts", "cb", "DATASTAR_FETCH_EVENT", "DATASTAR_SIGNAL_PATCH_EVENT", "listener", "clamp", "value", "min", "max", "once", "attribute", "el", "mods", "rx", "callback", "beginBatch", "endBatch", "modifyViewTransition", "modifyTiming", "options", "threshold", "clamp", "tagFirst", "exit", "observer", "entries", "entry", "attribute", "mods", "rx", "callback", "beginBatch", "endBatch", "modifyViewTransition", "duration", "durationArgs", "tagToMs", "tagHas", "intervalId", "attribute", "el", "key", "mods", "rx", "error", "filterAttr", "aliasify", "filtersRaw", "filters", "jsStrToObject", "running", "callback", "modifyTiming", "evt", "watched", "filtered", "isEmpty", "beginBatch", "endBatch", "DATASTAR_SIGNAL_PATCH_EVENT", "attribute", "el", "key", "mods", "value", "signalName", "modifyCasing", "mergePaths", "NONE", "DISPLAY", "attribute", "el", "rx", "update", "observer", "cleanup", "effect", "attribute", "key", "mods", "rx", "ifMissing", "modifyCasing", "value", "mergePaths", "patch", "mergePatch", "attribute", "key", "el", "rx", "style", "initialStyles", "apply", "prop", "value", "initial", "update", "observer", "styles", "kebab", "cleanup", "effect", "attribute", "el", "rx", "update", "observer", "cleanup", "effect", "isValidType", "arr", "value", "PATCH_MODES", "NAMESPACES", "watcher", "ctx", "args", "selector", "mode", "namespace", "useViewTransitionRaw", "elements", "args2", "supportsViewTransitions", "onPatchElements", "error", "newContent", "consume", "elementsWithSvgsRemoved", "hasHtml", "hasHead", "hasBody", "wrapperTag", "wrappedEls", "newDocument", "wrapperEl", "child", "children", "target", "applyToTargets", "targets", "targetList", "scripts", "script", "execute", "elScripts", "old", "name", "applyPatchMode", "element", "action", "used", "nextNode", "morph", "scopeHost", "DATASTAR_SCOPE_CHILDREN_EVENT", "ctxIdMap", "ctxPersistentIds", "oldIdTagNameMap", "duplicateIds", "ctxPantry", "aliasedIgnoreMorph", "aliasify", "aliasedIgnoreMorphAttr", "oldElt", "isHTMLOrSVG", "normalizedElt", "oldIdElements", "id", "tagName", "newIdElements", "parent", "populateIdMapWithTree", "morphChildren", "oldParent", "newParent", "insertionPoint", "endPoint", "newChild", "bestMatch", "findBestMatch", "cursor", "tempNode", "removeNode", "morphNode", "movedChild", "current", "idSet", "moveBefore", "namespaceURI", "newEmptyChild", "newClonedChild", "node", "startPoint", "nextSibling", "siblingSoftMatchCount", "displaceMatchCount", "nodeMatchCount", "isSoftMatch", "isIdSetMatch", "oldSet", "newSet", "oldNode", "newNode", "parentNode", "after", "aliasedPreserveAttr", "type", "newElt", "shouldScopeChildren", "preserveAttrs", "updateElementProp", "newEltHasAttr", "shouldDispatchPropChangeEvent", "newValue", "DATASTAR_PROP_CHANGE_EVENT", "root", "elt", "watcher", "error", "signals", "onlyIfMissing", "ifMissing", "mergePatch", "jsStrToObject"] } diff --git a/library/src/plugins/actions/fetch.ts b/library/src/plugins/actions/fetch.ts index 91a789e9..96bc2f90 100644 --- a/library/src/plugins/actions/fetch.ts +++ b/library/src/plugins/actions/fetch.ts @@ -440,7 +440,7 @@ type FetchEventSourceInit = onopen?: (response: Response) => Promise onmessage?: (ev: EventSourceMessage) => void onclose?: () => void - onerror?: (err: any) => number | null | undefined | void + onerror?: (err: any) => void openWhenHidden?: boolean fetch?: typeof fetch retry?: 'auto' | 'error' | 'always' | 'never' @@ -520,6 +520,25 @@ const fetchEventSource = ( let retries = 0 let baseRetryInterval = retryInterval + + const retryRequest = () => { + retries++ + if (retries <= retryMaxCount) { + clearTimeout(retryTimer) + console.error( + `Datastar failed to reach ${input.toString()} retrying in ${retryInterval}ms.`, + ) + retryTimer = setTimeout(create, retryInterval) + + // Prepare the interval for the next retry (exponential backoff) + retryInterval = Math.min(retryInterval * retryScaler, retryMaxWait) + } else { + dispatchFetch(RETRIES_FAILED, el, {}) + dispose() + reject('Max retries reached.') + } + } + const create = async () => { curRequestController = new AbortController() const curRequestSignal = curRequestController.signal @@ -569,8 +588,7 @@ const fetchEventSource = ( !isRedirectStatus && (retry === 'always' || (retry === 'error' && isErrorStatus)) ) { - clearTimeout(retryTimer) - retryTimer = setTimeout(create, retryInterval) + retryRequest() return } dispose() @@ -649,37 +667,17 @@ const fetchEventSource = ( onclose?.() if (retry === 'always' && !isRedirectStatus) { - clearTimeout(retryTimer) - retryTimer = setTimeout(create, retryInterval) + retryRequest() return } dispose() resolve() - } catch (err) { + } catch { if (!curRequestSignal.aborted) { - // if we haven’t aborted the request ourselves: try { - // check if we need to retry: - const interval: any = onerror?.(err) || retryInterval - clearTimeout(retryTimer) - retryTimer = setTimeout(create, interval) - retryInterval = Math.min( - retryInterval * retryScaler, - retryMaxWait, - ) // exponential backoff - if (++retries >= retryMaxCount) { - dispatchFetch(RETRIES_FAILED, el, {}) - // we should not retry anymore: - dispose() - reject('Max retries reached.') // Max retries reached, check your server or network connection - } else { - console.error( - `Datastar failed to reach ${input.toString()} retrying in ${interval}ms.`, - ) - } + retryRequest() } catch (innerErr) { - // we should not retry anymore: dispose() reject(innerErr) } From 39c25a722ad978113e2d24c10ab8aea026eee9ec Mon Sep 17 00:00:00 2001 From: Ben Croker Date: Tue, 5 May 2026 18:20:24 -0500 Subject: [PATCH 2/2] Refactoring --- bundles/datastar.js | 14 +++++++------- bundles/datastar.js.map | 6 +++--- library/src/plugins/actions/fetch.ts | 20 ++++++-------------- 3 files changed, 16 insertions(+), 24 deletions(-) diff --git a/bundles/datastar.js b/bundles/datastar.js index 82c6adec..f3f7da20 100644 --- a/bundles/datastar.js +++ b/bundles/datastar.js @@ -1,9 +1,9 @@ // Datastar v1.0.1 -var gt=/🖕JS_DS🚀/.source,We=gt.slice(0,5),Ue=gt.slice(4),U="datastar-fetch",ge="datastar-prop-change",ht="datastar-ready",Je="datastar-scope-children",te="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),yt=e=>{for(let t in e)if(L(e,t))return!1;return!0},ne=(e,t)=>{for(let n in e){let r=e[n];z(r)||Array.isArray(r)?ne(r,t):e[n]=t(r)}},Le=e=>{let t={};for(let[n,r]of e){let s=n.split("."),i=s.pop(),o=s.reduce((a,l)=>a[l]??={},t);o[i]=r}return t};var xe=[],Ke=[],He=0,Ne=0,ze=0,Ze,J,Pe=0,x=()=>{He++},N=()=>{--He||(Et(),Z())},_=e=>{Ze=J,J=e},k=()=>{J=Ze,Ze=void 0},he=e=>cn.bind(0,{previousValue:e,t:e,e:1}),Qe=Symbol("computed"),_e=e=>{let t=ln.bind(0,{e:17,getter:e});return t[Qe]=1,t},A=e=>{let t={d:e,e:2};J&&Xe(t,J),_(t),x();try{t.d()}finally{N(),k()}return Rt.bind(0,t)},Et=()=>{for(;Ne"getter"in e?St(e):Tt(e,e.t),St=e=>{_(e),wt(e);try{let t=e.t;return t!==(e.t=e.getter(t))}finally{k(),Mt(e)}},Tt=(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):Ke[ze++]=e}},At=(e,t)=>{if(t&16||t&32&&Lt(e.s,e)){_(e),wt(e),x();try{e.d()}finally{N(),k(),Mt(e)}return}t&32&&(e.e=t&-33);let n=e.s;for(;n;){let r=n.c,s=r.e;s&64&&At(r,r.e=s&-65),n=n.i}},cn=(e,...t)=>{if(t.length){if(e.t!==(e.t=t[0])){e.e=17;let r=e.r;return r&&(un(r),He||Et()),!0}return!1}let n=e.t;if(e.e&16&&Tt(e,n)){let r=e.r;r&&Fe(r)}return J&&Xe(e,J),n},ln=e=>{let t=e.e;if(t&16||t&32&&Lt(e.s,e)){if(St(e)){let n=e.r;n&&Fe(n)}}else t&32&&(e.e=t&-33);return J&&Xe(e,J),e.t},Rt=e=>{let t=e.s;for(;t;)t=Ce(t,e);let n=e.r;n&&Ce(n),e.e=0},Xe=(e,t)=>{let n=t.a;if(n&&n.c===e)return;let r=n?n.i:t.s;if(r&&r.c===e){r.p=Pe,t.a=r;return}let s=e.m;if(s&&s.p===Pe&&s.o===t)return;let i=t.a=e.m={p:Pe,c:e,o:t,l:n,i:r,u:s};r&&(r.l=i),n?n.i=i:t.s=i,s?s.n=i:e.r=i},Ce=(e,t=e.o)=>{let n=e.c,r=e.l,s=e.i,i=e.n,o=e.u;if(s?s.l=r:t.a=r,r?r.i=s:t.s=s,i?i.u=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=Ce(a,n);while(a)}}else"previousValue"in n||Rt(n);return s},un=e=>{let t=e.n,n;e:for(;;){let r=e.o,s=r.e;if(s&60?s&12?s&4?!(s&48)&&fn(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,f:n},t=o);continue}}if(e=t){t=e.n;continue}for(;n;)if(e=n.t,n=n.f,e){t=e.n;continue e}break}},wt=e=>{Pe++,e.a=void 0,e.e=e.e&-57|4},Mt=e=>{let t=e.a,n=t?t.i:e.s;for(;n;)n=Ce(n,e);e.e&=-5},Lt=(e,t)=>{let n,r=0,s=!1;e:for(;;){let i=e.c,o=i.e;if(t.e&16)s=!0;else if((o&17)===17){if(vt(i)){let a=i.r;a.n&&Fe(a),s=!0}}else if((o&33)===33){(e.n||e.u)&&(n={t:e,f: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,l=a.n;if(l?(e=n.t,n=n.f):e=a,s){if(vt(t)){l&&Fe(a),t=e.o;continue}s=!1}else t.e&=-33;if(t=e.o,e.i){e=e.i;continue e}}return s}},Fe=e=>{do{let t=e.o,n=t.e;(n&48)===32&&(t.e=n|16,n&2&&Ye(t))}while(e=e.n)},fn=(e,t)=>{let n=t.a;for(;n;){if(n===e)return!0;n=n.l}return!1},ae=e=>{let t=re,n=e.split(".");for(let r of n){if(t==null||!L(t,r))return;t=t[r]}return t},Oe=(e,t="")=>{let n=Array.isArray(e);if(n||z(e)){let r=n?[]:{};for(let i in e)r[i]=he(Oe(e[i],`${t+i}.`));let s=he(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]=he(""),Z(t+o,""),s(s()+1)),r[o]())},set(i,o,a){let l=t+o;if(n&&o==="length"){let c=r[o]-a;if(r[o]=a,c>0){let u={};for(let f=a;f{if(e!==void 0&&t!==void 0&&xe.push([e,t]),!He&&xe.length){let n=Le(xe);xe.length=0,document.dispatchEvent(new CustomEvent(te,{detail:n}))}},D=(e,{ifMissing:t}={})=>{x();for(let n in e)e[n]==null?t||delete re[n]:xt(e[n],n,re,"",t);N()},S=(e,t)=>D(Le(e),t),xt=(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]:xt(e[i],i,n[t],`${r+t}.`,s)}else s&&L(n,t)||(n[t]=e)},bt=e=>typeof e=="string"?RegExp(e.replace(/^\/|\/$/g,"")):e,q=({include:e=/.*/,exclude:t=/(?!)/}={},n=re)=>{let r=bt(e),s=bt(t),i=[],o=[[n,""]];for(;o.length;){let[a,l]=o.pop();for(let c in a){let u=l+c;z(a[c])?o.push([a[c],`${u}.`]):r.test(u)&&!s.test(u)&&i.push([u,ae(u)])}}return Le(i)},re=Oe({});var Q=e=>e instanceof HTMLElement||e instanceof SVGElement||e instanceof MathMLElement;var ce=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(),Nt=e=>ce(e).replace(/-./g,t=>t[1].toUpperCase()),Pt=e=>ce(e).replace(/-/g,"_");var dn=/^(?:(?:async\s+)?function\b|(?:async\s*)?(?:\([^)]*\)|[A-Za-z_$][\w$]*)\s*=>)/,le=(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(!dn.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})`)()}},Ot={camel:e=>e.replace(/-[a-z]/g,t=>t[1].toUpperCase()),snake:e=>e.replace(/-/g,"_"),pascal:e=>e[0].toUpperCase()+Ot.camel(e.slice(1))},P=(e,t,n="camel")=>{for(let r of t.get("case")||[n])e=Ot[r]?.(e)||e;return e},K=e=>`data-${e}`,et=e=>e;var pn="https://data-star.dev/errors",ye=(e,t,n={})=>{Object.assign(n,e);let r=new Error,s=Pt(t),i=new URLSearchParams({metadata:JSON.stringify(n)}).toString(),o=JSON.stringify(n,null,2);return r.message=`${t} -More info: ${pn}/${s}?${i} -Context: ${o}`,r},ve=new Map,tt=new Map,Ht=new Map,_t=new Proxy({},{get:(e,t)=>ve.get(t)?.apply,has:(e,t)=>ve.has(t),ownKeys:()=>Reflect.ownKeys(ve),set:()=>!1,deleteProperty:()=>!1}),Ee=new Map,ke=[],nt=new Set,be=new Set,Ct=!1,p=e=>{ke.push(e),ke.length===1&&setTimeout(()=>{for(let n of ke)nt.add(n.name),tt.set(n.name,n);ke.length=0;let t=be.size?[...be]:[document.documentElement];for(let n of t)En(n,!be.has(n));nt.clear()})},I=e=>{ve.set(e.name,e)};document.addEventListener(U,e=>{let t=Ht.get(e.detail.type);t&&t.apply({error:ye.bind(0,{plugin:{type:"watcher",name:t.name},element:{id:e.target.id,tag:e.target.tagName}})},e.detail.argsRaw)});var Se=e=>{Ht.set(e.name,e)},Ft=e=>{for(let t of e){let n=Ee.get(t);if(n&&Ee.delete(t))for(let r of n.values())for(let s of r.values())s()}},kt=K("ignore"),mn=`[${kt}]`,Dt=e=>e.hasAttribute(`${kt}__self`)||!!e.closest(mn),De=(e,t)=>{for(let n of e)if(!Dt(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)}}},gn=e=>{for(let{target:t,type:n,attributeName:r,addedNodes:s,removedNodes:i}of e)if(n==="childList"){for(let o of i)Q(o)&&(Ft([o]),Ft(o.querySelectorAll("*")));for(let o of s)Q(o)&&(De([o]),De(o.querySelectorAll("*")))}else if(n==="attributes"&&r.startsWith("data-")&&Q(t)&&!Dt(t)){let o=r.slice(5),a=et(o);if(!a)continue;let l=t.getAttribute(r);if(l===null){let c=Ee.get(t);if(c){let u=c.get(a);if(u){for(let f of u.values())f();c.delete(a)}}}else rt(t,o,l)}},hn=new MutationObserver(gn),yn=e=>{let[t,...n]=e.split("__"),[r,s]=t.split(/:(.+)/),i=new Map;for(let o of n){let[a,...l]=o.split(".");i.set(a,new Set(l))}return{pluginName:r,key:s,mods:i}},vn=()=>be.has(document.documentElement),bn=()=>{Ct||!vn()||(Ct=!0,document.dispatchEvent(new Event(ht)))},En=(e=document.documentElement,t=!0)=>{Q(e)&&De([e],!0),De(e.querySelectorAll("*"),!0),t&&(hn.observe(e,{subtree:!0,childList:!0,attributes:!0}),be.add(e),bn())};var rt=(e,t,n,r)=>{let s=et(t);if(!s)return;let{pluginName:i,key:o,mods:a}=yn(s),l=tt.get(i);if((!r||nt.has(i))&&!!l){let u={el:e,rawKey:s,mods:a,error:ye.bind(0,{plugin:{type:"attribute",name:l.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=l.requirement&&(typeof l.requirement=="string"?l.requirement:l.requirement.key)||"allowed",m=l.requirement&&(typeof l.requirement=="string"?l.requirement:l.requirement.value)||"allowed",h=o!=null&&o!=="",b=n!=null&&n!=="";if(h){if(f==="denied")throw u.error("KeyNotAllowed")}else if(f==="must")throw u.error("KeyRequired");if(b){if(m==="denied")throw u.error("ValueNotAllowed")}else if(m==="must")throw u.error("ValueRequired");if(f==="exclusive"||m==="exclusive"){if(h&&b)throw u.error("KeyAndValueProvided");if(!h&&!b)throw u.error("KeyOrValueRequired")}let d=new Map;if(b){let y;u.rx=(...G)=>(y||(y=Sn(n,{returnsValue:l.returnsValue,argNames:l.argNames,cleanups:d})),y(e,...G))}let g=l.apply(u);g&&d.set("attribute",g);let E=Ee.get(e);if(E){let y=E.get(s);if(y)for(let G of y.values())G()}else E=new Map,Ee.set(e,E);E.set(s,d)}},Sn=(e,{returnsValue:t=!1,argNames:n=[],cleanups:r=new Map}={})=>{let s="";if(t){let l=/(\/(\\\/|[^/])*\/|"(\\"|[^"])*"|'(\\'|[^'])*'|`(\\`|[^`])*`|\(\s*((function)\s*\(\s*\)|(\(\s*\))\s*=>)\s*(?:\{[\s\S]*?\}|[^;){]*)\s*\)\s*\(\s*\)|[^;])+/gm,c=e.trim().match(l);if(c){let u=c.length-1,f=c[u].trim();f.startsWith("return")||(c[u]=`return (${f});`),s=c.join(`; -`)}}else s=e.trim();let i=new Map,o=RegExp(`(?:${We})(.*?)(?:${Ue})`,"gm"),a=0;for(let l of s.matchAll(o)){let c=l[1],u=`__escaped${a++}`;i.set(u,c),s=s.replace(We+c+Ue,u)}s=s.replace(/("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|`(?:\\.|[^`\\$]|\$(?!\{))*`)|\$\{([^{}]*)\}|\$([a-zA-Z_\d]\w*(?:[.-]\w+)*)/g,(l,c,u,f)=>c?l:u!==void 0?`\${${u.replace(/\$([a-zA-Z_\d]\w*(?:[.-]\w+)*)/g,(m,h)=>h.split(".").reduce((b,d)=>`${b}['${d}']`,"$"))}}`:f.split(".").reduce((m,h)=>`${m}['${h}']`,"$")),s=s.replaceAll(/@([A-Za-z_$][\w$]*)\(/g,'__action("$1",evt,');for(let[l,c]of i)s=s.replace(l,c);try{let l=Function("el","$","__action","evt",...n,s);return(c,...u)=>{let f=(m,h,...b)=>{let d=ye.bind(0,{plugin:{type:"action",name:m},element:{id:c.id,tag:c.tagName},expression:{fnContent:s,value:e}}),g=_t[m];if(g)return g({el:c,evt:h,error:d,cleanups:r},...b);throw d("UndefinedAction")};try{return l(c,re,f,void 0,...u)}catch(m){throw console.error(m),ye({element:{id:c.id,tag:c.tagName},expression:{fnContent:s,value:e},error:m.message},"ExecuteExpression")}}}catch(l){throw console.error(l),ye({expression:{fnContent:s,value:e},error:l.message},"GenerateExpression")}};I({name:"peek",apply(e,t){_();try{return t()}finally{k()}}});I({name:"setAll",apply(e,t,n){_();let r=q(n);ne(r,()=>t),D(r),k()}});I({name:"toggleAll",apply(e,t){_();let n=q(t);ne(n,r=>!r),D(n),k()}});var It=new WeakMap,st=e=>!["GET","DELETE"].includes(e),Te=(e,t,n=!0)=>I({name:e,apply:async({el:r,evt:s,error:i,cleanups:o},a,{selector:l,headers:c,contentType:u="json",filterSignals:{include:f=/.*/,exclude:m=/(^|\.)_/}={},openWhenHidden:h=n,payload:b,requestCancellation:d="auto",retry:g="auto",retryInterval:E=1e3,retryScaler:y=2,retryMaxWait:G=3e4,retryMaxCount:C=10}={})=>{let $=d instanceof AbortController?d:new AbortController;(d==="auto"||d==="cleanup")&&(It.get(r)?.abort(),It.set(r,$)),d==="cleanup"&&(o.get(`@${e}`)?.(),o.set(`@${e}`,async()=>{$.abort(),await Promise.resolve()}));let ee=()=>{};try{if(!a?.length)throw i("FetchNoUrlProvided",{action:I});let pe={Accept:"text/event-stream, text/html, application/json","Datastar-Request":!0};u==="json"&&st(t)&&(pe["Content-Type"]="application/json");let oe=Object.assign({},pe,c),O={input:"",method:t,headers:oe,openWhenHidden:h,retry:g,retryInterval:E,retryScaler:y,retryMaxWait:G,retryMaxCount:C,signal:$.signal,onopen:async v=>{v.status>=400&&se(Tn,r,{status:v.status.toString()})},onmessage:v=>{if(!v.event.startsWith("datastar"))return;let W=v.event,T={};for(let R of v.data.split(` -`)){let M=R.indexOf(" "),w=R.slice(0,M),H=R.slice(M+1);(T[w]||=[]).push(H)}let F=Object.fromEntries(Object.entries(T).map(([R,M])=>[R,M.join(` -`)]));se(W,r,F)},onerror:v=>{if(Vt(v))throw v("FetchExpectedTextEventStream",{url:a});v&&(console.error(v.message),se(An,r,{message:v.message}))}},$e=()=>{let v=new URL(a,document.baseURI),W=new URLSearchParams(v.search);if(u==="json"){_();let T=b!==void 0?b:q({include:f,exclude:m});k();let F=JSON.stringify(T);st(t)?O.body=F:W.set("datastar",F)}else if(u==="form"){let T=l?document.querySelector(l):r.closest("form");if(!T)throw i("FetchFormNotFound",{action:I,selector:l});if(!T.noValidate&&!T.checkValidity()){T.reportValidity();return}let F=new FormData(T),R=r;if(r===T&&s instanceof SubmitEvent)R=s.submitter;else{let H=j=>j.preventDefault();T.addEventListener("submit",H),ee=()=>{T.removeEventListener("submit",H)}}if(R instanceof HTMLButtonElement||R instanceof HTMLInputElement&&R.type==="submit"){let H=R.getAttribute("name");H&&F.append(H,R.value)}let M=T.getAttribute("enctype")==="multipart/form-data";M||(oe["Content-Type"]="application/x-www-form-urlencoded");let w=new URLSearchParams(F);if(st(t))M?O.body=F:O.body=w;else for(let[H,j]of w)W.append(H,j)}else throw i("FetchInvalidContentType",{action:I,contentType:u});return v.search=W.toString(),O.input=v.toString(),O};se(it,r,{});try{await Nn(r,$e)}catch(v){if(!Vt(v))throw i("FetchFailed",{method:t,url:a,error:v.message})}}finally{se(ot,r,{}),ee(),o.delete(`@${e}`)}}});Te("get","GET",!1);Te("patch","PATCH");Te("post","POST");Te("put","PUT");Te("delete","DELETE");var it="started",ot="finished",Tn="error",An="retrying",Rn="retries-failed",se=(e,t,n)=>document.dispatchEvent(new CustomEvent(U,{detail:{type:e,el:t,argsRaw:n}})),Vt=e=>`${e}`.includes("text/event-stream"),wn=async(e,t)=>{let n=e.getReader(),r=await n.read();for(;!r.done;)t(r.value),r=await n.read()},Mn=e=>{let t,n,r,s=!1;return i=>{t?t=xn(t,i):(t=i,n=0,r=-1);let o=t.length,a=0;for(;n{let r=$t(),s=new TextDecoder;return(i,o)=>{if(!i.length)n?.(r),r=$t();else if(o>0){let a=s.decode(i.subarray(0,o)),l=o+(i[o+1]===32?2:1),c=s.decode(i.subarray(l));switch(a){case"data":r.data=r.data?`${r.data} -${c}`:c;break;case"event":r.event=c;break;case"id":e(r.id=c);break;case"retry":{let u=+c;Number.isNaN(u)||t(r.retry=u);break}}}}},xn=(e,t)=>{let n=new Uint8Array(e.length+t.length);return n.set(e),n.set(t,e.length),n},$t=()=>({data:"",event:"",id:"",retry:void 0}),Nn=(e,t)=>new Promise((n,r)=>{let s=t();if(!s)return;let{input:i,signal:o,headers:a,onopen:l,onmessage:c,onclose:u,onerror:f,openWhenHidden:m,fetch:h,retry:b="auto",retryInterval:d=1e3,retryScaler:g=2,retryMaxWait:E=3e4,retryMaxCount:y=10,responseOverrides:G,...C}=s,$={...a},ee,pe=()=>{if(ee.abort(),!document.hidden){let M=t();if(!M)return;i=M.input,C.body=M.body,R()}};m||document.addEventListener("visibilitychange",pe);let oe,O=()=>{document.removeEventListener("visibilitychange",pe),clearTimeout(oe),ee.abort()};o?.addEventListener("abort",()=>{O(),n()});let $e=h||window.fetch,v=l||(()=>{}),W=0,T=d,F=()=>{W++,W<=y?(clearTimeout(oe),console.error(`Datastar failed to reach ${i.toString()} retrying in ${d}ms.`),oe=setTimeout(R,d),d=Math.min(d*g,E)):(se(Rn,e,{}),O(),r("Max retries reached."))},R=async()=>{ee=new AbortController;let M=ee.signal;try{let w=await $e(i,{...C,headers:$,signal:M});await v(w);let H=async(B,me,Ge,we,...an)=>{let mt={[Ge]:await me.text()};for(let je of an){let Be=me.headers.get(`datastar-${ce(je)}`);if(we){let Me=we[je];Me&&(Be=typeof Me=="string"?Me:JSON.stringify(Me))}Be&&(mt[je]=Be)}se(B,e,mt),O(),n()},j=w.status,sn=j===204,pt=j>=300&&j<400,on=j>=400&&j<600;if(j!==200){if(u?.(),b!=="never"&&!sn&&!pt&&(b==="always"||b==="error"&&on)){F();return}O(),n();return}W=0,d=T;let qe=w.headers.get("Content-Type");if(qe?.includes("text/html"))return await H("datastar-patch-elements",w,"elements",G,"selector","mode","namespace","useViewTransition");if(qe?.includes("application/json"))return await H("datastar-patch-signals",w,"signals",G,"onlyIfMissing");if(qe?.includes("text/javascript")){let B=document.createElement("script"),me=w.headers.get("datastar-script-attributes");if(me)for(let[Ge,we]of Object.entries(JSON.parse(me)))B.setAttribute(Ge,we);B.textContent=await w.text(),document.head.appendChild(B),O();return}if(await wn(w.body,Mn(Ln(B=>{B?$["last-event-id"]=B:delete $["last-event-id"]},B=>{T=d=B},c))),u?.(),b==="always"&&!pt){F();return}O(),n()}catch{if(!M.aborted)try{F()}catch(w){O(),r(w)}}};R()});p({name:"attr",requirement:{value:"must"},returnsValue:!0,apply({el:e,key:t,rx:n}){let r=(a,l)=>{l===""||l===!0?e.setAttribute(a,""):l===!1||l==null?e.removeAttribute(a):typeof l=="string"?e.setAttribute(a,l):typeof l=="function"?e.setAttribute(a,l.toString()):e.setAttribute(a,JSON.stringify(l,(c,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(),l=Object.keys(a);for(let c of l)r(c,a[c]);i.observe(e,{attributeFilter:l})},i=new MutationObserver(s),o=A(s);return()=>{i.disconnect(),o()}}});var Ie=(e,...t)=>({get:n=>n[e],set:(n,r)=>{n[e]=r},events:t}),qt=(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}),Pn=/^data:(?[^;]+);base64,(?.*)$/,Gt=Symbol("empty"),On=(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&&S([[r,f.value]],{ifMissing:!0})}if(!Array.isArray(i)||e instanceof HTMLSelectElement&&e.multiple)return S([[r,s.get(e,typeof i)]],{ifMissing:!0}),r;let l=document.querySelectorAll(a),c=[],u=0;for(let f of l){if(c.push([`${r}.${u}`,s.get(f,typeof(L(i,u)?i[u]:void 0))]),e===f)break;u++}return S(c,{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?P(t,r):s,a=r.get("prop"),l=r.get("event"),c=null;if(e instanceof HTMLInputElement)switch(e.type){case"range":case"number":c=at(!1,"input");break;case"checkbox":c={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),c={get:(d,g)=>d.checked?g==="number"?+d.value:d.value:Gt,set:(d,g)=>{d.checked=g===(typeof g=="number"?+d.value:d.value)},events:["input"]};break;case"file":{let d=()=>{let g=[...e.files||[]],E=[];Promise.all(g.map(y=>new Promise(G=>{let C=new FileReader;C.onload=()=>{if(typeof C.result!="string")throw i("InvalidFileResultType",{resultType:typeof C.result});let $=C.result.match(Pn);if(!$?.groups)throw i("InvalidDataUri",{result:C.result});E.push({name:y.name,contents:$.groups.contents,mime:$.groups.mime})},C.onloadend=()=>G(),C.readAsDataURL(y)}))).then(()=>{S([[o,E]])})};return e.addEventListener("change",d),()=>{e.removeEventListener("change",d)}}default:c=at(!0,"input")}else if(e instanceof HTMLSelectElement&&e.multiple){let d=new Map;c={get:g=>[...g.selectedOptions].map(E=>{let y=d.get(E.value);return y==="string"||y==null?E.value:+E.value}),set:(g,E)=>{for(let y of g.options)E.includes(y.value)?(d.set(y.value,"string"),y.selected=!0):E.includes(+y.value)?(d.set(y.value,"number"),y.selected=!0):y.selected=!1},events:["change"]}}else e instanceof HTMLSelectElement?c=at(!0,"change"):e instanceof HTMLTextAreaElement?c=Ie("value","input"):e instanceof HTMLElement&&e.tagName.includes("-")?c="value"in e?Ie("value","input","change"):qt("value","input","change"):e instanceof HTMLElement&&"value"in e?c=Ie("value","change"):c=qt("value","change");if(!c)throw i("InvalidBindAdapter");let u=a&&[...a][0];if(a&&!u)throw i("BindPropNameMissing");if(u){let d=Nt(u);c=Ie(d,...l?[...l]:c.events)}else l&&(c.events=[...l]);let f=ae(o),m=On(e,t,n,o,c,f),h=()=>{let d=ae(m);if(d!=null){let g=c.get(e,typeof d);g!==Gt&&S([[m,g]])}};for(let d of c.events)e.addEventListener(d,h);e.addEventListener(ge,h);let b=A(()=>{c.set(e,ae(m))});return()=>{b();for(let d of c.events)e.removeEventListener(d,h);e.removeEventListener(ge,h)}}});p({name:"class",requirement:{value:"must"},returnsValue:!0,apply({key:e,el:t,mods:n,rx:r}){e&&=P(e,n,"kebab");let s,i=()=>{o.disconnect(),s=e?{[e]:r()}:r();for(let l in s){let c=l.split(/\s+/).filter(u=>u.length>0);if(s[l])for(let u of c)t.classList.contains(u)||t.classList.add(u);else for(let u of c)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 l in s){let c=l.split(/\s+/).filter(u=>u.length>0);for(let u of c)t.classList.remove(u)}}}});p({name:"computed",requirement:{value:"must"},returnsValue:!0,apply({key:e,mods:t,rx:n,error:r}){if(e)S([[P(e,t),_e(n)]]);else{let s=Object.assign({},n());ne(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?P(t,n):r,i=0;S([[s,!1]]);let o=a=>{let{type:l,el:c}=a.detail;if(c===e)switch(l){case it:i++,S([[s,!0]]);break;case ot:i=Math.max(0,i-1),S([[s,i>0]]);break}};return document.addEventListener(U,o),()=>{i=0,S([[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},ie=(e,t,n=!1)=>e?e.has(t.toLowerCase()):n,jt=(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)},Bt=(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))}},ue=(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=ie(r,"leading",!1),a=!ie(r,"notrailing",!1);e=Bt(e,i,o,a,!0)}let s=t.get("throttle");if(s){let i=Y(s),o=!ie(s,"noleading",!1),a=ie(s,"trailing",!1);e=Bt(e,i,o,a)}return e};var lt=!!document.startViewTransition,X=(e,t)=>{if(t.has("viewtransition")&<){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(),e(),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=le(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=c=>{x(),r(c),N()};i=X(i,n),i=ue(i,n);let o=P(t,n,"kebab"),a={capture:n.has("capture"),passive:n.has("passive"),once:n.has("once")};if(n.has("outside")){s=document;let c=i;i=u=>{e.contains(u?.target)||c(u)}}(o===U||o===te)&&(s=document);let l=c=>{c&&(n.has("prevent")&&c.preventDefault(),n.has("stop")&&c.stopPropagation(),e instanceof HTMLFormElement&&o==="submit"&&c.preventDefault()),i(c)};return s.addEventListener(o,l,a),()=>{s.removeEventListener(o,l,a)}}});var Wt=(e,t,n)=>Math.max(t,Math.min(n,e));var ut=new WeakSet;p({name:"on-intersect",requirement:{key:"denied",value:"must"},apply({el:e,mods:t,rx:n}){let r=()=>{x(),n(),N()};r=X(r,t),r=ue(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=Wt(Number(jt(a)),0,100)/100)}let i=t.has("exit"),o=new IntersectionObserver(a=>{for(let l of a)l.isIntersecting!==i&&(r(),o&&ut.has(e)&&o.disconnect())},s);return o.observe(e),t.has("once")&&ut.add(e),()=>{t.has("once")||ut.delete(e),o&&(o.disconnect(),o=null)}}});p({name:"on-interval",requirement:{key:"denied",value:"must"},apply({mods:e,rx:t}){let n=()=>{x(),t(),N()};n=X(n,e);let r=1e3,s=e.get("duration");s&&(r=Y(s),ie(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=le(o));let l=!1,c=ue(u=>{if(l)return;let f=q(a,u.detail);if(!yt(f)){l=!0,x();try{r(f)}finally{N(),l=!1}}},n);return document.addEventListener(te,c),()=>{document.removeEventListener(te,c)}}});p({name:"ref",requirement:"exclusive",apply({el:e,key:t,mods:n,value:r}){let s=t!=null?P(t,n):r;S([[s,e]])}});var Ut="none",Jt="display";p({name:"show",requirement:{key:"denied",value:"must"},returnsValue:!0,apply({el:e,rx:t}){let n=()=>{r.disconnect(),t()?e.style.display===Ut&&e.style.removeProperty(Jt):e.style.setProperty(Jt,Ut),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=P(e,t);let s=n?.();S([[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=(c,u)=>{let f=s.get(c);!u&&u!==0?f!==void 0&&(f?r.setProperty(c,f):r.removeProperty(c)):(f===void 0&&s.set(c,r.getPropertyValue(c)),r.setProperty(c,String(u)))},o=()=>{if(a.disconnect(),e)i(e,n());else{let c=n();for(let[u,f]of s)u in c||(f?r.setProperty(u,f):r.removeProperty(u));for(let u in c)i(ce(u),c[u])}a.observe(t,{attributeFilter:["style"]})},a=new MutationObserver(o),l=A(o);return()=>{a.disconnect(),l();for(let[c,u]of s)u?r.setProperty(c,u):r.removeProperty(c)}}});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 Kt=(e,t)=>e.includes(t),Cn=["remove","outer","inner","replace","prepend","append","before","after"],Fn=["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:"",o=t.elements;if(!Kt(Cn,r))throw e.error("PatchElementsInvalidMode",{mode:r});if(!n&&r!=="outer"&&r!=="replace")throw e.error("PatchElementsExpectedSelector");if(!Kt(Fn,s))throw e.error("PatchElementsInvalidNamespace",{namespace:s});let a={selector:n,mode:r,namespace:s,useViewTransition:i.trim()==="true",elements:o};lt&&a.useViewTransition?document.startViewTransition(()=>zt(e,a)):zt(e,a)}});var zt=({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,""),l=/<\/html>/.test(a),c=/<\/head>/.test(a),u=/<\/body>/.test(a),f=r==="svg"?"svg":r==="mathml"?"math":"",m=f?`<${f}>${s}`:s,h=new DOMParser().parseFromString(l||c||u?s:``,"text/html");if(l)i.appendChild(h.documentElement);else if(c&&u)i.appendChild(h.head),i.appendChild(h.body);else if(c)i.appendChild(h.head);else if(u)i.appendChild(h.body);else if(f){let b=h.querySelector("template").content.querySelector(f);for(let d of b.childNodes)i.appendChild(d)}else i=h.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 l of a){let c;if(l instanceof HTMLHtmlElement)c=document.documentElement;else if(l instanceof HTMLBodyElement)c=document.body;else if(l instanceof HTMLHeadElement)c=document.head;else if(c=document.getElementById(l.id),!c){console.warn(e("PatchElementsNoTargetsFound"),{element:{id:l.id}});continue}Qt(n,l,[c],!0)}}else{let a=document.querySelectorAll(t);if(!a.length){console.warn(e("PatchElementsNoTargetsFound"),{selector:t});return}let l=o&&n!=="remove"?[a[0]]:a;l.length===1&&(o=!0),Qt(n,i,l,o)}},dt=new WeakSet;for(let e of document.querySelectorAll("script"))dt.add(e);var tn=e=>{let t=e instanceof HTMLScriptElement?[e]:e.querySelectorAll("script");for(let n of t)if(!dt.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),dt.add(r)}},Zt=(e,t,n,r)=>{let s=!1;for(let i of e){if(r&&s)break;let o=r?t:t.cloneNode(!0);tn(o),i[n](o),s=!0}},Qt=(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);_n(i,o,e),tn(i);let a=i.closest("[data-scope-children]");a&&a.dispatchEvent(new CustomEvent(Je,{bubbles:!1})),s=!0}}break;case"replace":Zt(n,t,"replaceWith",r);break;case"prepend":case"append":case"before":case"after":Zt(n,t,e,r)}},V=new Map,de=new Set,fe=new Map,Ae=new Set,Ve=document.createElement("div");Ve.hidden=!0;var Re=K("ignore-morph"),Hn=`[${Re}]`,_n=(e,t,n="outer")=>{if(Q(e)&&Q(t)&&e.hasAttribute(Re)&&t.hasAttribute(Re)||e.parentElement?.closest(Hn))return;let r=document.createElement("div");r.append(t),document.body.insertAdjacentElement("afterend",Ve);let s=e.querySelectorAll("[id]");for(let{id:a,tagName:l}of s)fe.has(a)?Ae.add(a):fe.set(a,l);e instanceof Element&&e.id&&(fe.has(e.id)?Ae.add(e.id):fe.set(e.id,e.tagName)),de.clear();let i=r.querySelectorAll("[id]");for(let{id:a,tagName:l}of i)de.has(a)?Ae.add(a):fe.get(a)===l&&de.add(a);for(let a of Ae)de.delete(a);fe.clear(),Ae.clear(),V.clear();let o=n==="outer"?e.parentElement:e;en(o,s),en(r,i),nn(o,r,n==="outer"?e:null,e.nextSibling),Ve.remove()},nn=(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=kn(s,n,r);if(i){if(i!==n){let o=n;for(;o&&o!==i;){let a=o;o=o.nextSibling,Xt(a)}}ft(i,s),n=i.nextSibling;continue}}if(s instanceof Element&&de.has(s.id)){let i=document.getElementById(s.id),o=i;for(;o=o.parentNode;){let a=V.get(o);a&&(a.delete(s.id),a.size||V.delete(o))}rn(e,i,n),ft(i,s),n=i.nextSibling;continue}if(V.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),ft(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,Xt(s)}},kn=(e,t,n)=>{let r=null,s=e.nextSibling,i=0,o=0,a=V.get(e)?.size||0,l=t;for(;l&&l!==n;){if(Yt(l,e)){let c=!1,u=V.get(l),f=V.get(e);if(f&&u){for(let m of u)if(f.has(m)){c=!0;break}}if(c)return l;if(!r&&!V.has(l)){if(!a)return l;r=l}}if(o+=V.get(l)?.size||0,o>a)break;r===null&&s&&Yt(l,s)&&(i++,s=s.nextSibling,i>=2&&(r=void 0)),l=l.nextSibling}return r||null},Yt=(e,t)=>e.nodeType===t.nodeType&&e.tagName===t.tagName&&(!e.id||e.id===t.id),Xt=e=>{V.has(e)?rn(Ve,e,null):e.parentNode?.removeChild(e)},rn=(e,t,n)=>{if("moveBefore"in e){e.moveBefore(t,n);return}e.insertBefore(t,n)},Dn=K("preserve-attr"),ft=(e,t)=>{let n=t.nodeType;if(n===1){let r=e,s=t,i=r.hasAttribute("data-scope-children");if(r.hasAttribute(Re)&&s.hasAttribute(Re))return e;let o=(t.getAttribute(Dn)??"").split(" "),a=(c,u,f)=>{let m=u.hasAttribute(f);return c.hasAttribute(f)!==m&&!o.includes(f)?(c[f]=m,!0):!1},l=!1;if(r instanceof HTMLInputElement&&s instanceof HTMLInputElement&&s.type!=="file"){let c=s.getAttribute("value");r.getAttribute("value")!==c&&!o.includes("value")&&(r.value=c??"",l=!0),l=a(r,s,"checked")||l,a(r,s,"disabled")}else if(r instanceof HTMLTextAreaElement&&s instanceof HTMLTextAreaElement){let c=s.value;r.defaultValue!==c&&(r.value=c,l=!0)}else r instanceof HTMLOptionElement&&s instanceof HTMLOptionElement&&(l=a(r,s,"selected")||l);for(let{name:c,value:u}of s.attributes)r.getAttribute(c)!==u&&!o.includes(c)&&r.setAttribute(c,u);for(let{name:c}of Array.from(r.attributes))!s.hasAttribute(c)&&!o.includes(c)&&r.removeAttribute(c);l&&(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)||nn(r,s),i&&r.dispatchEvent(new CustomEvent(Je,{bubbles:!1}))}return(n===8||n===3)&&e.nodeValue!==t.nodeValue&&(e.nodeValue=t.nodeValue),e},en=(e,t)=>{for(let n of t)if(de.has(n.id)){let r=n;for(;r&&r!==e;){let s=V.get(r);s||(s=new Set,V.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(le(t),{ifMissing:r})}});export{I as action,_t as actions,p as attribute,x as beginBatch,_e as computed,A as effect,N as endBatch,q as filtered,ae as getPath,D as mergePatch,S as mergePaths,re as root,he as signal,_ as startPeeking,k as stopPeeking,Se as watcher}; +var gt=/🖕JS_DS🚀/.source,Ue=gt.slice(0,5),Je=gt.slice(4),j="datastar-fetch",ge="datastar-prop-change",ht="datastar-ready",Ke="datastar-scope-children",ee="datastar-signal-patch";var L=Object.hasOwn??Object.prototype.hasOwnProperty.call;var J=e=>e!==null&&typeof e=="object"&&(Object.getPrototypeOf(e)===Object.prototype||Object.getPrototypeOf(e)===null),yt=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];J(r)||Array.isArray(r)?te(r,t):e[n]=t(r)}},Le=e=>{let t={};for(let[n,r]of e){let s=n.split("."),i=s.pop(),o=s.reduce((a,l)=>a[l]??={},t);o[i]=r}return t};var xe=[],ze=[],He=0,Ne=0,Ze=0,Qe,B,Pe=0,x=()=>{He++},N=()=>{--He||(Et(),K())},H=e=>{Qe=B,B=e},_=()=>{B=Qe,Qe=void 0},he=e=>an.bind(0,{previousValue:e,t:e,e:1}),Ye=Symbol("computed"),_e=e=>{let t=cn.bind(0,{e:17,getter:e});return t[Ye]=1,t},w=e=>{let t={d:e,e:2};B&&et(t,B),H(t),x();try{t.d()}finally{N(),_()}return Rt.bind(0,t)},Et=()=>{for(;Ne"getter"in e?St(e):Tt(e,e.t),St=e=>{H(e),wt(e);try{let t=e.t;return t!==(e.t=e.getter(t))}finally{_(),Mt(e)}},Tt=(e,t)=>(e.e=1,e.previousValue!==(e.previousValue=t)),Xe=e=>{let t=e.e;if(!(t&64)){e.e=t|64;let n=e.r;n?Xe(n.o):ze[Ze++]=e}},At=(e,t)=>{if(t&16||t&32&&Lt(e.s,e)){H(e),wt(e),x();try{e.d()}finally{N(),_(),Mt(e)}return}t&32&&(e.e=t&-33);let n=e.s;for(;n;){let r=n.c,s=r.e;s&64&&At(r,r.e=s&-65),n=n.i}},an=(e,...t)=>{if(t.length){if(e.t!==(e.t=t[0])){e.e=17;let r=e.r;return r&&(ln(r),He||Et()),!0}return!1}let n=e.t;if(e.e&16&&Tt(e,n)){let r=e.r;r&&Fe(r)}return B&&et(e,B),n},cn=e=>{let t=e.e;if(t&16||t&32&&Lt(e.s,e)){if(St(e)){let n=e.r;n&&Fe(n)}}else t&32&&(e.e=t&-33);return B&&et(e,B),e.t},Rt=e=>{let t=e.s;for(;t;)t=Ce(t,e);let n=e.r;n&&Ce(n),e.e=0},et=(e,t)=>{let n=t.a;if(n&&n.c===e)return;let r=n?n.i:t.s;if(r&&r.c===e){r.p=Pe,t.a=r;return}let s=e.m;if(s&&s.p===Pe&&s.o===t)return;let i=t.a=e.m={p:Pe,c:e,o:t,l:n,i:r,u:s};r&&(r.l=i),n?n.i=i:t.s=i,s?s.n=i:e.r=i},Ce=(e,t=e.o)=>{let n=e.c,r=e.l,s=e.i,i=e.n,o=e.u;if(s?s.l=r:t.a=r,r?r.i=s:t.s=s,i?i.u=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=Ce(a,n);while(a)}}else"previousValue"in n||Rt(n);return s},ln=e=>{let t=e.n,n;e:for(;;){let r=e.o,s=r.e;if(s&60?s&12?s&4?!(s&48)&&un(e,r)?(r.e=s|40,s&=1):s=0:r.e=s&-9|32:s=0:r.e=s|32,s&2&&Xe(r),s&1){let i=r.r;if(i){let o=(e=i).n;o&&(n={t,f:n},t=o);continue}}if(e=t){t=e.n;continue}for(;n;)if(e=n.t,n=n.f,e){t=e.n;continue e}break}},wt=e=>{Pe++,e.a=void 0,e.e=e.e&-57|4},Mt=e=>{let t=e.a,n=t?t.i:e.s;for(;n;)n=Ce(n,e);e.e&=-5},Lt=(e,t)=>{let n,r=0,s=!1;e:for(;;){let i=e.c,o=i.e;if(t.e&16)s=!0;else if((o&17)===17){if(vt(i)){let a=i.r;a.n&&Fe(a),s=!0}}else if((o&33)===33){(e.n||e.u)&&(n={t:e,f: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,l=a.n;if(l?(e=n.t,n=n.f):e=a,s){if(vt(t)){l&&Fe(a),t=e.o;continue}s=!1}else t.e&=-33;if(t=e.o,e.i){e=e.i;continue e}}return s}},Fe=e=>{do{let t=e.o,n=t.e;(n&48)===32&&(t.e=n|16,n&2&&Xe(t))}while(e=e.n)},un=(e,t)=>{let n=t.a;for(;n;){if(n===e)return!0;n=n.l}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},Oe=(e,t="")=>{let n=Array.isArray(e);if(n||J(e)){let r=n?[]:{};for(let i in e)r[i]=he(Oe(e[i],`${t+i}.`));let s=he(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]=he(""),K(t+o,""),s(s()+1)),r[o]())},set(i,o,a){let l=t+o;if(n&&o==="length"){let c=r[o]-a;if(r[o]=a,c>0){let u={};for(let f=a;f{if(e!==void 0&&t!==void 0&&xe.push([e,t]),!He&&xe.length){let n=Le(xe);xe.length=0,document.dispatchEvent(new CustomEvent(ee,{detail:n}))}},k=(e,{ifMissing:t}={})=>{x();for(let n in e)e[n]==null?t||delete ne[n]:xt(e[n],n,ne,"",t);N()},R=(e,t)=>k(Le(e),t),xt=(e,t,n,r,s)=>{if(J(e)){L(n,t)&&(J(n[t])||Array.isArray(n[t]))||(n[t]={});for(let i in e)e[i]==null?s||delete n[t][i]:xt(e[i],i,n[t],`${r+t}.`,s)}else s&&L(n,t)||(n[t]=e)},bt=e=>typeof e=="string"?RegExp(e.replace(/^\/|\/$/g,"")):e,V=({include:e=/.*/,exclude:t=/(?!)/}={},n=ne)=>{let r=bt(e),s=bt(t),i=[],o=[[n,""]];for(;o.length;){let[a,l]=o.pop();for(let c in a){let u=l+c;J(a[c])?o.push([a[c],`${u}.`]):r.test(u)&&!s.test(u)&&i.push([u,oe(u)])}}return Le(i)},ne=Oe({});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(),Nt=e=>ae(e).replace(/-./g,t=>t[1].toUpperCase()),Pt=e=>ae(e).replace(/-/g,"_");var fn=/^(?:(?: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(!fn.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})`)()}},Ot={camel:e=>e.replace(/-[a-z]/g,t=>t[1].toUpperCase()),snake:e=>e.replace(/-/g,"_"),pascal:e=>e[0].toUpperCase()+Ot.camel(e.slice(1))},P=(e,t,n="camel")=>{for(let r of t.get("case")||[n])e=Ot[r]?.(e)||e;return e},W=e=>`data-${e}`,tt=e=>e;var dn="https://data-star.dev/errors",ye=(e,t,n={})=>{Object.assign(n,e);let r=new Error,s=Pt(t),i=new URLSearchParams({metadata:JSON.stringify(n)}).toString(),o=JSON.stringify(n,null,2);return r.message=`${t} +More info: ${dn}/${s}?${i} +Context: ${o}`,r},ve=new Map,nt=new Map,Ht=new Map,_t=new Proxy({},{get:(e,t)=>ve.get(t)?.apply,has:(e,t)=>ve.has(t),ownKeys:()=>Reflect.ownKeys(ve),set:()=>!1,deleteProperty:()=>!1}),Ee=new Map,ke=[],rt=new Set,be=new Set,Ct=!1,p=e=>{ke.push(e),ke.length===1&&setTimeout(()=>{for(let n of ke)rt.add(n.name),nt.set(n.name,n);ke.length=0;let t=be.size?[...be]:[document.documentElement];for(let n of t)bn(n,!be.has(n));rt.clear()})},D=e=>{ve.set(e.name,e)};document.addEventListener(j,e=>{let t=Ht.get(e.detail.type);t&&t.apply({error:ye.bind(0,{plugin:{type:"watcher",name:t.name},element:{id:e.target.id,tag:e.target.tagName}})},e.detail.argsRaw)});var Se=e=>{Ht.set(e.name,e)},Ft=e=>{for(let t of e){let n=Ee.get(t);if(n&&Ee.delete(t))for(let r of n.values())for(let s of r.values())s()}},kt=W("ignore"),pn=`[${kt}]`,Dt=e=>e.hasAttribute(`${kt}__self`)||!!e.closest(pn),De=(e,t)=>{for(let n of e)if(!Dt(n)){let r=new Set;for(let s in n.dataset){let i=s.replace(/[A-Z]/g,"-$&").toLowerCase();r.add(i),st(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)||st(n,i,s.value,t)}}},mn=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)&&(Ft([o]),Ft(o.querySelectorAll("*")));for(let o of s)z(o)&&(De([o]),De(o.querySelectorAll("*")))}else if(n==="attributes"&&r.startsWith("data-")&&z(t)&&!Dt(t)){let o=r.slice(5),a=tt(o);if(!a)continue;let l=t.getAttribute(r);if(l===null){let c=Ee.get(t);if(c){let u=c.get(a);if(u){for(let f of u.values())f();c.delete(a)}}}else st(t,o,l)}},gn=new MutationObserver(mn),hn=e=>{let[t,...n]=e.split("__"),[r,s]=t.split(/:(.+)/),i=new Map;for(let o of n){let[a,...l]=o.split(".");i.set(a,new Set(l))}return{pluginName:r,key:s,mods:i}},yn=()=>be.has(document.documentElement),vn=()=>{Ct||!yn()||(Ct=!0,document.dispatchEvent(new Event(ht)))},bn=(e=document.documentElement,t=!0)=>{z(e)&&De([e],!0),De(e.querySelectorAll("*"),!0),t&&(gn.observe(e,{subtree:!0,childList:!0,attributes:!0}),be.add(e),vn())};var st=(e,t,n,r)=>{let s=tt(t);if(!s)return;let{pluginName:i,key:o,mods:a}=hn(s),l=nt.get(i);if((!r||rt.has(i))&&!!l){let u={el:e,rawKey:s,mods:a,error:ye.bind(0,{plugin:{type:"attribute",name:l.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(nt.keys())},rx:void 0},f=l.requirement&&(typeof l.requirement=="string"?l.requirement:l.requirement.key)||"allowed",m=l.requirement&&(typeof l.requirement=="string"?l.requirement:l.requirement.value)||"allowed",h=o!=null&&o!=="",v=n!=null&&n!=="";if(h){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(h&&v)throw u.error("KeyAndValueProvided");if(!h&&!v)throw u.error("KeyOrValueRequired")}let d=new Map;if(v){let y;u.rx=(...$)=>(y||(y=En(n,{returnsValue:l.returnsValue,argNames:l.argNames,cleanups:d})),y(e,...$))}let g=l.apply(u);g&&d.set("attribute",g);let E=Ee.get(e);if(E){let y=E.get(s);if(y)for(let $ of y.values())$()}else E=new Map,Ee.set(e,E);E.set(s,d)}},En=(e,{returnsValue:t=!1,argNames:n=[],cleanups:r=new Map}={})=>{let s="";if(t){let l=/(\/(\\\/|[^/])*\/|"(\\"|[^"])*"|'(\\'|[^'])*'|`(\\`|[^`])*`|\(\s*((function)\s*\(\s*\)|(\(\s*\))\s*=>)\s*(?:\{[\s\S]*?\}|[^;){]*)\s*\)\s*\(\s*\)|[^;])+/gm,c=e.trim().match(l);if(c){let u=c.length-1,f=c[u].trim();f.startsWith("return")||(c[u]=`return (${f});`),s=c.join(`; +`)}}else s=e.trim();let i=new Map,o=RegExp(`(?:${Ue})(.*?)(?:${Je})`,"gm"),a=0;for(let l of s.matchAll(o)){let c=l[1],u=`__escaped${a++}`;i.set(u,c),s=s.replace(Ue+c+Je,u)}s=s.replace(/("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|`(?:\\.|[^`\\$]|\$(?!\{))*`)|\$\{([^{}]*)\}|\$([a-zA-Z_\d]\w*(?:[.-]\w+)*)/g,(l,c,u,f)=>c?l:u!==void 0?`\${${u.replace(/\$([a-zA-Z_\d]\w*(?:[.-]\w+)*)/g,(m,h)=>h.split(".").reduce((v,d)=>`${v}['${d}']`,"$"))}}`:f.split(".").reduce((m,h)=>`${m}['${h}']`,"$")),s=s.replaceAll(/@([A-Za-z_$][\w$]*)\(/g,'__action("$1",evt,');for(let[l,c]of i)s=s.replace(l,c);try{let l=Function("el","$","__action","evt",...n,s);return(c,...u)=>{let f=(m,h,...v)=>{let d=ye.bind(0,{plugin:{type:"action",name:m},element:{id:c.id,tag:c.tagName},expression:{fnContent:s,value:e}}),g=_t[m];if(g)return g({el:c,evt:h,error:d,cleanups:r},...v);throw d("UndefinedAction")};try{return l(c,ne,f,void 0,...u)}catch(m){throw console.error(m),ye({element:{id:c.id,tag:c.tagName},expression:{fnContent:s,value:e},error:m.message},"ExecuteExpression")}}}catch(l){throw console.error(l),ye({expression:{fnContent:s,value:e},error:l.message},"GenerateExpression")}};D({name:"peek",apply(e,t){H();try{return t()}finally{_()}}});D({name:"setAll",apply(e,t,n){H();let r=V(n);te(r,()=>t),k(r),_()}});D({name:"toggleAll",apply(e,t){H();let n=V(t);te(n,r=>!r),k(n),_()}});var It=new WeakMap,it=e=>!["GET","DELETE"].includes(e),Te=(e,t,n=!0)=>D({name:e,apply:async({el:r,evt:s,error:i,cleanups:o},a,{selector:l,headers:c,contentType:u="json",filterSignals:{include:f=/.*/,exclude:m=/(^|\.)_/}={},openWhenHidden:h=n,payload:v,requestCancellation:d="auto",retry:g="auto",retryInterval:E=1e3,retryScaler:y=2,retryMaxWait:$=3e4,retryMaxCount:O=10}={})=>{let C=d instanceof AbortController?d:new AbortController;(d==="auto"||d==="cleanup")&&(It.get(r)?.abort(),It.set(r,C)),d==="cleanup"&&(o.get(`@${e}`)?.(),o.set(`@${e}`,async()=>{C.abort(),await Promise.resolve()}));let de=()=>{};try{if(!a?.length)throw i("FetchNoUrlProvided",{action:D});let ie={Accept:"text/event-stream, text/html, application/json","Datastar-Request":!0};u==="json"&&it(t)&&(ie["Content-Type"]="application/json");let q=Object.assign({},ie,c),Y={input:"",method:t,headers:q,openWhenHidden:h,retry:g,retryInterval:E,retryScaler:y,retryMaxWait:$,retryMaxCount:O,signal:C.signal,onopen:async b=>{b.status>=400&&(console.error(`Datastar failed to reach ${b.url}`),re(Sn,r,{status:b.status.toString()}))},onmessage:b=>{if(!b.event.startsWith("datastar"))return;let U=b.event,T={};for(let S of b.data.split(` +`)){let A=S.indexOf(" "),X=S.slice(0,A),M=S.slice(A+1);(T[X]||=[]).push(M)}let F=Object.fromEntries(Object.entries(T).map(([S,A])=>[S,A.join(` +`)]));re(U,r,F)},onerror:b=>{if(Vt(b))throw b("FetchExpectedTextEventStream",{url:a})}},qe=()=>{let b=new URL(a,document.baseURI),U=new URLSearchParams(b.search);if(u==="json"){H();let T=v!==void 0?v:V({include:f,exclude:m});_();let F=JSON.stringify(T);it(t)?Y.body=F:U.set("datastar",F)}else if(u==="form"){let T=l?document.querySelector(l):r.closest("form");if(!T)throw i("FetchFormNotFound",{action:D,selector:l});if(!T.noValidate&&!T.checkValidity()){T.reportValidity();return}let F=new FormData(T),S=r;if(r===T&&s instanceof SubmitEvent)S=s.submitter;else{let M=pe=>pe.preventDefault();T.addEventListener("submit",M),de=()=>{T.removeEventListener("submit",M)}}if(S instanceof HTMLButtonElement||S instanceof HTMLInputElement&&S.type==="submit"){let M=S.getAttribute("name");M&&F.append(M,S.value)}let A=T.getAttribute("enctype")==="multipart/form-data";A||(q["Content-Type"]="application/x-www-form-urlencoded");let X=new URLSearchParams(F);if(it(t))A?Y.body=F:Y.body=X;else for(let[M,pe]of X)U.append(M,pe)}else throw i("FetchInvalidContentType",{action:D,contentType:u});return b.search=U.toString(),Y.input=b.toString(),Y};re(ot,r,{});try{await xn(r,qe)}catch(b){if(!Vt(b))throw i("FetchFailed",{method:t,url:a,error:b.message})}}finally{re(at,r,{}),de(),o.delete(`@${e}`)}}});Te("get","GET",!1);Te("patch","PATCH");Te("post","POST");Te("put","PUT");Te("delete","DELETE");var ot="started",at="finished",Sn="error",Tn="retrying",An="retries-failed",re=(e,t,n)=>document.dispatchEvent(new CustomEvent(j,{detail:{type:e,el:t,argsRaw:n}})),Vt=e=>`${e}`.includes("text/event-stream"),Rn=async(e,t)=>{let n=e.getReader(),r=await n.read();for(;!r.done;)t(r.value),r=await n.read()},wn=e=>{let t,n,r,s=!1;return i=>{t?t=Ln(t,i):(t=i,n=0,r=-1);let o=t.length,a=0;for(;n{let r=$t(),s=new TextDecoder;return(i,o)=>{if(!i.length)n?.(r),r=$t();else if(o>0){let a=s.decode(i.subarray(0,o)),l=o+(i[o+1]===32?2:1),c=s.decode(i.subarray(l));switch(a){case"data":r.data=r.data?`${r.data} +${c}`:c;break;case"event":r.event=c;break;case"id":e(r.id=c);break;case"retry":{let u=+c;Number.isNaN(u)||t(r.retry=u);break}}}}},Ln=(e,t)=>{let n=new Uint8Array(e.length+t.length);return n.set(e),n.set(t,e.length),n},$t=()=>({data:"",event:"",id:"",retry:void 0}),xn=(e,t)=>new Promise((n,r)=>{let s=t();if(!s)return;let{input:i,signal:o,headers:a,onopen:l,onmessage:c,onclose:u,openWhenHidden:f,fetch:m,retry:h="auto",retryInterval:v=1e3,retryScaler:d=2,retryMaxWait:g=3e4,retryMaxCount:E=10,responseOverrides:y,...$}=s,O={...a},C,de=()=>{if(C.abort(),!document.hidden){let S=t();if(!S)return;i=S.input,$.body=S.body,F()}};f||document.addEventListener("visibilitychange",de);let ie,q=()=>{document.removeEventListener("visibilitychange",de),clearTimeout(ie),C.abort()};o?.addEventListener("abort",()=>{q(),n()});let Y=m||window.fetch,qe=l||(()=>{}),b=0,U=v,T=()=>{b{C=new AbortController;let S=C.signal;try{let A=await Y(i,{...$,headers:O,signal:S});await qe(A);let X=async(G,me,je,we,...on)=>{let mt={[je]:await me.text()};for(let Be of on){let We=me.headers.get(`datastar-${ae(Be)}`);if(we){let Me=we[Be];Me&&(We=typeof Me=="string"?Me:JSON.stringify(Me))}We&&(mt[Be]=We)}re(G,e,mt),q(),n()},M=A.status,pe=M===204,pt=M>=300&&M<400,sn=M>=400&&M<600;if(M!==200){if(u?.(),h!=="never"&&!pe&&!pt&&(h==="always"||h==="error"&&sn)){T();return}q(),n();return}b=0,v=U;let Ge=A.headers.get("Content-Type");if(Ge?.includes("text/html"))return await X("datastar-patch-elements",A,"elements",y,"selector","mode","namespace","useViewTransition");if(Ge?.includes("application/json"))return await X("datastar-patch-signals",A,"signals",y,"onlyIfMissing");if(Ge?.includes("text/javascript")){let G=document.createElement("script"),me=A.headers.get("datastar-script-attributes");if(me)for(let[je,we]of Object.entries(JSON.parse(me)))G.setAttribute(je,we);G.textContent=await A.text(),document.head.appendChild(G),q();return}if(await Rn(A.body,wn(Mn(G=>{G?O["last-event-id"]=G:delete O["last-event-id"]},G=>{U=v=G},c))),u?.(),h==="always"&&!pt){T();return}q(),n()}catch{if(!S.aborted)try{T()}catch(A){q(),r(A)}}};F()});p({name:"attr",requirement:{value:"must"},returnsValue:!0,apply({el:e,key:t,rx:n}){let r=(a,l)=>{l===""||l===!0?e.setAttribute(a,""):l===!1||l==null?e.removeAttribute(a):typeof l=="string"?e.setAttribute(a,l):typeof l=="function"?e.setAttribute(a,l.toString()):e.setAttribute(a,JSON.stringify(l,(c,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(),l=Object.keys(a);for(let c of l)r(c,a[c]);i.observe(e,{attributeFilter:l})},i=new MutationObserver(s),o=w(s);return()=>{i.disconnect(),o()}}});var Ie=(e,...t)=>({get:n=>n[e],set:(n,r)=>{n[e]=r},events:t}),qt=(e,...t)=>({get:n=>n.getAttribute(e),set:(n,r)=>{n.setAttribute(e,`${r}`)},events:t}),ct=(e=!1,...t)=>({get:(n,r)=>r==="string"||e&&r==="undefined"?n.value:+n.value,set:(n,r)=>{n.value=`${r}`},events:t}),Nn=/^data:(?[^;]+);base64,(?.*)$/,Gt=Symbol("empty"),Pn=(e,t,n,r,s,i)=>{let o=W(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&&R([[r,f.value]],{ifMissing:!0})}if(!Array.isArray(i)||e instanceof HTMLSelectElement&&e.multiple)return R([[r,s.get(e,typeof i)]],{ifMissing:!0}),r;let l=document.querySelectorAll(a),c=[],u=0;for(let f of l){if(c.push([`${r}.${u}`,s.get(f,typeof(L(i,u)?i[u]:void 0))]),e===f)break;u++}return R(c,{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?P(t,r):s,a=r.get("prop"),l=r.get("event"),c=null;if(e instanceof HTMLInputElement)switch(e.type){case"range":case"number":c=ct(!1,"input");break;case"checkbox":c={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),c={get:(d,g)=>d.checked?g==="number"?+d.value:d.value:Gt,set:(d,g)=>{d.checked=g===(typeof g=="number"?+d.value:d.value)},events:["input"]};break;case"file":{let d=()=>{let g=[...e.files||[]],E=[];Promise.all(g.map(y=>new Promise($=>{let O=new FileReader;O.onload=()=>{if(typeof O.result!="string")throw i("InvalidFileResultType",{resultType:typeof O.result});let C=O.result.match(Nn);if(!C?.groups)throw i("InvalidDataUri",{result:O.result});E.push({name:y.name,contents:C.groups.contents,mime:C.groups.mime})},O.onloadend=()=>$(),O.readAsDataURL(y)}))).then(()=>{R([[o,E]])})};return e.addEventListener("change",d),()=>{e.removeEventListener("change",d)}}default:c=ct(!0,"input")}else if(e instanceof HTMLSelectElement&&e.multiple){let d=new Map;c={get:g=>[...g.selectedOptions].map(E=>{let y=d.get(E.value);return y==="string"||y==null?E.value:+E.value}),set:(g,E)=>{for(let y of g.options)E.includes(y.value)?(d.set(y.value,"string"),y.selected=!0):E.includes(+y.value)?(d.set(y.value,"number"),y.selected=!0):y.selected=!1},events:["change"]}}else e instanceof HTMLSelectElement?c=ct(!0,"change"):e instanceof HTMLTextAreaElement?c=Ie("value","input"):e instanceof HTMLElement&&e.tagName.includes("-")?c="value"in e?Ie("value","input","change"):qt("value","input","change"):e instanceof HTMLElement&&"value"in e?c=Ie("value","change"):c=qt("value","change");if(!c)throw i("InvalidBindAdapter");let u=a&&[...a][0];if(a&&!u)throw i("BindPropNameMissing");if(u){let d=Nt(u);c=Ie(d,...l?[...l]:c.events)}else l&&(c.events=[...l]);let f=oe(o),m=Pn(e,t,n,o,c,f),h=()=>{let d=oe(m);if(d!=null){let g=c.get(e,typeof d);g!==Gt&&R([[m,g]])}};for(let d of c.events)e.addEventListener(d,h);e.addEventListener(ge,h);let v=w(()=>{c.set(e,oe(m))});return()=>{v();for(let d of c.events)e.removeEventListener(d,h);e.removeEventListener(ge,h)}}});p({name:"class",requirement:{value:"must"},returnsValue:!0,apply({key:e,el:t,mods:n,rx:r}){e&&=P(e,n,"kebab");let s,i=()=>{o.disconnect(),s=e?{[e]:r()}:r();for(let l in s){let c=l.split(/\s+/).filter(u=>u.length>0);if(s[l])for(let u of c)t.classList.contains(u)||t.classList.add(u);else for(let u of c)t.classList.contains(u)&&t.classList.remove(u)}o.observe(t,{attributeFilter:["class"]})},o=new MutationObserver(i),a=w(i);return()=>{o.disconnect(),a();for(let l in s){let c=l.split(/\s+/).filter(u=>u.length>0);for(let u of c)t.classList.remove(u)}}}});p({name:"computed",requirement:{value:"must"},returnsValue:!0,apply({key:e,mods:t,rx:n,error:r}){if(e)R([[P(e,t),_e(n)]]);else{let s=Object.assign({},n());te(s,i=>{if(typeof i=="function")return _e(i);throw r("ComputedExpectedFunction")}),k(s)}}});p({name:"effect",requirement:{key:"denied",value:"must"},apply:({rx:e})=>w(e)});p({name:"indicator",requirement:"exclusive",apply({el:e,key:t,mods:n,value:r}){let s=t!=null?P(t,n):r,i=0;R([[s,!1]]);let o=a=>{let{type:l,el:c}=a.detail;if(c===e)switch(l){case ot:i++,R([[s,!0]]);break;case at:i=Math.max(0,i-1),R([[s,i>0]]);break}};return document.addEventListener(j,o),()=>{i=0,R([[s,!1]]),document.removeEventListener(j,o)}}});var Z=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,jt=(e,t="")=>{if(e&&e.size>0)for(let n of e)return n;return t};var lt=(e,t)=>(...n)=>{setTimeout(()=>{e(...n)},t)},Bt=(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=Z(n);e=lt(e,i)}let r=t.get("debounce");if(r){let i=Z(r),o=se(r,"leading",!1),a=!se(r,"notrailing",!1);e=Bt(e,i,o,a,!0)}let s=t.get("throttle");if(s){let i=Z(s),o=!se(s,"noleading",!1),a=se(s,"trailing",!1);e=Bt(e,i,o,a)}return e};var Ve=(e=document.documentElement)=>"startViewTransition"in e,Q=(e,t)=>{if(t.has("viewtransition")&&Ve()){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(),e(),N()};n=Q(n,t);let r=0,s=t.get("delay");s&&(r=Z(s),r>0&&(n=lt(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(V(s),null,r),o.observe(e,{childList:!0,characterData:!0,subtree:!0})},o=new MutationObserver(i),a=w(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=c=>{x(),r(c),N()};i=Q(i,n),i=le(i,n);let o=P(t,n,"kebab"),a={capture:n.has("capture"),passive:n.has("passive"),once:n.has("once")};if(n.has("outside")){s=document;let c=i;i=u=>{e.contains(u?.target)||c(u)}}(o===j||o===ee)&&(s=document);let l=c=>{c&&(n.has("prevent")&&c.preventDefault(),n.has("stop")&&c.stopPropagation(),e instanceof HTMLFormElement&&o==="submit"&&c.preventDefault()),i(c)};return s.addEventListener(o,l,a),()=>{s.removeEventListener(o,l,a)}}});var Wt=(e,t,n)=>Math.max(t,Math.min(n,e));var ut=new WeakSet;p({name:"on-intersect",requirement:{key:"denied",value:"must"},apply({el:e,mods:t,rx:n}){let r=()=>{x(),n(),N()};r=Q(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=Wt(Number(jt(a)),0,100)/100)}let i=t.has("exit"),o=new IntersectionObserver(a=>{for(let l of a)l.isIntersecting!==i&&(r(),o&&ut.has(e)&&o.disconnect())},s);return o.observe(e),t.has("once")&&ut.add(e),()=>{t.has("once")||ut.delete(e),o&&(o.disconnect(),o=null)}}});p({name:"on-interval",requirement:{key:"denied",value:"must"},apply({mods:e,rx:t}){let n=()=>{x(),t(),N()};n=Q(n,e);let r=1e3,s=e.get("duration");s&&(r=Z(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=W(`${this.name}-filter`),o=e.getAttribute(i),a={};o&&(a=ce(o));let l=!1,c=le(u=>{if(l)return;let f=V(a,u.detail);if(!yt(f)){l=!0,x();try{r(f)}finally{N(),l=!1}}},n);return document.addEventListener(ee,c),()=>{document.removeEventListener(ee,c)}}});p({name:"ref",requirement:"exclusive",apply({el:e,key:t,mods:n,value:r}){let s=t!=null?P(t,n):r;R([[s,e]])}});var Ut="none",Jt="display";p({name:"show",requirement:{key:"denied",value:"must"},returnsValue:!0,apply({el:e,rx:t}){let n=()=>{r.disconnect(),t()?e.style.display===Ut&&e.style.removeProperty(Jt):e.style.setProperty(Jt,Ut),r.observe(e,{attributeFilter:["style"]})},r=new MutationObserver(n),s=w(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=P(e,t);let s=n?.();R([[e,s]],{ifMissing:r})}else{let s=Object.assign({},n?.());k(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=(c,u)=>{let f=s.get(c);!u&&u!==0?f!==void 0&&(f?r.setProperty(c,f):r.removeProperty(c)):(f===void 0&&s.set(c,r.getPropertyValue(c)),r.setProperty(c,String(u)))},o=()=>{if(a.disconnect(),e)i(e,n());else{let c=n();for(let[u,f]of s)u in c||(f?r.setProperty(u,f):r.removeProperty(u));for(let u in c)i(ae(u),c[u])}a.observe(t,{attributeFilter:["style"]})},a=new MutationObserver(o),l=w(o);return()=>{a.disconnect(),l();for(let[c,u]of s)u?r.setProperty(c,u):r.removeProperty(c)}}});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=w(n);return()=>{r.disconnect(),s()}}});var Kt=(e,t)=>e.includes(t),On=["remove","outer","inner","replace","prepend","append","before","after"],Cn=["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(!Kt(On,r))throw e.error("PatchElementsInvalidMode",{mode:r});if(!n&&r!=="outer"&&r!=="replace")throw e.error("PatchElementsExpectedSelector");if(!Kt(Cn,s))throw e.error("PatchElementsInvalidNamespace",{namespace:s});let l={selector:n,mode:r,namespace:s,elements:a};if(i&&Ve()){let c=document.documentElement;if(o){let u=document.querySelector(o);u&&Ve(u)&&(c=u)}c.startViewTransition(()=>zt(e,l))}else zt(e,l)}});var zt=({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,""),l=/<\/html>/.test(a),c=/<\/head>/.test(a),u=/<\/body>/.test(a),f=r==="svg"?"svg":r==="mathml"?"math":"",m=f?`<${f}>${s}`:s,h=new DOMParser().parseFromString(l||c||u?s:``,"text/html");if(l)i.appendChild(h.documentElement);else if(c&&u)i.appendChild(h.head),i.appendChild(h.body);else if(c)i.appendChild(h.head);else if(u)i.appendChild(h.body);else if(f){let v=h.querySelector("template").content.querySelector(f);for(let d of v.childNodes)i.appendChild(d)}else i=h.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 l of a){let c;if(l instanceof HTMLHtmlElement)c=document.documentElement;else if(l instanceof HTMLBodyElement)c=document.body;else if(l instanceof HTMLHeadElement)c=document.head;else if(c=document.getElementById(l.id),!c){console.warn(e("PatchElementsNoTargetsFound"),{element:{id:l.id}});continue}Qt(n,l,[c],!0)}}else{let a=document.querySelectorAll(t);if(!a.length){console.warn(e("PatchElementsNoTargetsFound"),{selector:t});return}let l=o&&n!=="remove"?[a[0]]:a;l.length===1&&(o=!0),Qt(n,i,l,o)}},dt=new WeakSet;for(let e of document.querySelectorAll("script"))dt.add(e);var tn=e=>{let t=e instanceof HTMLScriptElement?[e]:e.querySelectorAll("script");for(let n of t)if(!dt.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),dt.add(r)}},Zt=(e,t,n,r)=>{let s=!1;for(let i of e){if(r&&s)break;let o=r?t:t.cloneNode(!0);tn(o),i[n](o),s=!0}},Qt=(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);Hn(i,o,e),tn(i);let a=i.closest("[data-scope-children]");a&&a.dispatchEvent(new CustomEvent(Ke,{bubbles:!1})),s=!0}}break;case"replace":Zt(n,t,"replaceWith",r);break;case"prepend":case"append":case"before":case"after":Zt(n,t,e,r)}},I=new Map,fe=new Set,ue=new Map,Ae=new Set,$e=document.createElement("div");$e.hidden=!0;var Re=W("ignore-morph"),Fn=`[${Re}]`,Hn=(e,t,n="outer")=>{if(z(e)&&z(t)&&e.hasAttribute(Re)&&t.hasAttribute(Re)||e.parentElement?.closest(Fn))return;let r=document.createElement("div");r.append(t),document.body.insertAdjacentElement("afterend",$e);let s=e.querySelectorAll("[id]");for(let{id:a,tagName:l}of s)ue.has(a)?Ae.add(a):ue.set(a,l);e instanceof Element&&e.id&&(ue.has(e.id)?Ae.add(e.id):ue.set(e.id,e.tagName)),fe.clear();let i=r.querySelectorAll("[id]");for(let{id:a,tagName:l}of i)fe.has(a)?Ae.add(a):ue.get(a)===l&&fe.add(a);for(let a of Ae)fe.delete(a);ue.clear(),Ae.clear(),I.clear();let o=n==="outer"?e.parentElement:e;en(o,s),en(r,i),nn(o,r,n==="outer"?e:null,e.nextSibling),$e.remove()},nn=(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=_n(s,n,r);if(i){if(i!==n){let o=n;for(;o&&o!==i;){let a=o;o=o.nextSibling,Xt(a)}}ft(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=I.get(o);a&&(a.delete(s.id),a.size||I.delete(o))}rn(e,i,n),ft(i,s),n=i.nextSibling;continue}if(I.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),ft(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,Xt(s)}},_n=(e,t,n)=>{let r=null,s=e.nextSibling,i=0,o=0,a=I.get(e)?.size||0,l=t;for(;l&&l!==n;){if(Yt(l,e)){let c=!1,u=I.get(l),f=I.get(e);if(f&&u){for(let m of u)if(f.has(m)){c=!0;break}}if(c)return l;if(!r&&!I.has(l)){if(!a)return l;r=l}}if(o+=I.get(l)?.size||0,o>a)break;r===null&&s&&Yt(l,s)&&(i++,s=s.nextSibling,i>=2&&(r=void 0)),l=l.nextSibling}return r||null},Yt=(e,t)=>e.nodeType===t.nodeType&&e.tagName===t.tagName&&(!e.id||e.id===t.id),Xt=e=>{I.has(e)?rn($e,e,null):e.parentNode?.removeChild(e)},rn=(e,t,n)=>{if("moveBefore"in e){e.moveBefore(t,n);return}e.insertBefore(t,n)},kn=W("preserve-attr"),ft=(e,t)=>{let n=t.nodeType;if(n===1){let r=e,s=t,i=r.hasAttribute("data-scope-children");if(r.hasAttribute(Re)&&s.hasAttribute(Re))return e;let o=(t.getAttribute(kn)??"").split(" "),a=(c,u,f)=>{let m=u.hasAttribute(f);return c.hasAttribute(f)!==m&&!o.includes(f)?(c[f]=m,!0):!1},l=!1;if(r instanceof HTMLInputElement&&s instanceof HTMLInputElement&&s.type!=="file"){let c=s.getAttribute("value");r.getAttribute("value")!==c&&!o.includes("value")&&(r.value=c??"",l=!0),l=a(r,s,"checked")||l,a(r,s,"disabled")}else if(r instanceof HTMLTextAreaElement&&s instanceof HTMLTextAreaElement){let c=s.value;r.defaultValue!==c&&(r.value=c,l=!0)}else r instanceof HTMLOptionElement&&s instanceof HTMLOptionElement&&(l=a(r,s,"selected")||l);for(let{name:c,value:u}of s.attributes)r.getAttribute(c)!==u&&!o.includes(c)&&r.setAttribute(c,u);for(let{name:c}of Array.from(r.attributes))!s.hasAttribute(c)&&!o.includes(c)&&r.removeAttribute(c);l&&(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)||nn(r,s),i&&r.dispatchEvent(new CustomEvent(Ke,{bubbles:!1}))}return(n===8||n===3)&&e.nodeValue!==t.nodeValue&&(e.nodeValue=t.nodeValue),e},en=(e,t)=>{for(let n of t)if(fe.has(n.id)){let r=n;for(;r&&r!==e;){let s=I.get(r);s||(s=new Set,I.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";k(ce(t),{ifMissing:r})}});export{D as action,_t as actions,p as attribute,x as beginBatch,_e as computed,w as effect,N as endBatch,V as filtered,oe as getPath,k as mergePatch,R as mergePaths,ne as root,he as signal,H as startPeeking,_ as stopPeeking,Se as watcher}; //# sourceMappingURL=datastar.js.map diff --git a/bundles/datastar.js.map b/bundles/datastar.js.map index 6f6997a0..9299e7b4 100644 --- a/bundles/datastar.js.map +++ b/bundles/datastar.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../library/src/engine/consts.ts", "../library/src/utils/polyfills.ts", "../library/src/utils/paths.ts", "../library/src/engine/signals.ts", "../library/src/utils/dom.ts", "../library/src/utils/text.ts", "../library/src/engine/engine.ts", "../library/src/plugins/actions/peek.ts", "../library/src/plugins/actions/setAll.ts", "../library/src/plugins/actions/toggleAll.ts", "../library/src/plugins/actions/fetch.ts", "../library/src/plugins/attributes/attr.ts", "../library/src/plugins/attributes/bind.ts", "../library/src/plugins/attributes/class.ts", "../library/src/plugins/attributes/computed.ts", "../library/src/plugins/attributes/effect.ts", "../library/src/plugins/attributes/indicator.ts", "../library/src/utils/tags.ts", "../library/src/utils/timing.ts", "../library/src/utils/view-transitions.ts", "../library/src/plugins/attributes/init.ts", "../library/src/plugins/attributes/jsonSignals.ts", "../library/src/plugins/attributes/on.ts", "../library/src/utils/math.ts", "../library/src/plugins/attributes/onIntersect.ts", "../library/src/plugins/attributes/onInterval.ts", "../library/src/plugins/attributes/onSignalPatch.ts", "../library/src/plugins/attributes/ref.ts", "../library/src/plugins/attributes/show.ts", "../library/src/plugins/attributes/signals.ts", "../library/src/plugins/attributes/style.ts", "../library/src/plugins/attributes/text.ts", "../library/src/plugins/watchers/patchElements.ts", "../library/src/plugins/watchers/patchSignals.ts"], - "sourcesContent": ["const lol = /\uD83D\uDD95JS_DS\uD83D\uDE80/.source\nexport const DSP = lol.slice(0, 5)\nexport const DSS = lol.slice(4)\nexport const DATASTAR_FETCH_EVENT = 'datastar-fetch'\nexport const DATASTAR_PROP_CHANGE_EVENT = 'datastar-prop-change'\nexport const DATASTAR_READY_EVENT = 'datastar-ready'\nexport const DATASTAR_SCOPE_CHILDREN_EVENT = 'datastar-scope-children'\nexport const DATASTAR_SIGNAL_PATCH_EVENT = 'datastar-signal-patch'\n", "export const hasOwn: (obj: object, prop: PropertyKey) => boolean =\n // @ts-expect-error\n Object.hasOwn ?? Object.prototype.hasOwnProperty.call\n", "import type { Paths } from '@engine/types'\nimport { hasOwn } from '@utils/polyfills'\n\nexport const isPojo = (obj: any): obj is Record =>\n obj !== null &&\n typeof obj === 'object' &&\n (Object.getPrototypeOf(obj) === Object.prototype ||\n Object.getPrototypeOf(obj) === null)\n\nexport const isEmpty = (obj: Record): boolean => {\n for (const prop in obj) {\n if (hasOwn(obj, prop)) {\n return false\n }\n }\n return true\n}\n\nexport const updateLeaves = (\n obj: Record,\n fn: (oldValue: any) => any,\n) => {\n for (const key in obj) {\n const val = obj[key]\n if (isPojo(val) || Array.isArray(val)) {\n updateLeaves(val, fn)\n } else {\n obj[key] = fn(val)\n }\n }\n}\n\nexport const pathToObj = (paths: Paths): Record => {\n const result: Record = {}\n for (const [path, value] of paths) {\n const keys = path.split('.')\n const lastKey = keys.pop()!\n const obj = keys.reduce((acc, key) => (acc[key] ??= {}), result)\n obj[lastKey] = value\n }\n return result\n}\n", "import { DATASTAR_SIGNAL_PATCH_EVENT } from '@engine/consts'\nimport type {\n Computed,\n Effect,\n JSONPatch,\n MergePatchArgs,\n Paths,\n Signal,\n SignalFilterOptions,\n} from '@engine/types'\nimport { isPojo, pathToObj } from '@utils/paths'\nimport { hasOwn } from '@utils/polyfills'\n\ninterface ReactiveNode {\n deps_?: Link\n depsTail_?: Link\n subs_?: Link\n subsTail_?: Link\n flags_: ReactiveFlags\n}\n\ninterface Link {\n version_: number\n dep_: ReactiveNode\n sub_: ReactiveNode\n prevSub_?: Link\n nextSub_?: Link\n prevDep_?: Link\n nextDep_?: Link\n}\n\ninterface Stack {\n value_: T\n prev_?: Stack\n}\n\nenum ReactiveFlags {\n None = 0,\n Mutable = 1 << 0,\n Watching = 1 << 1,\n RecursedCheck = 1 << 2,\n Recursed = 1 << 3,\n Dirty = 1 << 4,\n Pending = 1 << 5,\n}\n\nenum EffectFlags {\n Queued = 1 << 6,\n}\n\ninterface AlienEffect extends ReactiveNode {\n fn_(): void\n}\n\ninterface AlienComputed extends ReactiveNode {\n value_?: T\n getter(previousValue?: T): T\n}\n\ninterface AlienSignal extends ReactiveNode {\n previousValue: T\n value_: T\n}\n\nconst currentPatch: Paths = []\nconst queuedEffects: (AlienEffect | undefined)[] = []\nlet batchDepth = 0\nlet notifyIndex = 0\nlet queuedEffectsLength = 0\nlet prevSub: ReactiveNode | undefined\nlet activeSub: ReactiveNode | undefined\nlet version = 0\n\nexport const beginBatch = (): void => {\n batchDepth++\n}\n\nexport const endBatch = (): void => {\n if (!--batchDepth) {\n flush()\n dispatch()\n }\n}\n\nexport const startPeeking = (sub?: ReactiveNode): void => {\n prevSub = activeSub\n activeSub = sub\n}\n\nexport const stopPeeking = (): void => {\n activeSub = prevSub\n prevSub = undefined\n}\n\nexport const signal = (initialValue?: T): Signal => {\n return signalOper.bind(0, {\n previousValue: initialValue,\n value_: initialValue,\n flags_: 1 satisfies ReactiveFlags.Mutable,\n }) as Signal\n}\n\nconst computedSymbol = Symbol('computed')\nexport const computed = (getter: (previousValue?: T) => T): Computed => {\n const c = computedOper.bind(0, {\n flags_: 17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty,\n getter,\n }) as Computed\n // @ts-expect-error\n c[computedSymbol] = 1\n return c\n}\n\nexport const effect = (fn: () => void): Effect => {\n const e: AlienEffect = {\n fn_: fn,\n flags_: 2 satisfies ReactiveFlags.Watching,\n }\n if (activeSub) {\n link(e, activeSub)\n }\n startPeeking(e)\n beginBatch()\n try {\n e.fn_()\n } finally {\n endBatch()\n stopPeeking()\n }\n return effectOper.bind(0, e)\n}\n\nconst flush = () => {\n while (notifyIndex < queuedEffectsLength) {\n const effect = queuedEffects[notifyIndex]!\n queuedEffects[notifyIndex++] = undefined\n run(effect, (effect.flags_ &= ~EffectFlags.Queued))\n }\n notifyIndex = 0\n queuedEffectsLength = 0\n}\n\nconst update = (signal: AlienSignal | AlienComputed): boolean => {\n if ('getter' in signal) {\n return updateComputed(signal)\n }\n return updateSignal(signal, signal.value_)\n}\n\nconst updateComputed = (c: AlienComputed): boolean => {\n startPeeking(c)\n startTracking(c)\n try {\n const oldValue = c.value_\n return oldValue !== (c.value_ = c.getter(oldValue))\n } finally {\n stopPeeking()\n endTracking(c)\n }\n}\n\nconst updateSignal = (s: AlienSignal, value: T): boolean => {\n s.flags_ = 1 satisfies ReactiveFlags.Mutable\n return s.previousValue !== (s.previousValue = value)\n}\n\nconst notify = (e: AlienEffect): void => {\n const flags = e.flags_\n if (!(flags & EffectFlags.Queued)) {\n e.flags_ = flags | EffectFlags.Queued\n const subs = e.subs_\n if (subs) {\n notify(subs.sub_ as AlienEffect)\n } else {\n queuedEffects[queuedEffectsLength++] = e\n }\n }\n}\n\nconst run = (e: AlienEffect, flags: ReactiveFlags): void => {\n if (\n flags & (16 satisfies ReactiveFlags.Dirty) ||\n (flags & (32 satisfies ReactiveFlags.Pending) && checkDirty(e.deps_!, e))\n ) {\n startPeeking(e)\n startTracking(e)\n beginBatch()\n try {\n e.fn_()\n } finally {\n endBatch()\n stopPeeking()\n endTracking(e)\n }\n return\n }\n if (flags & (32 satisfies ReactiveFlags.Pending)) {\n e.flags_ = flags & ~(32 satisfies ReactiveFlags.Pending)\n }\n let link = e.deps_\n while (link) {\n const dep = link.dep_\n const depFlags = dep.flags_\n if (depFlags & EffectFlags.Queued) {\n run(dep as AlienEffect, (dep.flags_ = depFlags & ~EffectFlags.Queued))\n }\n link = link.nextDep_\n }\n}\n\nconst signalOper = (s: AlienSignal, ...value: [T]): T | boolean => {\n if (value.length) {\n if (s.value_ !== (s.value_ = value[0])) {\n s.flags_ = 17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty\n const subs = s.subs_\n if (subs) {\n propagate(subs)\n if (!batchDepth) {\n flush()\n }\n }\n return true\n }\n return false\n }\n const currentValue = s.value_\n if (s.flags_ & (16 satisfies ReactiveFlags.Dirty)) {\n if (updateSignal(s, currentValue)) {\n const subs_ = s.subs_\n if (subs_) {\n shallowPropagate(subs_)\n }\n }\n }\n if (activeSub) {\n link(s, activeSub)\n }\n return currentValue\n}\n\nconst computedOper = (c: AlienComputed): T => {\n const flags = c.flags_\n if (\n flags & (16 satisfies ReactiveFlags.Dirty) ||\n (flags & (32 satisfies ReactiveFlags.Pending) && checkDirty(c.deps_!, c))\n ) {\n if (updateComputed(c)) {\n const subs = c.subs_\n if (subs) {\n shallowPropagate(subs)\n }\n }\n } else if (flags & (32 satisfies ReactiveFlags.Pending)) {\n c.flags_ = flags & ~(32 satisfies ReactiveFlags.Pending)\n }\n if (activeSub) {\n link(c, activeSub)\n }\n return c.value_!\n}\n\nconst effectOper = (e: AlienEffect): void => {\n let dep = e.deps_\n while (dep) {\n dep = unlink(dep, e)\n }\n const sub = e.subs_\n if (sub) {\n unlink(sub)\n }\n e.flags_ = 0 satisfies ReactiveFlags.None\n}\n\nconst link = (dep: ReactiveNode, sub: ReactiveNode): void => {\n const prevDep = sub.depsTail_\n if (prevDep && prevDep.dep_ === dep) {\n return\n }\n const nextDep = prevDep ? prevDep.nextDep_ : sub.deps_\n if (nextDep && nextDep.dep_ === dep) {\n nextDep.version_ = version\n sub.depsTail_ = nextDep\n return\n }\n const prevSub = dep.subsTail_\n if (prevSub && prevSub.version_ === version && prevSub.sub_ === sub) {\n return\n }\n const newLink =\n (sub.depsTail_ =\n dep.subsTail_ =\n {\n version_: version,\n dep_: dep,\n sub_: sub,\n prevDep_: prevDep,\n nextDep_: nextDep,\n prevSub_: prevSub,\n })\n if (nextDep) {\n nextDep.prevDep_ = newLink\n }\n if (prevDep) {\n prevDep.nextDep_ = newLink\n } else {\n sub.deps_ = newLink\n }\n if (prevSub) {\n prevSub.nextSub_ = newLink\n } else {\n dep.subs_ = newLink\n }\n}\n\nconst unlink = (link: Link, sub = link.sub_): Link | undefined => {\n const dep_ = link.dep_\n const prevDep_ = link.prevDep_\n const nextDep_ = link.nextDep_\n const nextSub_ = link.nextSub_\n const prevSub_ = link.prevSub_\n if (nextDep_) {\n nextDep_.prevDep_ = prevDep_\n } else {\n sub.depsTail_ = prevDep_\n }\n if (prevDep_) {\n prevDep_.nextDep_ = nextDep_\n } else {\n sub.deps_ = nextDep_\n }\n if (nextSub_) {\n nextSub_.prevSub_ = prevSub_\n } else {\n dep_.subsTail_ = prevSub_\n }\n if (prevSub_) {\n prevSub_.nextSub_ = nextSub_\n } else if (!(dep_.subs_ = nextSub_)) {\n if ('getter' in dep_) {\n let toRemove = dep_.deps_\n if (toRemove) {\n dep_.flags_ = 17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty\n do {\n toRemove = unlink(toRemove, dep_)\n } while (toRemove)\n }\n } else if (!('previousValue' in dep_)) {\n effectOper(dep_ as AlienEffect)\n }\n }\n return nextDep_\n}\n\nconst propagate = (link: Link): void => {\n let next = link.nextSub_\n let stack: Stack | undefined\n\n top: while (true) {\n const sub = link.sub_\n\n let flags = sub.flags_\n\n if (\n !(\n flags &\n (60 as\n | ReactiveFlags.RecursedCheck\n | ReactiveFlags.Recursed\n | ReactiveFlags.Dirty\n | ReactiveFlags.Pending)\n )\n ) {\n sub.flags_ = flags | (32 satisfies ReactiveFlags.Pending)\n } else if (\n !(flags & (12 as ReactiveFlags.RecursedCheck | ReactiveFlags.Recursed))\n ) {\n flags = 0 satisfies ReactiveFlags.None\n } else if (!(flags & (4 satisfies ReactiveFlags.RecursedCheck))) {\n sub.flags_ =\n (flags & ~(8 satisfies ReactiveFlags.Recursed)) |\n (32 satisfies ReactiveFlags.Pending)\n } else if (\n !(flags & (48 as ReactiveFlags.Dirty | ReactiveFlags.Pending)) &&\n isValidLink(link, sub)\n ) {\n sub.flags_ =\n flags | (40 as ReactiveFlags.Recursed | ReactiveFlags.Pending)\n flags &= 1 satisfies ReactiveFlags.Mutable\n } else {\n flags = 0 satisfies ReactiveFlags.None\n }\n\n if (flags & (2 satisfies ReactiveFlags.Watching)) {\n notify(sub as AlienEffect)\n }\n\n if (flags & (1 satisfies ReactiveFlags.Mutable)) {\n const subSubs = sub.subs_\n if (subSubs) {\n const nextSub = (link = subSubs).nextSub_\n if (nextSub) {\n stack = { value_: next, prev_: stack }\n next = nextSub\n }\n continue\n }\n }\n\n if ((link = next!)) {\n next = link.nextSub_\n continue\n }\n\n while (stack) {\n link = stack.value_!\n stack = stack.prev_\n if (link) {\n next = link.nextSub_\n continue top\n }\n }\n\n break\n }\n}\n\nconst startTracking = (sub: ReactiveNode): void => {\n version++\n sub.depsTail_ = undefined\n sub.flags_ =\n (sub.flags_ &\n ~(56 as\n | ReactiveFlags.Recursed\n | ReactiveFlags.Dirty\n | ReactiveFlags.Pending)) |\n (4 satisfies ReactiveFlags.RecursedCheck)\n}\n\nconst endTracking = (sub: ReactiveNode): void => {\n const depsTail_ = sub.depsTail_\n let toRemove = depsTail_ ? depsTail_.nextDep_ : sub.deps_\n while (toRemove) {\n toRemove = unlink(toRemove, sub)\n }\n sub.flags_ &= ~(4 satisfies ReactiveFlags.RecursedCheck)\n}\n\nconst checkDirty = (link: Link, sub: ReactiveNode): boolean => {\n let stack: Stack | undefined\n let checkDepth = 0\n let dirty = false\n\n top: while (true) {\n const dep = link.dep_\n const flags = dep.flags_\n\n if (sub.flags_ & (16 satisfies ReactiveFlags.Dirty)) {\n dirty = true\n } else if (\n (flags & (17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty)) ===\n (17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty)\n ) {\n if (update(dep as AlienSignal | AlienComputed)) {\n const subs = dep.subs_!\n if (subs.nextSub_) {\n shallowPropagate(subs)\n }\n dirty = true\n }\n } else if (\n (flags & (33 as ReactiveFlags.Mutable | ReactiveFlags.Pending)) ===\n (33 as ReactiveFlags.Mutable | ReactiveFlags.Pending)\n ) {\n if (link.nextSub_ || link.prevSub_) {\n stack = { value_: link, prev_: stack }\n }\n link = dep.deps_!\n sub = dep\n ++checkDepth\n continue\n }\n\n if (!dirty) {\n const nextDep = link.nextDep_\n if (nextDep) {\n link = nextDep\n continue\n }\n }\n\n while (checkDepth--) {\n const firstSub = sub.subs_!\n const hasMultipleSubs = firstSub.nextSub_\n if (hasMultipleSubs) {\n link = stack!.value_\n stack = stack!.prev_\n } else {\n link = firstSub\n }\n if (dirty) {\n if (update(sub as AlienSignal | AlienComputed)) {\n if (hasMultipleSubs) {\n shallowPropagate(firstSub)\n }\n sub = link.sub_\n continue\n }\n dirty = false\n } else {\n sub.flags_ &= ~(32 satisfies ReactiveFlags.Pending)\n }\n sub = link.sub_\n if (link.nextDep_) {\n link = link.nextDep_\n continue top\n }\n }\n\n return dirty\n }\n}\n\nconst shallowPropagate = (link: Link): void => {\n do {\n const sub = link.sub_\n const flags = sub.flags_\n if (\n (flags & (48 as ReactiveFlags.Pending | ReactiveFlags.Dirty)) ===\n (32 satisfies ReactiveFlags.Pending)\n ) {\n sub.flags_ = flags | (16 satisfies ReactiveFlags.Dirty)\n if (flags & (2 satisfies ReactiveFlags.Watching)) {\n notify(sub as AlienEffect)\n }\n }\n } while ((link = link.nextSub_!))\n}\n\nconst isValidLink = (checkLink: Link, sub: ReactiveNode): boolean => {\n let link = sub.depsTail_\n while (link) {\n if (link === checkLink) {\n return true\n }\n link = link.prevDep_\n }\n return false\n}\n\nexport const getPath = (path: string): T | undefined => {\n let result = root\n const split = path.split('.')\n for (const path of split) {\n if (result == null || !hasOwn(result, path)) {\n return\n }\n result = result[path]\n }\n return result as T\n}\n\nconst deep = (value: any, prefix = ''): any => {\n const isArr = Array.isArray(value)\n if (isArr || isPojo(value)) {\n const deepObj = (isArr ? [] : {}) as Record>\n for (const key in value) {\n deepObj[key] = signal(\n deep((value as Record>)[key], `${prefix + key}.`),\n )\n }\n const keys = signal(0)\n return new Proxy(deepObj, {\n get(_, prop: string) {\n // JSON.stringify calls `.toJSON()` directly instead of checking if it exists on the object\n // so we have to check if `toJSON` is being called and prevent a signal from automatically\n // being made so JSON.stringify can fallback to the default stringify\n if (!(prop === 'toJSON' && !hasOwn(deepObj, prop))) {\n // special case for when prop is an array function because every array function needs to\n // be reactive to when the keys change\n if (isArr && prop in Array.prototype) {\n keys()\n return deepObj[prop]\n }\n // if prop is a symbol just return the symbol because we don't want to make up that theres\n // an iterator symbol on an object or not\n if (typeof prop === 'symbol') {\n return deepObj[prop]\n }\n // if obj doesnt have prop OR prop is null or undefined then create a signal and default\n // to an empty string\n if (!hasOwn(deepObj, prop) || deepObj[prop]() == null) {\n deepObj[prop] = signal('')\n dispatch(prefix + prop, '')\n keys(keys() + 1)\n }\n return deepObj[prop]()\n }\n },\n set(_, prop: string, newValue) {\n const path = prefix + prop\n // special case for when setting length so we can make a diff patch\n if (isArr && prop === 'length') {\n const diff = (deepObj[prop] as unknown as number) - newValue\n deepObj[prop] = newValue\n // manually make a diff patch for now, shouldnt have to do this when object diffing is\n // implemented. see https://github.com/starfederation/datastar-dev/issues/274\n if (diff > 0) {\n const patch: Record = {}\n for (let i = newValue; i < deepObj[prop]; i++) {\n patch[i] = null\n }\n dispatch(prefix.slice(0, -1), patch)\n keys(keys() + 1)\n }\n } else if (hasOwn(deepObj, prop)) {\n if (newValue == null) {\n delete deepObj[prop]\n // if newValue is a computed set the computed directly instead of wrapping in signal\n } else if (hasOwn(newValue, computedSymbol)) {\n deepObj[prop] = newValue\n dispatch(path, '')\n // if prop changed after setting it then dispatch\n } else {\n const currentValue = deepObj[prop]()\n const pathStr = `${path}.`\n if (isPojo(currentValue) && isPojo(newValue)) {\n for (const key in currentValue) {\n if (!hasOwn(newValue, key)) {\n delete currentValue[key]\n dispatch(pathStr + key, null)\n }\n }\n for (const key in newValue) {\n const nextVal = newValue[key]\n if (currentValue[key] !== nextVal) {\n currentValue[key] = nextVal\n }\n }\n } else if (deepObj[prop](deep(newValue, pathStr))) {\n dispatch(path, newValue)\n }\n }\n // if newValue is null or undefined then noop\n } else if (newValue != null) {\n // if newValue is a computed set the computed directly instead of wrapping in signal\n if (hasOwn(newValue, computedSymbol)) {\n deepObj[prop] = newValue\n dispatch(path, '')\n } else {\n deepObj[prop] = signal(deep(newValue, `${path}.`))\n dispatch(path, newValue)\n }\n keys(keys() + 1)\n }\n\n return true\n },\n deleteProperty(_, prop: string) {\n delete deepObj[prop]\n keys(keys() + 1)\n return true\n },\n ownKeys() {\n keys()\n return Reflect.ownKeys(deepObj)\n },\n has(_, prop) {\n keys()\n return prop in deepObj\n },\n })\n }\n return value\n}\n\nconst dispatch = (path?: string, value?: any) => {\n if (path !== undefined && value !== undefined) {\n currentPatch.push([path, value])\n }\n if (!batchDepth && currentPatch.length) {\n const detail = pathToObj(currentPatch)\n currentPatch.length = 0\n document.dispatchEvent(\n new CustomEvent(DATASTAR_SIGNAL_PATCH_EVENT, {\n detail,\n }),\n )\n }\n}\n\nexport const mergePatch = (\n patch: JSONPatch,\n { ifMissing }: MergePatchArgs = {},\n): void => {\n beginBatch()\n for (const key in patch) {\n if (patch[key] == null) {\n if (!ifMissing) {\n delete root[key]\n }\n } else {\n mergeInner(patch[key], key, root, '', ifMissing)\n }\n }\n endBatch()\n}\n\nexport const mergePaths = (paths: Paths, options?: MergePatchArgs): void =>\n mergePatch(pathToObj(paths), options)\n\nconst mergeInner = (\n patch: any,\n target: string,\n targetParent: Record,\n prefix: string,\n ifMissing: boolean | undefined,\n): void => {\n if (isPojo(patch)) {\n if (\n !(\n hasOwn(targetParent, target) &&\n (isPojo(targetParent[target]) || Array.isArray(targetParent[target]))\n )\n ) {\n targetParent[target] = {}\n }\n\n for (const key in patch) {\n if (patch[key] == null) {\n if (!ifMissing) {\n delete targetParent[target][key]\n }\n } else {\n mergeInner(\n patch[key],\n key,\n targetParent[target],\n `${prefix + target}.`,\n ifMissing,\n )\n }\n }\n } else if (!(ifMissing && hasOwn(targetParent, target))) {\n targetParent[target] = patch\n }\n}\n\nconst toRegExp = (val: string | RegExp): RegExp =>\n typeof val === 'string' ? RegExp(val.replace(/^\\/|\\/$/g, '')) : val\n\n/**\n * Filters the root store based on an include and exclude RegExp\n *\n * @returns The filtered object\n */\nexport const filtered = (\n { include = /.*/, exclude = /(?!)/ }: SignalFilterOptions = {},\n obj: JSONPatch = root,\n): Record => {\n const includeRe = toRegExp(include)\n const excludeRe = toRegExp(exclude)\n const paths: Paths = []\n const stack: [any, string][] = [[obj, '']]\n\n while (stack.length) {\n const [node, prefix] = stack.pop()!\n\n for (const key in node) {\n const path = prefix + key\n if (isPojo(node[key])) {\n stack.push([node[key], `${path}.`])\n } else if (includeRe.test(path) && !excludeRe.test(path)) {\n paths.push([path, getPath(path)])\n }\n }\n }\n\n return pathToObj(paths)\n}\n\nexport const root: Record = deep({})\n", "import type { HTMLOrSVG } from '@engine/types'\n\nexport const isHTMLOrSVG = (el: Node): el is HTMLOrSVG =>\n el instanceof HTMLElement ||\n el instanceof SVGElement ||\n el instanceof MathMLElement\n", "import type { Modifiers } from '@engine/types'\n\nexport const kebab = (str: string): string =>\n str\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1-$2')\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/([a-z])([0-9]+)/gi, '$1-$2')\n .replace(/([0-9]+)([a-z])/gi, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase()\n\nexport const camel = (str: string): string =>\n kebab(str).replace(/-./g, (x) => x[1].toUpperCase())\n\nexport const snake = (str: string): string => kebab(str).replace(/-/g, '_')\n\nexport const pascal = (str: string): string =>\n camel(str).replace(/(^.|(?<=\\.).)/g, (x) => x[0].toUpperCase())\n\nexport const title = (str: string): string =>\n str.replace(/\\b\\w/g, (char) => char.toUpperCase())\n\nconst RE_FUNCTION_LITERAL =\n /^(?:(?:async\\s+)?function\\b|(?:async\\s*)?(?:\\([^)]*\\)|[A-Za-z_$][\\w$]*)\\s*=>)/\n\ntype JsStrToObjectOptions = {\n reviveFunctionStrings?: boolean\n}\n\nexport const jsStrToObject = (\n raw: string,\n options: JsStrToObjectOptions = {},\n) => {\n const { reviveFunctionStrings = false } = options\n try {\n if (!reviveFunctionStrings) return JSON.parse(raw)\n return JSON.parse(raw, (_k, value) => {\n if (typeof value !== 'string') return value\n const trimmed = value.trim()\n if (!RE_FUNCTION_LITERAL.test(trimmed)) return value\n try {\n const revived = Function(`return (${trimmed})`)()\n return typeof revived === 'function' ? revived : value\n } catch {\n return value\n }\n })\n } catch {\n // If JSON parsing fails, try to evaluate as a JavaScript object\n // This is less safe and should be used with caution\n return Function(`return (${raw})`)()\n }\n}\n\nconst caseFns: Record string> = {\n camel: (str) => str.replace(/-[a-z]/g, (x) => x[1].toUpperCase()),\n snake: (str) => str.replace(/-/g, '_'),\n pascal: (str) => str[0].toUpperCase() + caseFns.camel(str.slice(1)),\n}\n\nexport const modifyCasing = (\n str: string,\n mods: Modifiers,\n defaultCase = 'camel',\n): string => {\n for (const c of mods.get('case') || [defaultCase]) {\n str = caseFns[c]?.(str) || str\n }\n return str\n}\n\nexport const aliasify = (name: string) =>\n ALIAS ? `data-${ALIAS}-${name}` : `data-${name}`\n\nexport const unaliasify = (name: string) => {\n if (!ALIAS) return name\n if (!name.startsWith(`${ALIAS}-`)) return null\n return name.slice(ALIAS.length + 1)\n}\n", "import {\n DATASTAR_FETCH_EVENT,\n DATASTAR_READY_EVENT,\n DSP,\n DSS,\n} from '@engine/consts'\nimport { root } from '@engine/signals'\nimport type {\n ActionContext,\n ActionPlugin,\n AttributeContext,\n AttributePlugin,\n DatastarFetchEvent,\n HTMLOrSVG,\n Modifiers,\n Requirement,\n WatcherPlugin,\n} from '@engine/types'\nimport { isHTMLOrSVG } from '@utils/dom'\nimport { aliasify, snake, unaliasify } from '@utils/text'\n\nconst url = 'https://data-star.dev/errors'\n\nconst error = (\n ctx: Record,\n reason: string,\n metadata: Record = {},\n) => {\n Object.assign(metadata, ctx)\n const e = new Error()\n const r = snake(reason)\n const q = new URLSearchParams({\n metadata: JSON.stringify(metadata),\n }).toString()\n const c = JSON.stringify(metadata, null, 2)\n e.message = `${reason}\\nMore info: ${url}/${r}?${q}\\nContext: ${c}`\n return e\n}\n\nconst actionPlugins: Map = new Map()\nconst attributePlugins: Map = new Map()\nconst watcherPlugins: Map = new Map()\n\nexport const actions: Record<\n string,\n (ctx: ActionContext, ...args: any[]) => any\n> = new Proxy(\n {},\n {\n get: (_, prop: string) => actionPlugins.get(prop)?.apply,\n has: (_, prop: string) => actionPlugins.has(prop),\n ownKeys: () => Reflect.ownKeys(actionPlugins),\n set: () => false,\n deleteProperty: () => false,\n },\n)\n\n// Map of cleanups keyed by element, attribute name, and cleanup name\nconst removals = new Map void>>>()\n\nconst queuedAttributes: AttributePlugin[] = []\nconst queuedAttributeNames = new Set()\nconst observedRoots = new Set()\nlet datastarReadyDispatched = false\n\nexport const attribute = (\n plugin: AttributePlugin,\n): void => {\n queuedAttributes.push(plugin as unknown as AttributePlugin)\n\n if (queuedAttributes.length === 1) {\n setTimeout(() => {\n for (const attribute of queuedAttributes) {\n queuedAttributeNames.add(attribute.name)\n attributePlugins.set(attribute.name, attribute)\n }\n queuedAttributes.length = 0\n const roots = observedRoots.size\n ? [...observedRoots]\n : [document.documentElement]\n for (const root of roots) {\n applyQueued(root, !observedRoots.has(root))\n }\n queuedAttributeNames.clear()\n })\n }\n}\n\nexport const action = (plugin: ActionPlugin): void => {\n actionPlugins.set(plugin.name, plugin)\n}\n\ndocument.addEventListener(DATASTAR_FETCH_EVENT, ((\n evt: CustomEvent,\n) => {\n const plugin = watcherPlugins.get(evt.detail.type)\n if (plugin) {\n plugin.apply(\n {\n error: error.bind(0, {\n plugin: { type: 'watcher', name: plugin.name },\n element: {\n id: (evt.target as Element).id,\n tag: (evt.target as Element).tagName,\n },\n }),\n },\n evt.detail.argsRaw,\n )\n }\n}) as EventListener)\n\nexport const watcher = (plugin: WatcherPlugin): void => {\n watcherPlugins.set(plugin.name, plugin)\n}\n\nconst cleanupEls = (els: Iterable): void => {\n for (const el of els) {\n const elCleanups = removals.get(el)\n if (elCleanups && removals.delete(el)) {\n for (const attrCleanups of elCleanups.values()) {\n for (const cleanup of attrCleanups.values()) {\n cleanup()\n }\n }\n }\n }\n}\n\nconst aliasedIgnore = aliasify('ignore')\nconst aliasedIgnoreAttr = `[${aliasedIgnore}]`\nconst shouldIgnore = (el: HTMLOrSVG) =>\n el.hasAttribute(`${aliasedIgnore}__self`) || !!el.closest(aliasedIgnoreAttr)\n\nconst applyEls = (els: Iterable, onlyNew?: boolean): void => {\n for (const el of els) {\n if (!shouldIgnore(el)) {\n const appliedKeys = new Set()\n for (const key in el.dataset) {\n const attrKey = key.replace(/[A-Z]/g, '-$&').toLowerCase()\n appliedKeys.add(attrKey)\n applyAttributePlugin(el, attrKey, el.dataset[key]!, onlyNew)\n }\n for (const attr of Array.from(el.attributes)) {\n if (!attr.name.startsWith('data-')) continue\n const attrKey = attr.name.slice(5)\n if (appliedKeys.has(attrKey)) continue\n applyAttributePlugin(el, attrKey, attr.value, onlyNew)\n }\n }\n }\n}\n\nconst observe = (mutations: MutationRecord[]) => {\n for (const {\n target,\n type,\n attributeName,\n addedNodes,\n removedNodes,\n } of mutations) {\n if (type === 'childList') {\n for (const node of removedNodes) {\n if (isHTMLOrSVG(node)) {\n cleanupEls([node])\n cleanupEls(node.querySelectorAll('*'))\n }\n }\n\n for (const node of addedNodes) {\n if (isHTMLOrSVG(node)) {\n applyEls([node])\n applyEls(node.querySelectorAll('*'))\n }\n }\n } else if (\n type === 'attributes' &&\n attributeName!.startsWith('data-') &&\n isHTMLOrSVG(target) &&\n !shouldIgnore(target)\n ) {\n // skip over 'data-'\n const rawAttrKey = attributeName!.slice(5)\n const key = unaliasify(rawAttrKey)\n if (!key) continue\n const value = target.getAttribute(attributeName!)\n if (value === null) {\n const elCleanups = removals.get(target)\n if (elCleanups) {\n const attrCleanups = elCleanups.get(key)\n if (attrCleanups) {\n for (const cleanup of attrCleanups.values()) {\n cleanup()\n }\n elCleanups.delete(key)\n }\n }\n } else {\n applyAttributePlugin(target, rawAttrKey, value)\n }\n }\n }\n}\n\n// TODO: mutation observer per root so applying to web component doesnt overwrite main observer\nconst mutationObserver = new MutationObserver(observe)\n\nexport const parseAttributeKey = (\n rawKey: string,\n): {\n pluginName: string\n key: string | undefined\n mods: Modifiers\n} => {\n const [namePart, ...rawModifiers] = rawKey.split('__')\n const [pluginName, key] = namePart.split(/:(.+)/)\n const mods: Modifiers = new Map()\n\n for (const rawMod of rawModifiers) {\n const [label, ...mod] = rawMod.split('.')\n mods.set(label, new Set(mod))\n }\n\n return { pluginName, key, mods }\n}\n\nexport const isDocumentObserverActive = () =>\n observedRoots.has(document.documentElement)\n\nconst dispatchDatastarReady = () => {\n if (datastarReadyDispatched || !isDocumentObserverActive()) return\n datastarReadyDispatched = true\n document.dispatchEvent(new Event(DATASTAR_READY_EVENT))\n}\n\nconst applyQueued = (\n root: HTMLOrSVG | ShadowRoot = document.documentElement,\n observeRoot = true,\n): void => {\n if (isHTMLOrSVG(root)) {\n applyEls([root], true)\n }\n applyEls(root.querySelectorAll('*'), true)\n\n if (observeRoot) {\n mutationObserver.observe(root, {\n subtree: true,\n childList: true,\n attributes: true,\n })\n observedRoots.add(root)\n dispatchDatastarReady()\n }\n}\n\nexport const apply = (\n root: HTMLOrSVG | ShadowRoot = document.documentElement,\n observeRoot = true,\n): void => {\n if (isHTMLOrSVG(root)) {\n applyEls([root])\n }\n applyEls(root.querySelectorAll('*'))\n\n if (observeRoot) {\n mutationObserver.observe(root, {\n subtree: true,\n childList: true,\n attributes: true,\n })\n observedRoots.add(root)\n dispatchDatastarReady()\n }\n}\n\nexport const applyElement = (el: HTMLOrSVG, onlyNew = false): void => {\n applyEls([el], onlyNew)\n}\n\nconst applyAttributePlugin = (\n el: HTMLOrSVG,\n attrKey: string,\n value: string,\n onlyNew?: boolean,\n): void => {\n const rawKey = unaliasify(attrKey)\n if (!rawKey) return\n const { pluginName, key, mods } = parseAttributeKey(rawKey)\n const plugin = attributePlugins.get(pluginName)\n const shouldApply =\n (!onlyNew || queuedAttributeNames.has(pluginName)) && !!plugin\n if (shouldApply) {\n const ctx = {\n el,\n rawKey,\n mods,\n error: error.bind(0, {\n plugin: { type: 'attribute', name: plugin.name },\n element: { id: el.id, tag: el.tagName },\n expression: { rawKey, key, value },\n }),\n key,\n value,\n loadedPluginNames: {\n actions: new Set(actionPlugins.keys()),\n attributes: new Set(attributePlugins.keys()),\n },\n rx: undefined,\n } as AttributeContext\n\n const keyReq =\n (plugin.requirement &&\n (typeof plugin.requirement === 'string'\n ? plugin.requirement\n : plugin.requirement.key)) ||\n 'allowed'\n const valueReq =\n (plugin.requirement &&\n (typeof plugin.requirement === 'string'\n ? plugin.requirement\n : plugin.requirement.value)) ||\n 'allowed'\n\n const keyProvided = key !== undefined && key !== null && key !== ''\n const valueProvided = value !== undefined && value !== null && value !== ''\n\n if (keyProvided) {\n if (keyReq === 'denied') {\n throw ctx.error('KeyNotAllowed')\n }\n } else if (keyReq === 'must') {\n throw ctx.error('KeyRequired')\n }\n\n if (valueProvided) {\n if (valueReq === 'denied') {\n throw ctx.error('ValueNotAllowed')\n }\n } else if (valueReq === 'must') {\n throw ctx.error('ValueRequired')\n }\n\n if (keyReq === 'exclusive' || valueReq === 'exclusive') {\n if (keyProvided && valueProvided) {\n throw ctx.error('KeyAndValueProvided')\n }\n if (!keyProvided && !valueProvided) {\n throw ctx.error('KeyOrValueRequired')\n }\n }\n\n const cleanups = new Map void>()\n if (valueProvided) {\n let cachedRx: GenRxFn\n ctx.rx = (...args: any[]) => {\n if (!cachedRx) {\n cachedRx = genRx(value, {\n returnsValue: plugin.returnsValue,\n argNames: plugin.argNames,\n cleanups,\n })\n }\n return cachedRx(el, ...args)\n }\n }\n\n const cleanup = plugin.apply(ctx)\n if (cleanup) {\n cleanups.set('attribute', cleanup)\n }\n\n let elCleanups = removals.get(el)\n if (elCleanups) {\n const attrCleanups = elCleanups.get(rawKey)\n if (attrCleanups) {\n for (const oldCleanup of attrCleanups.values()) {\n oldCleanup()\n }\n }\n } else {\n elCleanups = new Map()\n removals.set(el, elCleanups)\n }\n elCleanups.set(rawKey, cleanups)\n }\n}\n\ntype GenRxOptions = {\n returnsValue?: boolean\n argNames?: string[]\n cleanups?: Map void>\n}\n\ntype GenRxFn = (el: HTMLOrSVG, ...args: any[]) => T\n\nexport const genRx = (\n value: string,\n {\n returnsValue = false,\n argNames = [],\n cleanups = new Map(),\n }: GenRxOptions = {},\n): GenRxFn => {\n let expr = ''\n if (returnsValue) {\n // This regex allows Datastar expressions to support nested\n // regex and strings that contain ; without breaking.\n //\n // Each of these regex defines a block type we want to match\n // (importantly we ignore the content within these blocks):\n //\n // regex \\/(\\\\\\/|[^\\/])*\\/\n // double quotes \"(\\\\\"|[^\\\"])*\"\n // single quotes '(\\\\'|[^'])*'\n // ticks `(\\\\`|[^`])*`\n // iife \\(\\s*((function)\\s*\\(\\s*\\)|(\\(\\s*\\))\\s*=>)\\s*(?:\\{[\\s\\S]*?\\}|[^;)\\{]*)\\s*\\)\\s*\\(\\s*\\)\n //\n // The iife support is (intentionally) limited. It only supports\n // function and arrow syntax with no arguments, and no nested IIFEs.\n //\n // We also want to match the non delimiter part of statements\n // note we only support ; statement delimiters:\n //\n // [^;]\n //\n const statementRe =\n /(\\/(\\\\\\/|[^/])*\\/|\"(\\\\\"|[^\"])*\"|'(\\\\'|[^'])*'|`(\\\\`|[^`])*`|\\(\\s*((function)\\s*\\(\\s*\\)|(\\(\\s*\\))\\s*=>)\\s*(?:\\{[\\s\\S]*?\\}|[^;){]*)\\s*\\)\\s*\\(\\s*\\)|[^;])+/gm\n const statements = value.trim().match(statementRe)\n if (statements) {\n const lastIdx = statements.length - 1\n const last = statements[lastIdx].trim()\n if (!last.startsWith('return')) {\n statements[lastIdx] = `return (${last});`\n }\n expr = statements.join(';\\n')\n }\n } else {\n expr = value.trim()\n }\n\n // Ignore any escaped values\n const escaped = new Map()\n const escapeRe = RegExp(`(?:${DSP})(.*?)(?:${DSS})`, 'gm')\n let counter = 0\n for (const match of expr.matchAll(escapeRe)) {\n const k = match[1]\n const v = `__escaped${counter++}`\n escaped.set(v, k)\n expr = expr.replace(DSP + k + DSS, v)\n }\n\n // Replace signal references with bracket notation\n // Examples:\n // $count -> $['count']\n // $count-- -> $['count']--\n // $foo.bar -> $['foo']['bar']\n // $foo-bar -> $['foo-bar']\n // $foo.bar-baz -> $['foo']['bar-baz']\n // $foo-$bar -> $['foo']-$['bar']\n // $arr[$index] -> $['arr'][$['index']]\n // $['foo'] -> $['foo']\n // $foo[obj.bar] -> $['foo'][obj.bar]\n // $foo['bar.baz'] -> $['foo']['bar.baz']\n // $123 -> $['123']\n // $foo.0.name -> $['foo']['0']['name']\n\n // Skip replacements inside string/template literals.\n // Template interpolation support rewrites `${...}` only when braces are non-nested.\n expr = expr.replace(\n /(\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*'|`(?:\\\\.|[^`\\\\$]|\\$(?!\\{))*`)|\\$\\{([^{}]*)\\}|\\$([a-zA-Z_\\d]\\w*(?:[.-]\\w+)*)/g,\n (match, quoted, interpolationExpr, signalName) => {\n if (quoted) return match\n if (interpolationExpr !== undefined) {\n return `\\${${interpolationExpr.replace(\n /\\$([a-zA-Z_\\d]\\w*(?:[.-]\\w+)*)/g,\n (_: string, innerSignalName: string) =>\n innerSignalName\n .split('.')\n .reduce((acc: string, part: string) => `${acc}['${part}']`, '$'),\n )}}`\n }\n return signalName\n .split('.')\n .reduce((acc: string, part: string) => `${acc}['${part}']`, '$')\n },\n )\n\n expr = expr.replaceAll(/@([A-Za-z_$][\\w$]*)\\(/g, '__action(\"$1\",evt,')\n\n // Replace any escaped values\n for (const [k, v] of escaped) {\n expr = expr.replace(k, v)\n }\n\n try {\n const fn = Function('el', '$', '__action', 'evt', ...argNames, expr)\n return (el: HTMLOrSVG, ...args: any[]) => {\n const action = (name: string, evt: Event | undefined, ...args: any[]) => {\n const err = error.bind(0, {\n plugin: { type: 'action', name },\n element: { id: el.id, tag: el.tagName },\n expression: {\n fnContent: expr,\n value,\n },\n })\n const fn = actions[name]\n if (fn) {\n return fn(\n {\n el,\n evt,\n error: err,\n cleanups,\n },\n ...args,\n )\n }\n throw err('UndefinedAction')\n }\n try {\n return fn(el, root, action, undefined, ...args)\n } catch (e: any) {\n console.error(e)\n throw error(\n {\n element: { id: el.id, tag: el.tagName },\n expression: {\n fnContent: expr,\n value,\n },\n error: e.message,\n },\n 'ExecuteExpression',\n )\n }\n }\n } catch (e: any) {\n console.error(e)\n throw error(\n {\n expression: {\n fnContent: expr,\n value,\n },\n error: e.message,\n },\n 'GenerateExpression',\n )\n }\n}\n", "// Icon: ion:eye\n// Slug: Access signals without subscribing to changes.\n// Description: Allows accessing signals without subscribing to their changes in expressions.\n\nimport { action } from '@engine'\nimport { startPeeking, stopPeeking } from '@engine/signals'\n\naction({\n name: 'peek',\n apply(_, fn: () => any) {\n startPeeking()\n try {\n return fn()\n } finally {\n stopPeeking()\n }\n },\n})\n", "// Icon: ion:checkmark-round\n// Slug: Sets the value of all matching signals.\n// Description: Sets the value of all matching signals (or all signals if no filter is used) to the expression provided in the first argument.\n\nimport { action } from '@engine'\nimport {\n filtered,\n mergePatch,\n startPeeking,\n stopPeeking,\n} from '@engine/signals'\nimport type { SignalFilterOptions } from '@engine/types'\nimport { updateLeaves } from '@utils/paths'\n\naction({\n name: 'setAll',\n apply(_, value: any, filter: SignalFilterOptions) {\n // peek because in an effect you would be subscribing to signals and then setting them which\n // would cause an infinite loop and why would you want to infinite loop on purpose\n startPeeking()\n const masked = filtered(filter)\n updateLeaves(masked, () => value)\n mergePatch(masked)\n stopPeeking()\n },\n})\n", "// Icon: material-symbols:toggle-off\n// Slug: Toggles the value of all matching signals.\n// Description: Toggles the boolean value of all matching signals (or all signals if no filter is used).\n\nimport { action } from '@engine'\nimport {\n filtered,\n mergePatch,\n startPeeking,\n stopPeeking,\n} from '@engine/signals'\nimport type { SignalFilterOptions } from '@engine/types'\nimport { updateLeaves } from '@utils/paths'\n\naction({\n name: 'toggleAll',\n apply(_, filter: SignalFilterOptions) {\n // peek because in an effect you would be subscribing to signals and then setting them which\n // would cause an infinite loop and why would you want to infinite loop on purpose\n startPeeking()\n const masked = filtered(filter)\n updateLeaves(masked, (oldValue: any) => !oldValue)\n mergePatch(masked)\n stopPeeking()\n },\n})\n", "// Icon: ion:eye\n// Slug: Access signals without subscribing to changes.\n// Description: Allows accessing signals without subscribing to their changes in expressions.\n\nimport { action } from '@engine'\nimport { DATASTAR_FETCH_EVENT } from '@engine/consts'\nimport { filtered, startPeeking, stopPeeking } from '@engine/signals'\nimport type {\n DatastarFetchEvent,\n HTMLOrSVG,\n SignalFilterOptions,\n WatcherArgs,\n} from '@engine/types'\nimport { kebab } from '@utils/text'\n\nconst abortControllers = new WeakMap()\nconst methodSupportsRequestBody = (method: string): boolean =>\n !['GET', 'DELETE'].includes(method)\n\nconst createHttpMethod = (\n name: string,\n method: string,\n openWhenHiddenDefault: boolean = true,\n): void =>\n action({\n name,\n apply: async (\n { el, evt, error, cleanups },\n url: string,\n {\n selector,\n headers: userHeaders,\n contentType = 'json',\n filterSignals: { include = /.*/, exclude = /(^|\\.)_/ } = {},\n openWhenHidden = openWhenHiddenDefault,\n payload,\n requestCancellation = 'auto',\n retry = 'auto',\n retryInterval = 1_000,\n retryScaler = 2,\n retryMaxWait = 30_000,\n retryMaxCount = 10,\n }: FetchArgs = {},\n ) => {\n const controller =\n requestCancellation instanceof AbortController\n ? requestCancellation\n : new AbortController()\n if (requestCancellation === 'auto' || requestCancellation === 'cleanup') {\n abortControllers.get(el)?.abort()\n abortControllers.set(el, controller)\n }\n if (requestCancellation === 'cleanup') {\n cleanups.get(`@${name}`)?.()\n cleanups.set(`@${name}`, async () => {\n controller.abort()\n // wait one tick for FINISHED to fire\n await Promise.resolve()\n })\n }\n\n let cleanupFn = () => {}\n\n try {\n if (!url?.length) {\n throw error('FetchNoUrlProvided', { action })\n }\n\n const initialHeaders: Record = {\n Accept: 'text/event-stream, text/html, application/json',\n 'Datastar-Request': true,\n }\n if (contentType === 'json' && methodSupportsRequestBody(method)) {\n initialHeaders['Content-Type'] = 'application/json'\n }\n const headers = Object.assign({}, initialHeaders, userHeaders)\n\n // We ignore the content-type header if using form data\n // if missing the boundary will be set automatically\n\n const req: FetchEventSourceInit = {\n input: '',\n method,\n headers,\n openWhenHidden,\n retry,\n retryInterval,\n retryScaler,\n retryMaxWait,\n retryMaxCount,\n signal: controller.signal,\n onopen: async (response: Response) => {\n if (response.status >= 400)\n dispatchFetch(ERROR, el, { status: response.status.toString() })\n },\n onmessage: (evt) => {\n if (!evt.event.startsWith('datastar')) return\n const type = evt.event\n const argsRawLines: Record = {}\n\n for (const line of evt.data.split('\\n')) {\n const i = line.indexOf(' ')\n const k = line.slice(0, i)\n const v = line.slice(i + 1)\n ;(argsRawLines[k] ||= []).push(v)\n }\n\n const argsRaw = Object.fromEntries(\n Object.entries(argsRawLines).map(([k, v]) => [k, v.join('\\n')]),\n )\n\n dispatchFetch(type, el, argsRaw)\n },\n onerror: (error) => {\n if (isWrongContent(error)) {\n // don't retry if the content-type is wrong\n throw error('FetchExpectedTextEventStream', { url })\n }\n // do nothing and it will retry\n if (error) {\n console.error(error.message)\n dispatchFetch(RETRYING, el, { message: error.message })\n }\n },\n }\n\n const buildFetchEventSourceInit = () => {\n const urlInstance = new URL(url, document.baseURI)\n const queryParams = new URLSearchParams(urlInstance.search)\n if (contentType === 'json') {\n startPeeking()\n const requestPayload =\n payload !== undefined ? payload : filtered({ include, exclude })\n stopPeeking()\n const body = JSON.stringify(requestPayload)\n if (methodSupportsRequestBody(method)) {\n req.body = body\n } else {\n queryParams.set('datastar', body)\n }\n } else if (contentType === 'form') {\n const formEl = (\n selector ? document.querySelector(selector) : el.closest('form')\n ) as HTMLFormElement\n if (!formEl) {\n throw error('FetchFormNotFound', { action, selector })\n }\n\n // Validate the form\n if (!formEl.noValidate && !formEl.checkValidity()) {\n formEl.reportValidity()\n return\n }\n\n // Collect the form data\n const formData = new FormData(formEl)\n let submitter = el as HTMLElement | null\n\n if (el === formEl && evt instanceof SubmitEvent) {\n // Get the submitter from the event\n submitter = evt.submitter\n } else {\n // Prevent the form being submitted\n const preventDefault = (evt: Event) => evt.preventDefault()\n formEl.addEventListener('submit', preventDefault)\n cleanupFn = () => {\n formEl.removeEventListener('submit', preventDefault)\n }\n }\n\n // Append the value of the form submitter if it is a valid submitter and has a name\n if (\n submitter instanceof HTMLButtonElement ||\n (submitter instanceof HTMLInputElement &&\n submitter.type === 'submit')\n ) {\n const name = submitter.getAttribute('name')\n if (name) formData.append(name, submitter.value)\n }\n\n const multipart =\n formEl.getAttribute('enctype') === 'multipart/form-data'\n // Leave the `Content-Type` header empty for multipart encoding so the browser can set it automatically with the correct boundary\n if (!multipart) {\n headers['Content-Type'] = 'application/x-www-form-urlencoded'\n }\n\n const formParams = new URLSearchParams(formData as any)\n if (methodSupportsRequestBody(method)) {\n if (multipart) {\n req.body = formData\n } else {\n req.body = formParams\n }\n } else {\n for (const [key, value] of formParams) {\n queryParams.append(key, value)\n }\n }\n } else {\n throw error('FetchInvalidContentType', { action, contentType })\n }\n urlInstance.search = queryParams.toString()\n req.input = urlInstance.toString()\n return req\n }\n\n dispatchFetch(STARTED, el, {})\n\n try {\n await fetchEventSource(el, buildFetchEventSourceInit)\n } catch (e: any) {\n if (!isWrongContent(e)) {\n throw error('FetchFailed', { method, url, error: e.message })\n }\n // exit gracefully and do nothing if the content-type is wrong\n // this can happen if the client is sending a request\n // where no response is expected, and they haven\u2019t\n // set the content-type to text/event-stream\n }\n } finally {\n dispatchFetch(FINISHED, el, {})\n cleanupFn()\n cleanups.delete(`@${name}`)\n }\n },\n })\n\ncreateHttpMethod('get', 'GET', false)\ncreateHttpMethod('patch', 'PATCH')\ncreateHttpMethod('post', 'POST')\ncreateHttpMethod('put', 'PUT')\ncreateHttpMethod('delete', 'DELETE')\n\nexport const STARTED = 'started'\nexport const FINISHED = 'finished'\nexport const ERROR = 'error'\nexport const RETRYING = 'retrying'\nexport const RETRIES_FAILED = 'retries-failed'\n\nconst dispatchFetch = (type: string, el: HTMLOrSVG, argsRaw: WatcherArgs) =>\n document.dispatchEvent(\n new CustomEvent(DATASTAR_FETCH_EVENT, {\n detail: { type, el, argsRaw },\n }),\n )\n\nconst isWrongContent = (err: any) => `${err}`.includes('text/event-stream')\n\ntype ResponseOverrides =\n | {\n selector?: string\n mode?: string\n namespace?: string\n useViewTransition?: boolean\n }\n | {\n onlyIfMissing?: boolean\n }\n\nexport type FetchArgs = {\n selector?: string\n headers?: Record\n contentType?: 'json' | 'form'\n filterSignals?: SignalFilterOptions\n openWhenHidden?: boolean\n payload?: any\n requestCancellation?: 'auto' | 'cleanup' | 'disabled' | AbortController\n responseOverrides?: ResponseOverrides\n retry?: 'auto' | 'error' | 'always' | 'never'\n retryInterval?: number\n retryScaler?: number\n retryMaxWait?: number\n retryMaxCount?: number\n}\n\n// Below originally from https://github.com/Azure/fetch-event-source/blob/main/LICENSE\n\n/**\n * Represents a message sent in an event stream\n * https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#Event_stream_format\n */\n\ninterface EventSourceMessage {\n id: string\n event: string\n data: string\n retry?: number\n}\n\n/**\n * Converts a ReadableStream into a callback pattern.\n * @param stream The input ReadableStream.\n * @param onChunk A function that will be called on each new byte chunk in the stream.\n * @returns {Promise} A promise that will be resolved when the stream closes.\n */\nconst getBytes = async (\n stream: ReadableStream,\n onChunk: (arr: Uint8Array) => void,\n): Promise => {\n const reader = stream.getReader()\n let result = await reader.read()\n while (!result.done) {\n onChunk(result.value)\n result = await reader.read()\n }\n}\n\nconst getLines = (onLine: (line: Uint8Array, fieldLength: number) => void) => {\n let buffer: Uint8Array | undefined\n let position: number // current read position\n let fieldLength: number // length of the `field` portion of the line\n let discardTrailingNewline = false\n\n // return a function that can process each incoming byte chunk:\n return (arr: Uint8Array) => {\n if (!buffer) {\n buffer = arr\n position = 0\n fieldLength = -1\n } else {\n // we're still parsing the old line. Append the new bytes into buffer:\n buffer = concat(buffer, arr)\n }\n\n const bufLength = buffer.length\n let lineStart = 0 // index where the current line starts\n while (position < bufLength) {\n if (discardTrailingNewline) {\n if (buffer[position] === 10) lineStart = ++position // skip to next char\n discardTrailingNewline = false\n }\n\n // start looking forward till the end of line:\n let lineEnd = -1 // index of the \\r or \\n char\n for (; position < bufLength && lineEnd === -1; ++position) {\n switch (buffer[position]) {\n case 58: // :\n if (fieldLength === -1) {\n // first colon in line\n fieldLength = position - lineStart\n }\n break\n // @ts-expect-error:7029 \\r case below should fallthrough to \\n:\n // biome-ignore lint/suspicious/noFallthroughSwitchClause: intentional fallthrough for CR to LF\n case 13: // \\r\n discardTrailingNewline = true\n case 10: // \\n\n lineEnd = position\n break\n }\n }\n\n if (lineEnd === -1) break // Wait for the next arr and then continue parsing\n\n // we've reached the line end, send it out:\n onLine(buffer.subarray(lineStart, lineEnd), fieldLength)\n lineStart = position // we're now on the next line\n fieldLength = -1\n }\n\n if (lineStart === bufLength)\n buffer = undefined // we've finished reading it\n else if (lineStart) {\n // Create a new view into buffer beginning at lineStart so we don't\n // need to copy over the previous lines when we get the new arr:\n buffer = buffer.subarray(lineStart)\n position -= lineStart\n }\n }\n}\n\nconst getMessages = (\n onId: (id: string) => void,\n onRetry: (retry: number) => void,\n onMessage?: (msg: EventSourceMessage) => void,\n): ((line: Uint8Array, fieldLength: number) => void) => {\n let message = newMessage()\n const decoder = new TextDecoder()\n\n // return a function that can process each incoming line buffer:\n return (line, fieldLength) => {\n if (!line.length) {\n // empty line denotes end of message. Trigger the callback and start a new message:\n onMessage?.(message)\n message = newMessage()\n } else if (fieldLength > 0) {\n // exclude comments and lines with no values\n // line is of format \":\" or \": \"\n // https://html.spec.whatwg.org/multipage/server-sent-events.html#event-stream-interpretation\n const field = decoder.decode(line.subarray(0, fieldLength))\n const valueOffset = fieldLength + (line[fieldLength + 1] === 32 ? 2 : 1)\n const value = decoder.decode(line.subarray(valueOffset))\n\n switch (field) {\n case 'data':\n message.data = message.data ? `${message.data}\\n${value}` : value\n break\n case 'event':\n message.event = value\n break\n case 'id':\n onId((message.id = value))\n break\n case 'retry': {\n const retry = +value\n if (!Number.isNaN(retry)) {\n // per spec, ignore non-integers\n onRetry((message.retry = retry))\n }\n break\n }\n }\n }\n }\n}\n\nconst concat = (a: Uint8Array, b: Uint8Array) => {\n const res = new Uint8Array(a.length + b.length)\n res.set(a)\n res.set(b, a.length)\n return res\n}\n\nconst newMessage = (): EventSourceMessage => ({\n // data, event, and id must be initialized to empty strings:\n // https://html.spec.whatwg.org/multipage/server-sent-events.html#event-stream-interpretation\n // retry should be initialized to undefined so we return a consistent shape\n // to the js engine all the time: https://mathiasbynens.be/notes/shapes-ics#takeaways\n data: '',\n event: '',\n id: '',\n retry: undefined,\n})\n\ntype FetchEventSourceInit =\n | (RequestInit & {\n input: RequestInfo\n headers?: Record\n onopen?: (response: Response) => Promise\n onmessage?: (ev: EventSourceMessage) => void\n onclose?: () => void\n onerror?: (err: any) => void\n openWhenHidden?: boolean\n fetch?: typeof fetch\n retry?: 'auto' | 'error' | 'always' | 'never'\n retryInterval?: number\n retryScaler?: number\n retryMaxWait?: number\n retryMaxCount?: number\n responseOverrides?: ResponseOverrides\n })\n | undefined\n\nconst fetchEventSource = (\n el: HTMLOrSVG,\n buildFetchEventSourceInit: () => FetchEventSourceInit,\n): Promise => {\n return new Promise((resolve, reject) => {\n const fetchInit = buildFetchEventSourceInit()\n if (!fetchInit) {\n return\n }\n let {\n input,\n signal: inputSignal,\n headers: inputHeaders,\n onopen: inputOnOpen,\n onmessage,\n onclose,\n onerror,\n openWhenHidden,\n fetch: inputFetch,\n retry = 'auto',\n retryInterval = 1_000,\n retryScaler = 2,\n retryMaxWait = 30_000,\n retryMaxCount = 10,\n responseOverrides,\n ...rest\n }: FetchEventSourceInit = fetchInit\n\n // make a copy of the input headers since we may modify it below:\n const headers: Record = {\n ...inputHeaders,\n }\n\n let curRequestController: AbortController\n const onVisibilityChange = () => {\n curRequestController.abort() // close existing request on every visibility change\n if (!document.hidden) {\n const currentFetchInit = buildFetchEventSourceInit()\n if (!currentFetchInit) return\n\n input = currentFetchInit.input\n rest.body = currentFetchInit.body\n create()\n }\n }\n\n if (!openWhenHidden) {\n document.addEventListener('visibilitychange', onVisibilityChange)\n }\n\n let retryTimer: ReturnType | undefined\n const dispose = () => {\n document.removeEventListener('visibilitychange', onVisibilityChange)\n clearTimeout(retryTimer)\n curRequestController.abort()\n }\n\n // if the incoming signal aborts, dispose resources and resolve:\n inputSignal?.addEventListener('abort', () => {\n dispose()\n resolve() // don't waste time constructing/logging errors\n })\n\n const fetch = inputFetch || window.fetch\n const onopen = inputOnOpen || (() => {})\n\n let retries = 0\n let baseRetryInterval = retryInterval\n\n const retryRequest = () => {\n retries++\n if (retries <= retryMaxCount) {\n clearTimeout(retryTimer)\n console.error(\n `Datastar failed to reach ${input.toString()} retrying in ${retryInterval}ms.`,\n )\n retryTimer = setTimeout(create, retryInterval)\n\n // Prepare the interval for the next retry (exponential backoff)\n retryInterval = Math.min(retryInterval * retryScaler, retryMaxWait)\n } else {\n dispatchFetch(RETRIES_FAILED, el, {})\n dispose()\n reject('Max retries reached.')\n }\n }\n\n const create = async () => {\n curRequestController = new AbortController()\n const curRequestSignal = curRequestController.signal\n try {\n const response = await fetch(input, {\n ...rest,\n headers,\n signal: curRequestSignal,\n })\n\n await onopen(response)\n\n const dispatchNonSSE = async (\n dispatchType: string,\n response: Response,\n name: string,\n responseOverrides?: ResponseOverrides,\n ...argNames: string[]\n ) => {\n const argsRaw: WatcherArgs = {\n [name]: await response.text(),\n }\n for (const n of argNames) {\n let v = response.headers.get(`datastar-${kebab(n)}`)\n if (responseOverrides) {\n const o = (responseOverrides as any)[n]\n if (o) v = typeof o === 'string' ? o : JSON.stringify(o)\n }\n if (v) argsRaw[n] = v\n }\n\n dispatchFetch(dispatchType, el, argsRaw)\n dispose()\n resolve()\n }\n\n const status = response.status\n const isNoContentStatus = status === 204\n const isRedirectStatus = status >= 300 && status < 400\n const isErrorStatus = status >= 400 && status < 600\n\n if (status !== 200) {\n onclose?.()\n if (\n retry !== 'never' &&\n !isNoContentStatus &&\n !isRedirectStatus &&\n (retry === 'always' || (retry === 'error' && isErrorStatus))\n ) {\n retryRequest()\n return\n }\n dispose()\n resolve()\n return\n }\n\n // on successful connection, reset the retry logic\n retries = 0\n retryInterval = baseRetryInterval\n\n const ct = response.headers.get('Content-Type')\n if (ct?.includes('text/html')) {\n return await dispatchNonSSE(\n 'datastar-patch-elements',\n response,\n 'elements',\n responseOverrides,\n 'selector',\n 'mode',\n 'namespace',\n 'useViewTransition',\n )\n }\n\n if (ct?.includes('application/json')) {\n return await dispatchNonSSE(\n 'datastar-patch-signals',\n response,\n 'signals',\n responseOverrides,\n 'onlyIfMissing',\n )\n }\n\n if (ct?.includes('text/javascript')) {\n const script = document.createElement('script')\n const scriptAttributesHeader = response.headers.get(\n 'datastar-script-attributes',\n )\n\n if (scriptAttributesHeader) {\n for (const [name, value] of Object.entries(\n JSON.parse(scriptAttributesHeader),\n )) {\n script.setAttribute(name, value as string)\n }\n }\n script.textContent = await response.text()\n document.head.appendChild(script)\n dispose()\n return\n }\n\n await getBytes(\n response.body!,\n getLines(\n getMessages(\n (id) => {\n if (id) {\n // signals the id and send it back on the next retry:\n headers['last-event-id'] = id\n } else {\n // don't send the last-event-id header anymore:\n delete headers['last-event-id']\n }\n },\n (retry) => {\n baseRetryInterval = retryInterval = retry\n },\n onmessage,\n ),\n ),\n )\n\n onclose?.()\n\n if (retry === 'always' && !isRedirectStatus) {\n retryRequest()\n return\n }\n\n dispose()\n resolve()\n } catch {\n if (!curRequestSignal.aborted) {\n try {\n retryRequest()\n } catch (innerErr) {\n dispose()\n reject(innerErr)\n }\n }\n }\n }\n\n create()\n })\n}\n", "// Icon: material-symbols:edit-attributes-outline\n// Slug: Syncs the value of an attribute with an expression.\n// Description: Sets the value of any HTML attribute to an expression, and keeps it in sync.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\n\nattribute({\n name: 'attr',\n requirement: { value: 'must' },\n returnsValue: true,\n apply({ el, key, rx }) {\n const syncAttr = (key: string, val: any) => {\n if (val === '' || val === true) {\n el.setAttribute(key, '')\n } else if (val === false || val == null) {\n el.removeAttribute(key)\n } else if (typeof val === 'string') {\n el.setAttribute(key, val)\n } else if (typeof val === 'function') {\n el.setAttribute(key, val.toString())\n } else {\n el.setAttribute(\n key,\n JSON.stringify(val, (_k, v) =>\n typeof v === 'function' ? v.toString() : v,\n ),\n )\n }\n }\n\n const update = key\n ? () => {\n observer.disconnect()\n const val = rx() as string\n syncAttr(key, val)\n observer.observe(el, {\n attributeFilter: [key],\n })\n }\n : () => {\n observer.disconnect()\n const obj = rx() as Record\n const attributeFilter = Object.keys(obj)\n for (const key of attributeFilter) {\n syncAttr(key, obj[key])\n }\n observer.observe(el, {\n attributeFilter,\n })\n }\n\n const observer = new MutationObserver(update)\n const cleanup = effect(update)\n\n return () => {\n observer.disconnect()\n cleanup()\n }\n },\n})\n", "// Icon: akar-icons:link-chain\n// Slug: Creates a signal with two-way data binding.\n// Description: Creates a signal (if one doesn\u2019t already exist) and sets up two-way data binding between it and an element\u2019s value.\n\nimport { attribute } from '@engine'\nimport { DATASTAR_PROP_CHANGE_EVENT } from '@engine/consts'\nimport { effect, getPath, mergePaths } from '@engine/signals'\nimport type { Paths } from '@engine/types'\nimport { hasOwn } from '@utils/polyfills'\nimport { aliasify, camel, modifyCasing } from '@utils/text'\n\ntype SignalFile = {\n name: string\n contents: string\n mime: string\n}\n\ntype BindAdapter = {\n get: (el: any, type: string) => any\n set: (el: any, value: any) => void\n events: string[]\n}\n\nconst propAdapter = (prop: string, ...events: string[]): BindAdapter => ({\n get: (el: any) => el[prop],\n set: (el: any, value: any) => {\n el[prop] = value\n },\n events,\n})\n\nconst attrAdapter = (attr: string, ...events: string[]): BindAdapter => ({\n get: (el: Element) => el.getAttribute(attr),\n set: (el: Element, value: any) => {\n el.setAttribute(attr, `${value}`)\n },\n events,\n})\n\nconst valueAdapter = (\n treatUndefinedAsString = false,\n ...events: string[]\n): BindAdapter => ({\n get: (el: HTMLInputElement | HTMLSelectElement, type: string) =>\n type === 'string' || (treatUndefinedAsString && type === 'undefined')\n ? el.value\n : +el.value,\n set: (el: HTMLInputElement | HTMLSelectElement, value: string | number) => {\n el.value = `${value}`\n },\n events,\n})\n\nconst dataURIRegex = /^data:(?[^;]+);base64,(?.*)$/\nconst empty = Symbol('empty')\n\nconst boundPath = (\n el: Element,\n key: string | null | undefined,\n rawKey: string,\n signalName: string,\n adapter: BindAdapter,\n initialValue: any,\n) => {\n const rawAttribute = aliasify(CSS.escape(rawKey))\n const selector = key\n ? `[${rawAttribute}]`\n : `[${rawAttribute}=\"${CSS.escape(signalName)}\"]`\n if (\n initialValue === undefined &&\n el instanceof HTMLInputElement &&\n el.type === 'radio'\n ) {\n const checked = [...document.querySelectorAll(selector)].find(\n (input): input is HTMLInputElement =>\n input instanceof HTMLInputElement && input.checked,\n )\n // Missing radio binds adopt the checked option.\n if (checked) {\n mergePaths([[signalName, checked.value]], { ifMissing: true })\n }\n }\n\n if (\n !Array.isArray(initialValue) ||\n (el instanceof HTMLSelectElement && el.multiple)\n ) {\n mergePaths([[signalName, adapter.get(el, typeof initialValue)]], {\n ifMissing: true,\n })\n return signalName\n }\n\n const inputs = document.querySelectorAll(selector) as NodeListOf\n\n const paths: Paths = []\n let i = 0\n for (const input of inputs) {\n // Missing proxy slots materialize as '', which breaks `ifMissing`.\n paths.push([\n `${signalName}.${i}`,\n adapter.get(\n input,\n typeof (hasOwn(initialValue, i) ? initialValue[i] : undefined),\n ),\n ])\n if (el === input) {\n break\n }\n i++\n }\n mergePaths(paths, { ifMissing: true })\n return `${signalName}.${i}`\n}\n\nattribute({\n name: 'bind',\n requirement: 'exclusive',\n apply({ el, key, rawKey, mods, value, error }) {\n const signalName = key != null ? modifyCasing(key, mods) : value\n\n const props = mods.get('prop')\n const events = mods.get('event')\n let adapter: BindAdapter | null = null\n\n if (el instanceof HTMLInputElement) {\n switch (el.type) {\n case 'range':\n case 'number':\n adapter = valueAdapter(false, 'input')\n break\n case 'checkbox':\n adapter = {\n get: (el: HTMLInputElement, type: string) => {\n if (el.value !== 'on') {\n return type === 'boolean'\n ? el.checked\n : el.checked\n ? el.value\n : ''\n }\n return type === 'string'\n ? el.checked\n ? el.value\n : ''\n : el.checked\n },\n set: (el: HTMLInputElement, value: string | boolean) => {\n el.checked =\n typeof value === 'string' ? value === el.value : value\n },\n events: ['input'],\n }\n break\n case 'radio':\n if (!el.getAttribute('name')?.length) {\n el.setAttribute('name', signalName)\n }\n adapter = {\n get: (el: HTMLInputElement, type: string) =>\n el.checked ? (type === 'number' ? +el.value : el.value) : empty,\n set: (el: HTMLInputElement, value: string | number) => {\n el.checked =\n value === (typeof value === 'number' ? +el.value : el.value)\n },\n events: ['input'],\n }\n break\n case 'file': {\n const syncSignal = () => {\n const files = [...(el.files || [])]\n const signalFiles: SignalFile[] = []\n Promise.all(\n files.map(\n (f) =>\n new Promise((resolve) => {\n const reader = new FileReader()\n reader.onload = () => {\n if (typeof reader.result !== 'string') {\n throw error('InvalidFileResultType', {\n resultType: typeof reader.result,\n })\n }\n const match = reader.result.match(dataURIRegex)\n if (!match?.groups) {\n throw error('InvalidDataUri', {\n result: reader.result,\n })\n }\n signalFiles.push({\n name: f.name,\n contents: match.groups.contents,\n mime: match.groups.mime,\n })\n }\n reader.onloadend = () => resolve()\n reader.readAsDataURL(f)\n }),\n ),\n ).then(() => {\n mergePaths([[signalName, signalFiles]])\n })\n }\n\n el.addEventListener('change', syncSignal)\n return () => {\n el.removeEventListener('change', syncSignal)\n }\n }\n default:\n adapter = valueAdapter(true, 'input')\n }\n } else if (el instanceof HTMLSelectElement && el.multiple) {\n const typeMap = new Map()\n adapter = {\n get: (el: HTMLSelectElement) =>\n [...el.selectedOptions].map((option) => {\n const type = typeMap.get(option.value)\n return type === 'string' || type == null\n ? option.value\n : +option.value\n }),\n set: (el: HTMLSelectElement, value: (string | number)[]) => {\n for (const option of el.options) {\n if (value.includes(option.value)) {\n typeMap.set(option.value, 'string')\n option.selected = true\n } else if (value.includes(+option.value)) {\n typeMap.set(option.value, 'number')\n option.selected = true\n } else {\n option.selected = false\n }\n }\n },\n events: ['change'],\n }\n } else if (el instanceof HTMLSelectElement) {\n adapter = valueAdapter(true, 'change')\n } else if (el instanceof HTMLTextAreaElement) {\n adapter = propAdapter('value', 'input')\n } else if (el instanceof HTMLElement && el.tagName.includes('-')) {\n adapter =\n 'value' in el\n ? propAdapter('value', 'input', 'change')\n : attrAdapter('value', 'input', 'change')\n } else if (el instanceof HTMLElement && 'value' in el) {\n adapter = propAdapter('value', 'change')\n } else {\n adapter = attrAdapter('value', 'change')\n }\n if (!adapter) {\n throw error('InvalidBindAdapter')\n }\n\n const firstProp = props && [...props][0]\n if (props && !firstProp) throw error('BindPropNameMissing')\n if (firstProp) {\n const prop = camel(firstProp)\n adapter = propAdapter(prop, ...(events ? [...events] : adapter.events))\n } else if (events) {\n adapter.events = [...events]\n }\n\n const initialValue = getPath(signalName)\n const path = boundPath(\n el,\n key,\n rawKey,\n signalName,\n adapter,\n initialValue,\n )\n\n const syncSignal = () => {\n const signalValue = getPath(path)\n if (signalValue != null) {\n const value = adapter.get(el, typeof signalValue)\n if (value !== empty) {\n mergePaths([[path, value]])\n }\n }\n }\n\n for (const eventName of adapter.events) {\n el.addEventListener(eventName, syncSignal)\n }\n el.addEventListener(DATASTAR_PROP_CHANGE_EVENT, syncSignal)\n const cleanup = effect(() => {\n adapter.set(el, getPath(path))\n })\n\n return () => {\n cleanup()\n for (const eventName of adapter.events) {\n el.removeEventListener(eventName, syncSignal)\n }\n el.removeEventListener(DATASTAR_PROP_CHANGE_EVENT, syncSignal)\n }\n },\n})\n", "// Icon: ic:baseline-format-paint\n// Slug: Adds or removes a class based on an expression.\n// Description: Adds or removes a class to or from an element based on an expression.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\nimport { modifyCasing } from '@utils/text'\n\nattribute({\n name: 'class',\n requirement: {\n value: 'must',\n },\n returnsValue: true,\n apply({ key, el, mods, rx }) {\n key &&= modifyCasing(key, mods, 'kebab')\n\n let classes: Record\n const callback = () => {\n observer.disconnect()\n\n classes = key\n ? { [key]: rx() as boolean }\n : (rx() as Record)\n\n for (const k in classes) {\n const classNames = k.split(/\\s+/).filter((cn) => cn.length > 0)\n if (classes[k]) {\n for (const name of classNames) {\n if (!el.classList.contains(name)) {\n el.classList.add(name)\n }\n }\n } else {\n for (const name of classNames) {\n if (el.classList.contains(name)) {\n el.classList.remove(name)\n }\n }\n }\n }\n\n observer.observe(el, { attributeFilter: ['class'] })\n }\n\n const observer = new MutationObserver(callback)\n const cleanup = effect(callback)\n\n return () => {\n observer.disconnect()\n cleanup()\n\n for (const k in classes) {\n const classNames = k.split(/\\s+/).filter((cn) => cn.length > 0)\n for (const name of classNames) {\n el.classList.remove(name)\n }\n }\n }\n },\n})\n", "// Icon: streamline-ultimate:wifi-signal-2\n// Slug: Creates a computed signal.\n// Description: Creates a signal that is computed based on an expression.\n\nimport { attribute } from '@engine'\nimport { computed, mergePaths, mergePatch } from '@engine/signals'\nimport { modifyCasing } from '@utils/text'\nimport { updateLeaves } from '@utils/paths'\n\nattribute({\n name: 'computed',\n requirement: {\n value: 'must',\n },\n returnsValue: true,\n apply({ key, mods, rx, error }) {\n if (key) {\n mergePaths([[modifyCasing(key, mods), computed(rx)]])\n } else {\n const patch = Object.assign({}, rx() as Record any>)\n updateLeaves(patch, (old) => {\n if (typeof old === 'function') {\n return computed(old)\n } else {\n throw error('ComputedExpectedFunction')\n }\n })\n mergePatch(patch)\n }\n },\n})\n", "// Icon: oui:security-signal\n// Slug: Executes an expression when signals change.\n// Description: Executes an expression on page load and whenever any signals in the expression change.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\n\nattribute({\n name: 'effect',\n requirement: {\n key: 'denied',\n value: 'must',\n },\n apply: ({ rx }) => effect(rx),\n})\n", "// Icon: streamline:signal-loading-remix\n// Slug: Creates an indicator for whether an SSE request is in flight.\n// Description: Creates a signal and sets its value to `true` while an SSE request request is in flight, otherwise `false`.\n\nimport { attribute } from '@engine'\nimport { DATASTAR_FETCH_EVENT } from '@engine/consts'\nimport { mergePaths } from '@engine/signals'\nimport type { DatastarFetchEvent } from '@engine/types'\nimport { FINISHED, STARTED } from '@plugins/actions/fetch'\nimport { modifyCasing } from '@utils/text'\n\nattribute({\n name: 'indicator',\n requirement: 'exclusive',\n apply({ el, key, mods, value }) {\n const signalName = key != null ? modifyCasing(key, mods) : value\n let activeFetches = 0\n\n mergePaths([[signalName, false]])\n\n const watcher = ((event: CustomEvent) => {\n const { type, el: elt } = event.detail\n if (elt !== el) {\n return\n }\n switch (type) {\n case STARTED:\n activeFetches++\n mergePaths([[signalName, true]])\n break\n case FINISHED:\n activeFetches = Math.max(0, activeFetches - 1)\n mergePaths([[signalName, activeFetches > 0]])\n break\n }\n }) as EventListener\n document.addEventListener(DATASTAR_FETCH_EVENT, watcher)\n return () => {\n activeFetches = 0\n mergePaths([[signalName, false]])\n document.removeEventListener(DATASTAR_FETCH_EVENT, watcher)\n }\n },\n})\n", "export const tagToMs = (args: Set) => {\n if (!args || args.size <= 0) return 0\n for (const arg of args) {\n if (arg.endsWith('ms')) {\n return +arg.replace('ms', '')\n }\n if (arg.endsWith('s')) {\n return +arg.replace('s', '') * 1000\n }\n try {\n return Number.parseFloat(arg)\n } catch (_) {}\n }\n return 0\n}\n\nexport const tagHas = (\n tags: Set,\n tag: string,\n defaultValue = false,\n) => {\n if (!tags) return defaultValue\n return tags.has(tag.toLowerCase())\n}\n\nexport const tagFirst = (tags?: Set, defaultValue = ''): string => {\n if (tags && tags.size > 0) {\n for (const tag of tags) {\n return tag\n }\n }\n return defaultValue\n}\n", "import type { EventCallbackHandler, Modifiers } from '@engine/types'\nimport { tagHas, tagToMs } from '@utils/tags'\n\nexport const delay = (\n callback: EventCallbackHandler,\n wait: number,\n): EventCallbackHandler => {\n return (...args: any[]) => {\n setTimeout(() => {\n callback(...args)\n }, wait)\n }\n}\n\nexport const throttle = (\n callback: EventCallbackHandler,\n wait: number,\n leading = true,\n trailing = false,\n debounce = false,\n): EventCallbackHandler => {\n let lastArgs: Parameters | null = null\n let timer: ReturnType | number = 0\n\n return (...args: any[]) => {\n if (leading && !timer) {\n callback(...args)\n lastArgs = null\n } else {\n lastArgs = args\n }\n if (!timer || debounce) {\n if (timer) {\n clearTimeout(timer)\n }\n timer = setTimeout(() => {\n if (trailing && lastArgs !== null) {\n callback(...lastArgs)\n }\n lastArgs = null\n timer = 0\n }, wait)\n }\n }\n}\n\nexport const modifyTiming = (\n callback: EventCallbackHandler,\n mods: Modifiers,\n): EventCallbackHandler => {\n const delayArgs = mods.get('delay')\n if (delayArgs) {\n const wait = tagToMs(delayArgs)\n callback = delay(callback, wait)\n }\n\n const debounceArgs = mods.get('debounce')\n if (debounceArgs) {\n const wait = tagToMs(debounceArgs)\n const leading = tagHas(debounceArgs, 'leading', false)\n const trailing = !tagHas(debounceArgs, 'notrailing', false)\n callback = throttle(callback, wait, leading, trailing, true)\n }\n\n const throttleArgs = mods.get('throttle')\n if (throttleArgs) {\n const wait = tagToMs(throttleArgs)\n const leading = !tagHas(throttleArgs, 'noleading', false)\n const trailing = tagHas(throttleArgs, 'trailing', false)\n callback = throttle(callback, wait, leading, trailing)\n }\n\n return callback\n}\n", "import type { EventCallbackHandler, Modifiers } from '@engine/types'\n\nexport const supportsViewTransitions = !!document.startViewTransition\n\nexport const modifyViewTransition = (\n callback: EventCallbackHandler,\n mods: Modifiers,\n): EventCallbackHandler => {\n if (mods.has('viewtransition') && supportsViewTransitions) {\n const cb = callback // I hate javascript\n callback = (...args: any[]) =>\n document.startViewTransition(() => cb(...args))\n }\n\n return callback\n}\n", "// Icon: material-symbols:timer-play-outline\n// Slug: Runs an expression when loaded into the DOM.\n// Description: Runs an expression when the element is loaded into the DOM.\n\nimport { attribute } from '@engine'\nimport { beginBatch, endBatch } from '@engine/signals'\nimport { tagToMs } from '@utils/tags'\nimport { delay } from '@utils/timing'\nimport { modifyViewTransition } from '@utils/view-transitions'\n\nattribute({\n name: 'init',\n requirement: {\n key: 'denied',\n value: 'must',\n },\n apply({ rx, mods }) {\n let callback = () => {\n beginBatch()\n rx()\n endBatch()\n }\n callback = modifyViewTransition(callback, mods)\n let wait = 0\n const delayArgs = mods.get('delay')\n if (delayArgs) {\n wait = tagToMs(delayArgs)\n if (wait > 0) {\n callback = delay(callback, wait)\n }\n }\n callback()\n },\n})\n", "// Icon: si:json-fill\n// Slug: Outputs a JSON stringified version of signals.\n// Description: Sets the text content of an element to a reactive JSON stringified version of signals.\n\nimport { attribute } from '@engine'\nimport { effect, filtered } from '@engine/signals'\nimport type { SignalFilterOptions } from '@engine/types'\nimport { jsStrToObject } from '@utils/text'\n\nattribute({\n name: 'json-signals',\n requirement: {\n key: 'denied',\n },\n apply({ el, value, mods }) {\n const spaces = mods.has('terse') ? 0 : 2\n let filters: SignalFilterOptions = {}\n if (value) {\n filters = jsStrToObject(value)\n }\n\n const callback = () => {\n observer.disconnect()\n el.textContent = JSON.stringify(filtered(filters), null, spaces)\n observer.observe(el, {\n childList: true,\n characterData: true,\n subtree: true,\n })\n }\n const observer = new MutationObserver(callback)\n const cleanup = effect(callback)\n\n return () => {\n observer.disconnect()\n cleanup()\n }\n },\n})\n", "// Icon: material-symbols:mail\n// Slug: Attaches an event listener to an element.\n// Description: Attaches an event listener to an element, executing an expression whenever the event is triggered.\n\nimport { attribute } from '@engine'\nimport {\n DATASTAR_FETCH_EVENT,\n DATASTAR_SIGNAL_PATCH_EVENT,\n} from '@engine/consts'\nimport { beginBatch, endBatch } from '@engine/signals'\nimport { modifyCasing } from '@utils/text'\nimport { modifyTiming } from '@utils/timing'\nimport { modifyViewTransition } from '@utils/view-transitions'\n\nattribute({\n name: 'on',\n requirement: 'must',\n argNames: ['evt'],\n apply({ el, key, mods, rx }) {\n let target: Element | Window | Document = el\n if (mods.has('window')) {\n target = window\n } else if (mods.has('document')) {\n target = document\n }\n let callback = (evt?: Event) => {\n beginBatch()\n rx(evt)\n endBatch()\n }\n callback = modifyViewTransition(callback, mods)\n callback = modifyTiming(callback, mods)\n const eventName = modifyCasing(key, mods, 'kebab')\n const evtListOpts: AddEventListenerOptions = {\n capture: mods.has('capture'),\n passive: mods.has('passive'),\n once: mods.has('once'),\n }\n if (mods.has('outside')) {\n target = document\n const cb = callback\n callback = (evt?: Event) => {\n if (!el.contains(evt?.target as HTMLElement)) {\n cb(evt)\n }\n }\n }\n // Listen for Datastar events on the document\n if (\n eventName === DATASTAR_FETCH_EVENT ||\n eventName === DATASTAR_SIGNAL_PATCH_EVENT\n ) {\n target = document\n }\n // Apply event-side effects before timing/view-transition wrappers run.\n const listener = (evt?: Event) => {\n if (evt) {\n if (mods.has('prevent')) evt.preventDefault()\n if (mods.has('stop')) evt.stopPropagation()\n // Keep data-on:submit from falling through to native form submission.\n if (el instanceof HTMLFormElement && eventName === 'submit') evt.preventDefault()\n }\n callback(evt)\n }\n target.addEventListener(eventName, listener, evtListOpts)\n return () => {\n target.removeEventListener(eventName, listener, evtListOpts)\n }\n },\n})\n", "export const clamp = (value: number, min: number, max: number): number => {\n return Math.max(min, Math.min(max, value))\n}\n\nexport const lerp = (\n min: number,\n max: number,\n t: number,\n clamped = true,\n): number => {\n const v = min + (max - min) * t\n return clamped ? clamp(v, min, max) : v\n}\n\nexport const inverseLerp = (\n min: number,\n max: number,\n value: number,\n clamped = true,\n): number => {\n if (value < min) return 0\n if (value > max) return 1\n const v = (value - min) / (max - min)\n return clamped ? clamp(v, min, max) : v\n}\n\nexport const fit = (\n value: number,\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n clamped = true,\n rounded = false,\n): number => {\n const t = inverseLerp(inMin, inMax, value, clamped)\n const fitted = lerp(outMin, outMax, t, clamped)\n return rounded ? Math.round(fitted) : fitted\n}\n", "// Icon: mdi-light:vector-intersection\n// Slug: Runs an expression on intersection.\n// Description: Runs an expression when the element intersects with the viewport.\n\nimport { attribute } from '@engine'\nimport { beginBatch, endBatch } from '@engine/signals'\nimport type { HTMLOrSVG } from '@engine/types'\nimport { clamp } from '@utils/math'\nimport { tagFirst } from '@utils/tags'\nimport { modifyTiming } from '@utils/timing'\nimport { modifyViewTransition } from '@utils/view-transitions'\n\nconst once = new WeakSet()\n\nattribute({\n name: 'on-intersect',\n requirement: {\n key: 'denied',\n value: 'must',\n },\n apply({ el, mods, rx }) {\n let callback = () => {\n beginBatch()\n rx()\n endBatch()\n }\n callback = modifyViewTransition(callback, mods)\n callback = modifyTiming(callback, mods)\n const options = { threshold: 0 }\n if (mods.has('full')) {\n options.threshold = 1\n } else if (mods.has('half')) {\n options.threshold = 0.5\n } else {\n const threshold = mods.get('threshold')\n if (threshold) {\n options.threshold = clamp(Number(tagFirst(threshold)), 0, 100) / 100\n }\n }\n const exit = mods.has('exit')\n let observer: IntersectionObserver | null = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting !== exit) {\n callback()\n if (observer && once.has(el)) {\n observer.disconnect()\n }\n }\n }\n },\n options,\n )\n observer.observe(el)\n if (mods.has('once')) {\n once.add(el)\n }\n return () => {\n if (!mods.has('once')) {\n once.delete(el)\n }\n if (observer) {\n observer.disconnect()\n observer = null\n }\n }\n },\n})\n", "// Icon: material-symbols:timer-outline\n// Slug: Runs an expression at a regular interval.\n// Description: Runs an expression at a regular interval.\n\nimport { attribute } from '@engine'\nimport { beginBatch, endBatch } from '@engine/signals'\nimport { tagHas, tagToMs } from '@utils/tags'\nimport { modifyViewTransition } from '@utils/view-transitions'\n\nattribute({\n name: 'on-interval',\n requirement: {\n key: 'denied',\n value: 'must',\n },\n apply({ mods, rx }) {\n let callback = () => {\n beginBatch()\n rx()\n endBatch()\n }\n callback = modifyViewTransition(callback, mods)\n let duration = 1000\n const durationArgs = mods.get('duration')\n if (durationArgs) {\n duration = tagToMs(durationArgs)\n const leading = tagHas(durationArgs, 'leading', false)\n if (leading) {\n callback()\n }\n }\n const intervalId = setInterval(callback, duration)\n return () => {\n clearInterval(intervalId)\n }\n },\n})\n", "// Icon: material-symbols:change-circle-outline\n// Slug: Runs an expression when signals are patched.\n// Description: Runs an expression whenever one or more signals are patched.\n\nimport { attribute } from '@engine'\nimport { DATASTAR_SIGNAL_PATCH_EVENT } from '@engine/consts'\nimport { beginBatch, endBatch, filtered } from '@engine/signals'\nimport type { JSONPatch, SignalFilterOptions } from '@engine/types'\nimport { isEmpty } from '@utils/paths'\nimport { aliasify, jsStrToObject } from '@utils/text'\nimport { modifyTiming } from '@utils/timing'\n\nattribute({\n name: 'on-signal-patch',\n requirement: {\n value: 'must',\n },\n argNames: ['patch'],\n returnsValue: true,\n apply({ el, key, mods, rx, error }) {\n if (!!key && key !== 'filter') {\n throw error('KeyNotAllowed')\n }\n\n const filterAttr = aliasify(`${this.name}-filter`)\n const filtersRaw = el.getAttribute(filterAttr)\n let filters: SignalFilterOptions = {}\n if (filtersRaw) {\n filters = jsStrToObject(filtersRaw)\n }\n\n let running = false\n\n const callback: EventListener = modifyTiming(\n (evt: CustomEvent) => {\n if (running) return\n const watched = filtered(filters, evt.detail)\n if (!isEmpty(watched)) {\n running = true\n beginBatch()\n try {\n rx(watched)\n } finally {\n endBatch()\n running = false\n }\n }\n },\n mods,\n )\n\n document.addEventListener(DATASTAR_SIGNAL_PATCH_EVENT, callback)\n return () => {\n document.removeEventListener(DATASTAR_SIGNAL_PATCH_EVENT, callback)\n }\n },\n})\n", "// Icon: mdi:cursor-pointer\n// Slug: Creates a reference to an element.\n// Description: Creates a new signal that is a reference to the element on which the data attribute is placed.\n\nimport { attribute } from '@engine'\nimport { mergePaths } from '@engine/signals'\nimport { modifyCasing } from '@utils/text'\n\nattribute({\n name: 'ref',\n requirement: 'exclusive',\n apply({ el, key, mods, value }) {\n const signalName = key != null ? modifyCasing(key, mods) : value\n mergePaths([[signalName, el]])\n },\n})\n", "// Icon: streamline:interface-edit-view-eye-eyeball-open-view\n// Slug: Shows or hides an element.\n// Description: Shows or hides an element based on whether an expression evaluates to `true` or `false`.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\n\nconst NONE = 'none'\nconst DISPLAY = 'display'\n\nattribute({\n name: 'show',\n requirement: {\n key: 'denied',\n value: 'must',\n },\n returnsValue: true,\n apply({ el, rx }) {\n const update = () => {\n observer.disconnect()\n const shouldShow = rx()\n if (shouldShow) {\n if (el.style.display === NONE) el.style.removeProperty(DISPLAY)\n } else {\n el.style.setProperty(DISPLAY, NONE)\n }\n observer.observe(el, { attributeFilter: ['style'] })\n }\n const observer = new MutationObserver(update)\n const cleanup = effect(update)\n\n return () => {\n observer.disconnect()\n cleanup()\n }\n },\n})\n", "// Icon: streamline:wifi-signal-full-remix\n// Slug: Patches signals into the existing signals.\n// Description: Patches (adds, updates or removes) one or more signals into the existing signals.\n\nimport { attribute } from '@engine'\nimport { mergePatch, mergePaths } from '@engine/signals'\nimport { modifyCasing } from '@utils/text'\n\nattribute({\n name: 'signals',\n returnsValue: true,\n apply({ key, mods, rx }) {\n const ifMissing = mods.has('ifmissing')\n\n if (key) {\n key = modifyCasing(key, mods)\n const value = rx?.()\n mergePaths([[key, value]], { ifMissing })\n } else {\n const patch = Object.assign({}, rx?.() as Record)\n mergePatch(patch, { ifMissing })\n }\n },\n})\n", "// Icon: material-symbols:format-paint-outline\n// Slug: Sets inline styles on an element based on an expression.\n// Description: Sets CSS styles on an element using either key-based or object syntax, and keeps them in sync with reactive signals.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\nimport { kebab } from '@utils/text'\n\nattribute({\n name: 'style',\n requirement: {\n value: 'must',\n },\n returnsValue: true,\n apply({ key, el, rx }) {\n const { style } = el\n const initialStyles = new Map()\n\n const apply = (prop: string, value: any) => {\n const initial = initialStyles.get(prop)\n if (!value && value !== 0) {\n initial !== undefined &&\n (initial\n ? style.setProperty(prop, initial)\n : style.removeProperty(prop))\n } else {\n initial === undefined &&\n initialStyles.set(prop, style.getPropertyValue(prop))\n style.setProperty(prop, String(value))\n }\n }\n\n const update = () => {\n observer.disconnect()\n\n if (key) {\n apply(key, rx())\n } else {\n const styles = rx() as Record\n\n for (const [prop, initial] of initialStyles) {\n prop in styles ||\n (initial\n ? style.setProperty(prop, initial)\n : style.removeProperty(prop))\n }\n\n for (const prop in styles) {\n apply(kebab(prop), styles[prop])\n }\n }\n\n observer.observe(el, { attributeFilter: ['style'] })\n }\n\n const observer = new MutationObserver(update)\n const cleanup = effect(update)\n\n return () => {\n observer.disconnect()\n cleanup()\n for (const [prop, initial] of initialStyles) {\n initial ? style.setProperty(prop, initial) : style.removeProperty(prop)\n }\n }\n },\n})\n", "// Icon: icon-park-outline:text\n// Slug: Binds the text content of an element.\n// Description: Binds the text content of an element to an expression.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\n\nattribute({\n name: 'text',\n requirement: {\n key: 'denied',\n value: 'must',\n },\n returnsValue: true,\n apply({ el, rx }) {\n const update = () => {\n observer.disconnect()\n el.textContent = `${rx()}`\n observer.observe(el, {\n childList: true,\n characterData: true,\n subtree: true,\n })\n }\n\n const observer = new MutationObserver(update)\n const cleanup = effect(update)\n\n return () => {\n observer.disconnect()\n cleanup()\n }\n },\n})\n", "// Icon: material-symbols:cloud-download\n// Slug: Patches elements into the DOM.\n// Description: Patches elements into the DOM.\n\nimport { watcher } from '@engine'\nimport {\n DATASTAR_PROP_CHANGE_EVENT,\n DATASTAR_SCOPE_CHILDREN_EVENT,\n} from '@engine/consts'\nimport type { WatcherArgsValue, WatcherContext } from '@engine/types'\nimport { isHTMLOrSVG } from '@utils/dom'\nimport { aliasify } from '@utils/text'\nimport { supportsViewTransitions } from '@utils/view-transitions'\n\nconst isValidType = (\n arr: T,\n value: string,\n): value is T[number] => (arr as readonly string[]).includes(value)\n\nconst PATCH_MODES = [\n 'remove',\n 'outer',\n 'inner',\n 'replace',\n 'prepend',\n 'append',\n 'before',\n 'after',\n] as const\ntype PatchElementsMode = (typeof PATCH_MODES)[number]\n\nconst NAMESPACES = ['html', 'svg', 'mathml'] as const\ntype Namespace = (typeof NAMESPACES)[number]\n\ntype PatchElementsArgs = {\n selector: string\n mode: PatchElementsMode\n namespace: Namespace\n useViewTransition: boolean\n elements: WatcherArgsValue\n}\n\nwatcher({\n name: 'datastar-patch-elements',\n apply(ctx, args) {\n const selector = typeof args.selector === 'string' ? args.selector : ''\n const mode = typeof args.mode === 'string' ? args.mode : 'outer'\n const namespace =\n typeof args.namespace === 'string' ? args.namespace : 'html'\n const useViewTransitionRaw =\n typeof args.useViewTransition === 'string' ? args.useViewTransition : ''\n const elements = args.elements\n\n if (!isValidType(PATCH_MODES, mode)) {\n throw ctx.error('PatchElementsInvalidMode', { mode })\n }\n\n if (!selector && mode !== 'outer' && mode !== 'replace') {\n throw ctx.error('PatchElementsExpectedSelector')\n }\n\n if (!isValidType(NAMESPACES, namespace)) {\n throw ctx.error('PatchElementsInvalidNamespace', { namespace })\n }\n\n const args2: PatchElementsArgs = {\n selector,\n mode,\n namespace,\n useViewTransition: useViewTransitionRaw.trim() === 'true',\n elements,\n }\n\n if (supportsViewTransitions && args2.useViewTransition) {\n document.startViewTransition(() => onPatchElements(ctx, args2))\n } else {\n onPatchElements(ctx, args2)\n }\n },\n})\n\nconst onPatchElements = (\n { error }: WatcherContext,\n { selector, mode, namespace, elements }: PatchElementsArgs,\n) => {\n let newContent = document.createDocumentFragment()\n let consume = typeof elements !== 'string' && !!elements\n\n if (typeof elements === 'string') {\n const elementsWithSvgsRemoved = elements.replace(\n /]*>|>)([\\s\\S]*?)<\\/svg>/gim,\n '',\n )\n const hasHtml = /<\\/html>/.test(elementsWithSvgsRemoved)\n const hasHead = /<\\/head>/.test(elementsWithSvgsRemoved)\n const hasBody = /<\\/body>/.test(elementsWithSvgsRemoved)\n\n const wrapperTag =\n namespace === 'svg' ? 'svg' : namespace === 'mathml' ? 'math' : ''\n const wrappedEls = wrapperTag\n ? `<${wrapperTag}>${elements}`\n : elements\n\n const newDocument = new DOMParser().parseFromString(\n hasHtml || hasHead || hasBody\n ? elements\n : ``,\n 'text/html',\n )\n\n if (hasHtml) {\n newContent.appendChild(newDocument.documentElement)\n } else if (hasHead && hasBody) {\n newContent.appendChild(newDocument.head)\n newContent.appendChild(newDocument.body)\n } else if (hasHead) {\n newContent.appendChild(newDocument.head)\n } else if (hasBody) {\n newContent.appendChild(newDocument.body)\n } else if (wrapperTag) {\n const wrapperEl = newDocument\n .querySelector('template')!\n .content.querySelector(wrapperTag)!\n for (const child of wrapperEl.childNodes) {\n newContent.appendChild(child)\n }\n } else {\n newContent = newDocument.querySelector('template')!.content\n }\n } else if (elements) {\n if (elements instanceof DocumentFragment) {\n newContent = elements\n } else if (elements instanceof Element) {\n newContent.appendChild(elements)\n }\n }\n\n if (!selector && (mode === 'outer' || mode === 'replace')) {\n const children = Array.from(newContent.children)\n for (const child of children) {\n let target: Element\n if (child instanceof HTMLHtmlElement) {\n target = document.documentElement\n } else if (child instanceof HTMLBodyElement) {\n target = document.body\n } else if (child instanceof HTMLHeadElement) {\n target = document.head\n } else {\n target = document.getElementById(child.id)!\n if (!target) {\n console.warn(error('PatchElementsNoTargetsFound'), {\n element: { id: child.id },\n })\n continue\n }\n }\n\n // Consume the new content so we don\u2019t deep clone.\n applyToTargets(mode as PatchElementsMode, child, [target], true)\n }\n } else {\n const targets = document.querySelectorAll(selector)\n if (!targets.length) {\n console.warn(error('PatchElementsNoTargetsFound'), { selector })\n return\n }\n\n const targetList = consume && mode !== 'remove' ? [targets[0]!] : targets\n\n // If only one target exists, we can safely consume the new content which prevents deep cloning (https://github.com/starfederation/datastar/issues/1155).\n if (targetList.length === 1) {\n consume = true\n }\n\n applyToTargets(mode as PatchElementsMode, newContent, targetList, consume)\n }\n}\n\nconst scripts = new WeakSet()\nfor (const script of document.querySelectorAll('script')) {\n scripts.add(script)\n}\n\nconst execute = (target: Element): void => {\n const elScripts =\n target instanceof HTMLScriptElement\n ? [target]\n : target.querySelectorAll('script')\n for (const old of elScripts) {\n if (!scripts.has(old)) {\n const script = document.createElement('script')\n for (const { name, value } of old.attributes) {\n script.setAttribute(name, value)\n }\n script.text = old.text\n old.replaceWith(script)\n scripts.add(script)\n }\n }\n}\n\nconst applyPatchMode = (\n targets: Iterable,\n element: DocumentFragment | Element,\n action: string,\n consume: boolean,\n) => {\n let used = false\n for (const target of targets) {\n if (consume && used) {\n break\n }\n const nextNode = consume ? element : (element.cloneNode(true) as Element)\n execute(nextNode as Element)\n // @ts-expect-error - calling dynamic method path on DOM element\n target[action](nextNode)\n used = true\n }\n}\n\nconst applyToTargets = (\n mode: PatchElementsMode,\n element: DocumentFragment | Element,\n targets: Iterable,\n consume: boolean,\n) => {\n switch (mode) {\n case 'remove':\n for (const target of targets) {\n target.remove()\n }\n break\n case 'outer':\n case 'inner':\n {\n let used = false\n for (const target of targets) {\n if (consume && used) {\n break\n }\n const nextNode = consume ? element : (element.cloneNode(true) as Element)\n morph(target, nextNode, mode)\n execute(target)\n const scopeHost = target.closest('[data-scope-children]')\n if (scopeHost) {\n scopeHost.dispatchEvent(\n new CustomEvent(DATASTAR_SCOPE_CHILDREN_EVENT, {\n bubbles: false,\n }),\n )\n }\n used = true\n }\n }\n break\n case 'replace':\n applyPatchMode(targets, element, 'replaceWith', consume)\n break\n case 'prepend':\n case 'append':\n case 'before':\n case 'after':\n applyPatchMode(targets, element, mode, consume)\n }\n}\n\nconst ctxIdMap = new Map>()\nconst ctxPersistentIds = new Set()\nconst oldIdTagNameMap = new Map()\nconst duplicateIds = new Set()\nconst ctxPantry = document.createElement('div')\nctxPantry.hidden = true\n\nconst aliasedIgnoreMorph = aliasify('ignore-morph')\nconst aliasedIgnoreMorphAttr = `[${aliasedIgnoreMorph}]`\nexport const morph = (\n oldElt: Element | ShadowRoot,\n newContent: DocumentFragment | Element,\n mode: 'outer' | 'inner' = 'outer',\n): void => {\n if (\n (isHTMLOrSVG(oldElt) &&\n isHTMLOrSVG(newContent) &&\n oldElt.hasAttribute(aliasedIgnoreMorph) &&\n newContent.hasAttribute(aliasedIgnoreMorph)) ||\n oldElt.parentElement?.closest(aliasedIgnoreMorphAttr)\n ) {\n return\n }\n\n const normalizedElt = document.createElement('div')\n normalizedElt.append(newContent)\n document.body.insertAdjacentElement('afterend', ctxPantry)\n\n // Computes the set of IDs that persist between the two contents excluding duplicates\n const oldIdElements = oldElt.querySelectorAll('[id]')\n for (const { id, tagName } of oldIdElements) {\n if (oldIdTagNameMap.has(id)) {\n duplicateIds.add(id)\n } else {\n oldIdTagNameMap.set(id, tagName)\n }\n }\n if (oldElt instanceof Element && oldElt.id) {\n if (oldIdTagNameMap.has(oldElt.id)) {\n duplicateIds.add(oldElt.id)\n } else {\n oldIdTagNameMap.set(oldElt.id, oldElt.tagName)\n }\n }\n\n ctxPersistentIds.clear()\n const newIdElements = normalizedElt.querySelectorAll('[id]')\n for (const { id, tagName } of newIdElements) {\n if (ctxPersistentIds.has(id)) {\n duplicateIds.add(id)\n } else if (oldIdTagNameMap.get(id) === tagName) {\n ctxPersistentIds.add(id)\n }\n }\n\n for (const id of duplicateIds) {\n ctxPersistentIds.delete(id)\n }\n\n oldIdTagNameMap.clear()\n duplicateIds.clear()\n ctxIdMap.clear()\n\n const parent = mode === 'outer' ? oldElt.parentElement! : oldElt\n populateIdMapWithTree(parent, oldIdElements)\n populateIdMapWithTree(normalizedElt, newIdElements)\n\n morphChildren(\n parent,\n normalizedElt,\n mode === 'outer' ? oldElt : null,\n oldElt.nextSibling,\n )\n\n ctxPantry.remove()\n}\n\n// This is the core algorithm for matching up children.\n// The idea is to use ID sets to try to match up nodes as faithfully as possible.\n// We greedily match, which allows us to keep the algorithm fast,\n// but by using ID sets, we are able to better match up with content deeper in the DOM.\nconst morphChildren = (\n oldParent: Element | ShadowRoot, // the old content that we are merging the new content into\n newParent: Element, // the parent element of the new content\n insertionPoint: Node | null = null, // the point in the DOM we start morphing at (defaults to first child)\n endPoint: Node | null = null, // the point in the DOM we stop morphing at (defaults to after last child)\n): void => {\n // normalize\n if (\n oldParent instanceof HTMLTemplateElement &&\n newParent instanceof HTMLTemplateElement\n ) {\n // we can pretend the DocumentElement is an Element\n oldParent = oldParent.content as unknown as Element\n newParent = newParent.content as unknown as Element\n }\n insertionPoint ??= oldParent.firstChild\n\n // run through all the new content\n for (const newChild of newParent.childNodes) {\n // once we reach the end of the old parent content skip to the end and insert the rest\n if (insertionPoint && insertionPoint !== endPoint) {\n const bestMatch = findBestMatch(newChild, insertionPoint, endPoint)\n if (bestMatch) {\n // if the node to morph is not at the insertion point then remove/move up to it\n if (bestMatch !== insertionPoint) {\n let cursor: Node | null = insertionPoint\n // Remove nodes between the start and end nodes\n while (cursor && cursor !== bestMatch) {\n const tempNode = cursor\n cursor = cursor.nextSibling\n removeNode(tempNode)\n }\n }\n morphNode(bestMatch, newChild)\n insertionPoint = bestMatch.nextSibling\n continue\n }\n }\n\n // if the matching node is elsewhere in the original content\n if (newChild instanceof Element && ctxPersistentIds.has(newChild.id)) {\n // move it and all its children here and morph, will always be found\n // Search for an element by ID within the document and pantry, and move it using moveBefore.\n const movedChild = document.getElementById(newChild.id) as Element\n\n // Removes an element from its ancestors' ID maps.\n // This is needed when an element is moved from the \"future\" via `moveBeforeId`.\n // Otherwise, its erstwhile ancestors could be mistakenly moved to the pantry rather than being deleted,\n // preventing their removal hooks from being called.\n let current = movedChild\n while ((current = current.parentNode as Element)) {\n const idSet = ctxIdMap.get(current)\n if (idSet) {\n idSet.delete(newChild.id)\n if (!idSet.size) {\n ctxIdMap.delete(current)\n }\n }\n }\n\n moveBefore(oldParent, movedChild, insertionPoint)\n morphNode(movedChild, newChild)\n insertionPoint = movedChild.nextSibling\n continue\n }\n\n // This performs the action of inserting a new node while handling situations where the node contains\n // elements with persistent IDs and possible state info we can still preserve by moving in and then morphing\n if (ctxIdMap.has(newChild)) {\n // node has children with IDs with possible state so create a dummy elt of same type and apply full morph algorithm\n const namespaceURI = (newChild as Element).namespaceURI\n const tagName = (newChild as Element).tagName\n const newEmptyChild =\n namespaceURI && namespaceURI !== 'http://www.w3.org/1999/xhtml'\n ? document.createElementNS(namespaceURI, tagName)\n : document.createElement(tagName)\n oldParent.insertBefore(newEmptyChild, insertionPoint)\n morphNode(newEmptyChild, newChild)\n insertionPoint = newEmptyChild.nextSibling\n } else {\n // optimization: no id state to preserve so we can just insert a clone of the newChild and its descendants\n const newClonedChild = document.importNode(newChild, true) // importNode to not mutate newParent\n oldParent.insertBefore(newClonedChild, insertionPoint)\n insertionPoint = newClonedChild.nextSibling\n }\n }\n\n // remove any remaining old nodes that didn't match up with new content\n while (insertionPoint && insertionPoint !== endPoint) {\n const tempNode = insertionPoint\n insertionPoint = insertionPoint.nextSibling\n removeNode(tempNode)\n }\n}\n\n// Scans forward from the startPoint to the endPoint looking for a match for the node.\n// It looks for an id set match first, then a soft match.\n// We abort soft matching if we find two future soft matches, to reduce churn.\nconst findBestMatch = (\n node: Node,\n startPoint: Node | null,\n endPoint: Node | null,\n): Node | null => {\n let bestMatch: Node | null | undefined = null\n let nextSibling = node.nextSibling\n let siblingSoftMatchCount = 0\n let displaceMatchCount = 0\n\n // Max ID matches we are willing to displace in our search\n const nodeMatchCount = ctxIdMap.get(node)?.size || 0\n\n let cursor = startPoint\n while (cursor && cursor !== endPoint) {\n // soft matching is a prerequisite for id set matching\n if (isSoftMatch(cursor, node)) {\n let isIdSetMatch = false\n const oldSet = ctxIdMap.get(cursor)\n const newSet = ctxIdMap.get(node)\n\n if (newSet && oldSet) {\n for (const id of oldSet) {\n // a potential match is an id in the new and old nodes that\n // has not already been merged into the DOM\n // But the newNode content we call this on has not been\n // merged yet and we don't allow duplicate IDs so it is simple\n if (newSet.has(id)) {\n isIdSetMatch = true\n break\n }\n }\n }\n\n if (isIdSetMatch) {\n return cursor // found an id set match, we're done!\n }\n\n // we haven\u2019t yet saved a soft match fallback\n // the current soft match will hard match something else in the future, leave it\n if (!bestMatch && !ctxIdMap.has(cursor)) {\n // optimization: if node can't id set match, we can just return the soft match immediately\n if (!nodeMatchCount) {\n return cursor\n }\n // save this as the fallback if we get through the loop without finding a hard match\n bestMatch = cursor\n }\n }\n\n // check for IDs we may be displaced when matching\n displaceMatchCount += ctxIdMap.get(cursor)?.size || 0\n if (displaceMatchCount > nodeMatchCount) {\n // if we are going to displace more IDs than the node contains then\n // we do not have a good candidate for an ID match, so return\n break\n }\n\n if (bestMatch === null && nextSibling && isSoftMatch(cursor, nextSibling)) {\n // The next new node has a soft match with this node, so\n // increment the count of future soft matches\n siblingSoftMatchCount++\n nextSibling = nextSibling.nextSibling\n\n // If there are two future soft matches, block soft matching for this node to allow\n // future siblings to soft match. This is to reduce churn in the DOM when an element\n // is prepended.\n if (siblingSoftMatchCount >= 2) {\n bestMatch = undefined\n }\n }\n\n cursor = cursor.nextSibling\n }\n\n return bestMatch || null\n}\n\n// ok to cast: if one is not element, `id` and `tagName` will be null and we'll just compare that.\nconst isSoftMatch = (oldNode: Node, newNode: Node): boolean =>\n oldNode.nodeType === newNode.nodeType &&\n (oldNode as Element).tagName === (newNode as Element).tagName &&\n // If oldElt has an `id` with possible state and it doesn\u2019t match newElt.id then avoid morphing.\n // We'll still match an anonymous node with an IDed newElt, though, because if it got this far,\n // its not persistent, and new nodes can't have any hidden state.\n (!(oldNode as Element).id ||\n (oldNode as Element).id === (newNode as Element).id)\n\n// Gets rid of an unwanted DOM node; strategy depends on nature of its reuse:\n// - Persistent nodes will be moved to the pantry for later reuse\n// - Other nodes will have their hooks called, and then are removed\nconst removeNode = (node: Node): void => {\n // are we going to id set match this later?\n ctxIdMap.has(node)\n ? // skip callbacks and move to pantry\n moveBefore(ctxPantry, node, null)\n : // remove for realsies\n node.parentNode?.removeChild(node)\n}\n\n// Moves an element before another element within the same parent.\n// Uses the proposed `moveBefore` API if available (and working), otherwise falls back to `insertBefore`.\n// This is essentially a forward-compat wrapper.\nconst moveBefore = (parentNode: Node, node: Node, after: Node | null): void => {\n if ('moveBefore' in parentNode) {\n const moveableParent = parentNode as Node & {\n moveBefore: (node: Node, child: Node | null) => Node\n }\n moveableParent.moveBefore(node, after)\n return\n }\n parentNode.insertBefore(node, after)\n}\n\nconst aliasedPreserveAttr = aliasify('preserve-attr')\n\n// syncs the oldNode to the newNode, copying over all attributes and\n// inner element state from the newNode to the oldNode\nconst morphNode = (\n oldNode: Node, // root node to merge content into\n newNode: Node, // new content to merge\n): Node => {\n const type = newNode.nodeType\n\n // if is an element type, sync the attributes from the\n // new node into the new node\n if (type === 1 /* element type */) {\n const oldElt = oldNode as Element\n const newElt = newNode as Element\n const shouldScopeChildren = oldElt.hasAttribute('data-scope-children')\n if (\n oldElt.hasAttribute(aliasedIgnoreMorph) &&\n newElt.hasAttribute(aliasedIgnoreMorph)\n ) {\n return oldNode\n }\n\n // The following logic for handling inputs, textareas, and options is finnicky.\n // Only change with extreme caution and lots of testing!\n // --\n // many bothans died to bring us this information:\n // https://github.com/patrick-steele-idem/morphdom/blob/master/src/specialElHandlers.js\n // https://github.com/choojs/nanomorph/blob/master/lib/morph.js#L113\n // --\n\n const preserveAttrs = (\n (newNode as HTMLElement).getAttribute(aliasedPreserveAttr) ?? ''\n ).split(' ')\n\n const updateElementProp = (\n oldElt: Element,\n newElt: Element,\n name: string,\n ): boolean => {\n const newEltHasAttr = newElt.hasAttribute(name)\n if (\n oldElt.hasAttribute(name) !== newEltHasAttr &&\n !preserveAttrs.includes(name)\n ) {\n // @ts-expect-error - setting dynamic property for native DOM properties\n oldElt[name] = newEltHasAttr\n return true\n }\n return false\n }\n\n let shouldDispatchPropChangeEvent = false\n if (\n oldElt instanceof HTMLInputElement &&\n newElt instanceof HTMLInputElement &&\n newElt.type !== 'file'\n ) {\n // Modify the value only if the new element\u2019s value attribute is different from the old element\u2019s value attribute\n const newValue = newElt.getAttribute('value')\n if (\n oldElt.getAttribute('value') !== newValue &&\n !preserveAttrs.includes('value')\n ) {\n oldElt.value = newValue ?? ''\n shouldDispatchPropChangeEvent = true\n }\n // Update checked and disabled properties\n shouldDispatchPropChangeEvent =\n updateElementProp(oldElt, newElt, 'checked') ||\n shouldDispatchPropChangeEvent\n updateElementProp(oldElt, newElt, 'disabled')\n } else if (\n oldElt instanceof HTMLTextAreaElement &&\n newElt instanceof HTMLTextAreaElement\n ) {\n // Modify the value only if the new element\u2019s value is different from the old element\u2019s default value\n const newValue = newElt.value\n if (oldElt.defaultValue !== newValue) {\n oldElt.value = newValue\n shouldDispatchPropChangeEvent = true\n }\n } else if (\n oldElt instanceof HTMLOptionElement &&\n newElt instanceof HTMLOptionElement\n ) {\n shouldDispatchPropChangeEvent =\n updateElementProp(oldElt, newElt, 'selected') ||\n shouldDispatchPropChangeEvent\n }\n\n for (const { name, value } of newElt.attributes) {\n if (\n oldElt.getAttribute(name) !== value &&\n !preserveAttrs.includes(name)\n ) {\n oldElt.setAttribute(name, value)\n }\n }\n\n // Create a static copy, so we can iterate forward safely as we remove attributes\n for (const { name } of Array.from(oldElt.attributes)) {\n if (!newElt.hasAttribute(name) && !preserveAttrs.includes(name)) {\n oldElt.removeAttribute(name)\n }\n }\n\n if (shouldDispatchPropChangeEvent) {\n const dispatchElt =\n oldElt instanceof HTMLOptionElement ? oldElt.closest('select') : oldElt\n dispatchElt?.dispatchEvent(\n new Event(DATASTAR_PROP_CHANGE_EVENT, { bubbles: true }),\n )\n }\n\n // Preserve the scope marker even if the incoming markup doesn't carry it.\n if (shouldScopeChildren && !oldElt.hasAttribute('data-scope-children')) {\n oldElt.setAttribute('data-scope-children', '')\n }\n\n if (\n oldElt instanceof HTMLTemplateElement &&\n newElt instanceof HTMLTemplateElement\n ) {\n oldElt.innerHTML = newElt.innerHTML\n } else if (!oldElt.isEqualNode(newElt)) {\n morphChildren(oldElt, newElt)\n }\n\n if (shouldScopeChildren) {\n oldElt.dispatchEvent(\n new CustomEvent(DATASTAR_SCOPE_CHILDREN_EVENT, { bubbles: false }),\n )\n }\n }\n\n if (type === 8 /* comment */ || type === 3 /* text */) {\n if (oldNode.nodeValue !== newNode.nodeValue) {\n oldNode.nodeValue = newNode.nodeValue\n }\n }\n\n return oldNode\n}\n\n// A bottom-up algorithm that populates a map of Element -> IdSet.\n// The ID set for a given element is the set of all IDs contained within its subtree.\n// As an optimization, we filter these IDs through the given list of persistent IDs,\n// because we don't need to bother considering IDed elements that won't be in the new content.\nconst populateIdMapWithTree = (\n root: Element | ShadowRoot | null,\n elements: Iterable,\n): void => {\n for (const elt of elements) {\n if (ctxPersistentIds.has(elt.id)) {\n let current: Element | null = elt\n // walk up the parent hierarchy of that element, adding the ID of element to the parent's ID set\n while (current && current !== root) {\n let idSet = ctxIdMap.get(current)\n // if the ID set doesn\u2019t exist, create it and insert it in the map\n if (!idSet) {\n idSet = new Set()\n ctxIdMap.set(current, idSet)\n }\n idSet.add(elt.id)\n current = current.parentElement\n }\n }\n }\n}\n", "// Icon: material-symbols:settings-input-antenna\n// Slug: Patches signals.\n// Description: Patches signals.\n\nimport { watcher } from '@engine'\nimport { mergePatch } from '@engine/signals'\nimport { jsStrToObject } from '@utils/text'\n\nwatcher({\n name: 'datastar-patch-signals',\n apply({ error }, { signals, onlyIfMissing }) {\n if (typeof signals !== 'string') {\n throw error('PatchSignalsExpectedSignals')\n }\n\n const ifMissing =\n typeof onlyIfMissing === 'string' && onlyIfMissing.trim() === 'true'\n mergePatch(jsStrToObject(signals), { ifMissing })\n },\n})\n"], - "mappings": "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", - "names": ["lol", "DSP", "DSS", "DATASTAR_FETCH_EVENT", "DATASTAR_PROP_CHANGE_EVENT", "DATASTAR_READY_EVENT", "DATASTAR_SCOPE_CHILDREN_EVENT", "DATASTAR_SIGNAL_PATCH_EVENT", "hasOwn", "isPojo", "obj", "isEmpty", "prop", "hasOwn", "updateLeaves", "fn", "key", "val", "pathToObj", "paths", "result", "path", "value", "keys", "lastKey", "acc", "currentPatch", "queuedEffects", "batchDepth", "notifyIndex", "queuedEffectsLength", "prevSub", "activeSub", "version", "beginBatch", "endBatch", "flush", "dispatch", "startPeeking", "sub", "stopPeeking", "signal", "initialValue", "signalOper", "value_", "flags_", "computedSymbol", "computed", "getter", "c", "computedOper", "effect", "fn", "e", "fn_", "link", "effectOper", "run", "update", "updateComputed", "updateSignal", "startTracking", "oldValue", "endTracking", "s", "value", "notify", "flags", "subs", "subs_", "sub_", "checkDirty", "deps_", "dep", "dep_", "depFlags", "nextDep_", "propagate", "currentValue", "shallowPropagate", "unlink", "prevDep", "depsTail_", "nextDep", "version_", "subsTail_", "newLink", "prevDep_", "prevSub_", "nextSub_", "toRemove", "next", "stack", "top", "isValidLink", "subSubs", "nextSub", "prev_", "checkDepth", "dirty", "firstSub", "hasMultipleSubs", "checkLink", "getPath", "path", "result", "root", "split", "hasOwn", "deep", "prefix", "isArr", "isPojo", "deepObj", "key", "keys", "_", "prop", "newValue", "diff", "patch", "i", "pathStr", "nextVal", "detail", "pathToObj", "DATASTAR_SIGNAL_PATCH_EVENT", "mergePatch", "ifMissing", "mergeInner", "mergePaths", "paths", "options", "target", "targetParent", "toRegExp", "val", "filtered", "include", "exclude", "obj", "includeRe", "excludeRe", "node", "isHTMLOrSVG", "el", "kebab", "str", "camel", "x", "snake", "RE_FUNCTION_LITERAL", "jsStrToObject", "raw", "options", "reviveFunctionStrings", "_k", "value", "trimmed", "revived", "caseFns", "str", "x", "modifyCasing", "mods", "defaultCase", "c", "aliasify", "name", "unaliasify", "url", "error", "ctx", "reason", "metadata", "e", "r", "snake", "q", "c", "actionPlugins", "attributePlugins", "watcherPlugins", "actions", "_", "prop", "removals", "queuedAttributes", "queuedAttributeNames", "observedRoots", "datastarReadyDispatched", "attribute", "plugin", "roots", "root", "applyQueued", "action", "DATASTAR_FETCH_EVENT", "evt", "watcher", "cleanupEls", "els", "el", "elCleanups", "attrCleanups", "cleanup", "aliasedIgnore", "aliasify", "aliasedIgnoreAttr", "shouldIgnore", "applyEls", "onlyNew", "appliedKeys", "key", "attrKey", "applyAttributePlugin", "attr", "observe", "mutations", "target", "type", "attributeName", "addedNodes", "removedNodes", "node", "isHTMLOrSVG", "rawAttrKey", "unaliasify", "value", "mutationObserver", "parseAttributeKey", "rawKey", "namePart", "rawModifiers", "pluginName", "mods", "rawMod", "label", "mod", "isDocumentObserverActive", "dispatchDatastarReady", "DATASTAR_READY_EVENT", "observeRoot", "applyAttributePlugin", "el", "attrKey", "value", "onlyNew", "rawKey", "unaliasify", "pluginName", "key", "mods", "parseAttributeKey", "plugin", "attributePlugins", "queuedAttributeNames", "ctx", "error", "actionPlugins", "keyReq", "valueReq", "keyProvided", "valueProvided", "cleanups", "cachedRx", "args", "genRx", "cleanup", "elCleanups", "removals", "attrCleanups", "oldCleanup", "returnsValue", "argNames", "expr", "statementRe", "statements", "lastIdx", "last", "escaped", "escapeRe", "DSP", "DSS", "counter", "match", "k", "v", "quoted", "interpolationExpr", "signalName", "_", "innerSignalName", "acc", "part", "fn", "action", "name", "evt", "err", "actions", "root", "e", "action", "_", "fn", "startPeeking", "stopPeeking", "action", "_", "value", "filter", "startPeeking", "masked", "filtered", "updateLeaves", "mergePatch", "stopPeeking", "action", "_", "filter", "startPeeking", "masked", "filtered", "updateLeaves", "oldValue", "mergePatch", "stopPeeking", "abortControllers", "methodSupportsRequestBody", "method", "createHttpMethod", "name", "openWhenHiddenDefault", "action", "el", "evt", "error", "cleanups", "url", "selector", "userHeaders", "contentType", "include", "exclude", "openWhenHidden", "payload", "requestCancellation", "retry", "retryInterval", "retryScaler", "retryMaxWait", "retryMaxCount", "controller", "cleanupFn", "initialHeaders", "headers", "req", "response", "dispatchFetch", "ERROR", "type", "argsRawLines", "line", "i", "k", "v", "argsRaw", "isWrongContent", "RETRYING", "buildFetchEventSourceInit", "urlInstance", "queryParams", "startPeeking", "requestPayload", "filtered", "stopPeeking", "body", "formEl", "formData", "submitter", "preventDefault", "multipart", "formParams", "key", "value", "STARTED", "fetchEventSource", "e", "FINISHED", "RETRIES_FAILED", "DATASTAR_FETCH_EVENT", "err", "getBytes", "stream", "onChunk", "reader", "result", "getLines", "onLine", "buffer", "position", "fieldLength", "discardTrailingNewline", "arr", "concat", "bufLength", "lineStart", "lineEnd", "getMessages", "onId", "onRetry", "onMessage", "message", "newMessage", "decoder", "field", "valueOffset", "a", "b", "res", "resolve", "reject", "fetchInit", "input", "inputSignal", "inputHeaders", "inputOnOpen", "onmessage", "onclose", "onerror", "inputFetch", "responseOverrides", "rest", "curRequestController", "onVisibilityChange", "currentFetchInit", "create", "retryTimer", "dispose", "fetch", "onopen", "retries", "baseRetryInterval", "retryRequest", "curRequestSignal", "dispatchNonSSE", "dispatchType", "argNames", "n", "kebab", "o", "status", "isNoContentStatus", "isRedirectStatus", "isErrorStatus", "ct", "script", "scriptAttributesHeader", "id", "innerErr", "attribute", "el", "key", "rx", "syncAttr", "val", "_k", "v", "update", "observer", "obj", "attributeFilter", "cleanup", "effect", "propAdapter", "prop", "events", "el", "value", "attrAdapter", "attr", "valueAdapter", "treatUndefinedAsString", "type", "dataURIRegex", "empty", "boundPath", "key", "rawKey", "signalName", "adapter", "initialValue", "rawAttribute", "aliasify", "selector", "checked", "input", "mergePaths", "inputs", "paths", "i", "hasOwn", "attribute", "mods", "error", "modifyCasing", "props", "syncSignal", "files", "signalFiles", "f", "resolve", "reader", "match", "typeMap", "option", "firstProp", "camel", "getPath", "path", "signalValue", "eventName", "DATASTAR_PROP_CHANGE_EVENT", "cleanup", "effect", "attribute", "key", "el", "mods", "rx", "modifyCasing", "classes", "callback", "observer", "k", "classNames", "cn", "name", "cleanup", "effect", "attribute", "key", "mods", "rx", "error", "mergePaths", "modifyCasing", "computed", "patch", "updateLeaves", "old", "mergePatch", "attribute", "rx", "effect", "attribute", "el", "key", "mods", "value", "signalName", "modifyCasing", "activeFetches", "mergePaths", "watcher", "event", "type", "elt", "STARTED", "FINISHED", "DATASTAR_FETCH_EVENT", "tagToMs", "args", "arg", "tagHas", "tags", "tag", "defaultValue", "tagFirst", "delay", "callback", "wait", "args", "throttle", "leading", "trailing", "debounce", "lastArgs", "timer", "modifyTiming", "mods", "delayArgs", "tagToMs", "debounceArgs", "tagHas", "throttleArgs", "supportsViewTransitions", "modifyViewTransition", "callback", "mods", "cb", "args", "attribute", "rx", "mods", "callback", "beginBatch", "endBatch", "modifyViewTransition", "wait", "delayArgs", "tagToMs", "delay", "attribute", "el", "value", "mods", "spaces", "filters", "jsStrToObject", "callback", "observer", "filtered", "cleanup", "effect", "attribute", "el", "key", "mods", "rx", "target", "callback", "evt", "beginBatch", "endBatch", "modifyViewTransition", "modifyTiming", "eventName", "modifyCasing", "evtListOpts", "cb", "DATASTAR_FETCH_EVENT", "DATASTAR_SIGNAL_PATCH_EVENT", "listener", "clamp", "value", "min", "max", "once", "attribute", "el", "mods", "rx", "callback", "beginBatch", "endBatch", "modifyViewTransition", "modifyTiming", "options", "threshold", "clamp", "tagFirst", "exit", "observer", "entries", "entry", "attribute", "mods", "rx", "callback", "beginBatch", "endBatch", "modifyViewTransition", "duration", "durationArgs", "tagToMs", "tagHas", "intervalId", "attribute", "el", "key", "mods", "rx", "error", "filterAttr", "aliasify", "filtersRaw", "filters", "jsStrToObject", "running", "callback", "modifyTiming", "evt", "watched", "filtered", "isEmpty", "beginBatch", "endBatch", "DATASTAR_SIGNAL_PATCH_EVENT", "attribute", "el", "key", "mods", "value", "signalName", "modifyCasing", "mergePaths", "NONE", "DISPLAY", "attribute", "el", "rx", "update", "observer", "cleanup", "effect", "attribute", "key", "mods", "rx", "ifMissing", "modifyCasing", "value", "mergePaths", "patch", "mergePatch", "attribute", "key", "el", "rx", "style", "initialStyles", "apply", "prop", "value", "initial", "update", "observer", "styles", "kebab", "cleanup", "effect", "attribute", "el", "rx", "update", "observer", "cleanup", "effect", "isValidType", "arr", "value", "PATCH_MODES", "NAMESPACES", "watcher", "ctx", "args", "selector", "mode", "namespace", "useViewTransitionRaw", "elements", "args2", "supportsViewTransitions", "onPatchElements", "error", "newContent", "consume", "elementsWithSvgsRemoved", "hasHtml", "hasHead", "hasBody", "wrapperTag", "wrappedEls", "newDocument", "wrapperEl", "child", "children", "target", "applyToTargets", "targets", "targetList", "scripts", "script", "execute", "elScripts", "old", "name", "applyPatchMode", "element", "action", "used", "nextNode", "morph", "scopeHost", "DATASTAR_SCOPE_CHILDREN_EVENT", "ctxIdMap", "ctxPersistentIds", "oldIdTagNameMap", "duplicateIds", "ctxPantry", "aliasedIgnoreMorph", "aliasify", "aliasedIgnoreMorphAttr", "oldElt", "isHTMLOrSVG", "normalizedElt", "oldIdElements", "id", "tagName", "newIdElements", "parent", "populateIdMapWithTree", "morphChildren", "oldParent", "newParent", "insertionPoint", "endPoint", "newChild", "bestMatch", "findBestMatch", "cursor", "tempNode", "removeNode", "morphNode", "movedChild", "current", "idSet", "moveBefore", "namespaceURI", "newEmptyChild", "newClonedChild", "node", "startPoint", "nextSibling", "siblingSoftMatchCount", "displaceMatchCount", "nodeMatchCount", "isSoftMatch", "isIdSetMatch", "oldSet", "newSet", "oldNode", "newNode", "parentNode", "after", "aliasedPreserveAttr", "type", "newElt", "shouldScopeChildren", "preserveAttrs", "updateElementProp", "newEltHasAttr", "shouldDispatchPropChangeEvent", "newValue", "DATASTAR_PROP_CHANGE_EVENT", "root", "elt", "watcher", "error", "signals", "onlyIfMissing", "ifMissing", "mergePatch", "jsStrToObject"] + "sourcesContent": ["const lol = /\uD83D\uDD95JS_DS\uD83D\uDE80/.source\nexport const DSP = lol.slice(0, 5)\nexport const DSS = lol.slice(4)\nexport const DATASTAR_FETCH_EVENT = 'datastar-fetch'\nexport const DATASTAR_PROP_CHANGE_EVENT = 'datastar-prop-change'\nexport const DATASTAR_READY_EVENT = 'datastar-ready'\nexport const DATASTAR_SCOPE_CHILDREN_EVENT = 'datastar-scope-children'\nexport const DATASTAR_SIGNAL_PATCH_EVENT = 'datastar-signal-patch'\n", "export const hasOwn: (obj: object, prop: PropertyKey) => boolean =\n // @ts-expect-error\n Object.hasOwn ?? Object.prototype.hasOwnProperty.call\n", "import type { Paths } from '@engine/types'\nimport { hasOwn } from '@utils/polyfills'\n\nexport const isPojo = (obj: any): obj is Record =>\n obj !== null &&\n typeof obj === 'object' &&\n (Object.getPrototypeOf(obj) === Object.prototype ||\n Object.getPrototypeOf(obj) === null)\n\nexport const isEmpty = (obj: Record): boolean => {\n for (const prop in obj) {\n if (hasOwn(obj, prop)) {\n return false\n }\n }\n return true\n}\n\nexport const updateLeaves = (\n obj: Record,\n fn: (oldValue: any) => any,\n) => {\n for (const key in obj) {\n const val = obj[key]\n if (isPojo(val) || Array.isArray(val)) {\n updateLeaves(val, fn)\n } else {\n obj[key] = fn(val)\n }\n }\n}\n\nexport const pathToObj = (paths: Paths): Record => {\n const result: Record = {}\n for (const [path, value] of paths) {\n const keys = path.split('.')\n const lastKey = keys.pop()!\n const obj = keys.reduce((acc, key) => (acc[key] ??= {}), result)\n obj[lastKey] = value\n }\n return result\n}\n", "import { DATASTAR_SIGNAL_PATCH_EVENT } from '@engine/consts'\nimport type {\n Computed,\n Effect,\n JSONPatch,\n MergePatchArgs,\n Paths,\n Signal,\n SignalFilterOptions,\n} from '@engine/types'\nimport { isPojo, pathToObj } from '@utils/paths'\nimport { hasOwn } from '@utils/polyfills'\n\ninterface ReactiveNode {\n deps_?: Link\n depsTail_?: Link\n subs_?: Link\n subsTail_?: Link\n flags_: ReactiveFlags\n}\n\ninterface Link {\n version_: number\n dep_: ReactiveNode\n sub_: ReactiveNode\n prevSub_?: Link\n nextSub_?: Link\n prevDep_?: Link\n nextDep_?: Link\n}\n\ninterface Stack {\n value_: T\n prev_?: Stack\n}\n\nenum ReactiveFlags {\n None = 0,\n Mutable = 1 << 0,\n Watching = 1 << 1,\n RecursedCheck = 1 << 2,\n Recursed = 1 << 3,\n Dirty = 1 << 4,\n Pending = 1 << 5,\n}\n\nenum EffectFlags {\n Queued = 1 << 6,\n}\n\ninterface AlienEffect extends ReactiveNode {\n fn_(): void\n}\n\ninterface AlienComputed extends ReactiveNode {\n value_?: T\n getter(previousValue?: T): T\n}\n\ninterface AlienSignal extends ReactiveNode {\n previousValue: T\n value_: T\n}\n\nconst currentPatch: Paths = []\nconst queuedEffects: (AlienEffect | undefined)[] = []\nlet batchDepth = 0\nlet notifyIndex = 0\nlet queuedEffectsLength = 0\nlet prevSub: ReactiveNode | undefined\nlet activeSub: ReactiveNode | undefined\nlet version = 0\n\nexport const beginBatch = (): void => {\n batchDepth++\n}\n\nexport const endBatch = (): void => {\n if (!--batchDepth) {\n flush()\n dispatch()\n }\n}\n\nexport const startPeeking = (sub?: ReactiveNode): void => {\n prevSub = activeSub\n activeSub = sub\n}\n\nexport const stopPeeking = (): void => {\n activeSub = prevSub\n prevSub = undefined\n}\n\nexport const signal = (initialValue?: T): Signal => {\n return signalOper.bind(0, {\n previousValue: initialValue,\n value_: initialValue,\n flags_: 1 satisfies ReactiveFlags.Mutable,\n }) as Signal\n}\n\nconst computedSymbol = Symbol('computed')\nexport const computed = (getter: (previousValue?: T) => T): Computed => {\n const c = computedOper.bind(0, {\n flags_: 17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty,\n getter,\n }) as Computed\n // @ts-expect-error\n c[computedSymbol] = 1\n return c\n}\n\nexport const effect = (fn: () => void): Effect => {\n const e: AlienEffect = {\n fn_: fn,\n flags_: 2 satisfies ReactiveFlags.Watching,\n }\n if (activeSub) {\n link(e, activeSub)\n }\n startPeeking(e)\n beginBatch()\n try {\n e.fn_()\n } finally {\n endBatch()\n stopPeeking()\n }\n return effectOper.bind(0, e)\n}\n\nconst flush = () => {\n while (notifyIndex < queuedEffectsLength) {\n const effect = queuedEffects[notifyIndex]!\n queuedEffects[notifyIndex++] = undefined\n run(effect, (effect.flags_ &= ~EffectFlags.Queued))\n }\n notifyIndex = 0\n queuedEffectsLength = 0\n}\n\nconst update = (signal: AlienSignal | AlienComputed): boolean => {\n if ('getter' in signal) {\n return updateComputed(signal)\n }\n return updateSignal(signal, signal.value_)\n}\n\nconst updateComputed = (c: AlienComputed): boolean => {\n startPeeking(c)\n startTracking(c)\n try {\n const oldValue = c.value_\n return oldValue !== (c.value_ = c.getter(oldValue))\n } finally {\n stopPeeking()\n endTracking(c)\n }\n}\n\nconst updateSignal = (s: AlienSignal, value: T): boolean => {\n s.flags_ = 1 satisfies ReactiveFlags.Mutable\n return s.previousValue !== (s.previousValue = value)\n}\n\nconst notify = (e: AlienEffect): void => {\n const flags = e.flags_\n if (!(flags & EffectFlags.Queued)) {\n e.flags_ = flags | EffectFlags.Queued\n const subs = e.subs_\n if (subs) {\n notify(subs.sub_ as AlienEffect)\n } else {\n queuedEffects[queuedEffectsLength++] = e\n }\n }\n}\n\nconst run = (e: AlienEffect, flags: ReactiveFlags): void => {\n if (\n flags & (16 satisfies ReactiveFlags.Dirty) ||\n (flags & (32 satisfies ReactiveFlags.Pending) && checkDirty(e.deps_!, e))\n ) {\n startPeeking(e)\n startTracking(e)\n beginBatch()\n try {\n e.fn_()\n } finally {\n endBatch()\n stopPeeking()\n endTracking(e)\n }\n return\n }\n if (flags & (32 satisfies ReactiveFlags.Pending)) {\n e.flags_ = flags & ~(32 satisfies ReactiveFlags.Pending)\n }\n let link = e.deps_\n while (link) {\n const dep = link.dep_\n const depFlags = dep.flags_\n if (depFlags & EffectFlags.Queued) {\n run(dep as AlienEffect, (dep.flags_ = depFlags & ~EffectFlags.Queued))\n }\n link = link.nextDep_\n }\n}\n\nconst signalOper = (s: AlienSignal, ...value: [T]): T | boolean => {\n if (value.length) {\n if (s.value_ !== (s.value_ = value[0])) {\n s.flags_ = 17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty\n const subs = s.subs_\n if (subs) {\n propagate(subs)\n if (!batchDepth) {\n flush()\n }\n }\n return true\n }\n return false\n }\n const currentValue = s.value_\n if (s.flags_ & (16 satisfies ReactiveFlags.Dirty)) {\n if (updateSignal(s, currentValue)) {\n const subs_ = s.subs_\n if (subs_) {\n shallowPropagate(subs_)\n }\n }\n }\n if (activeSub) {\n link(s, activeSub)\n }\n return currentValue\n}\n\nconst computedOper = (c: AlienComputed): T => {\n const flags = c.flags_\n if (\n flags & (16 satisfies ReactiveFlags.Dirty) ||\n (flags & (32 satisfies ReactiveFlags.Pending) && checkDirty(c.deps_!, c))\n ) {\n if (updateComputed(c)) {\n const subs = c.subs_\n if (subs) {\n shallowPropagate(subs)\n }\n }\n } else if (flags & (32 satisfies ReactiveFlags.Pending)) {\n c.flags_ = flags & ~(32 satisfies ReactiveFlags.Pending)\n }\n if (activeSub) {\n link(c, activeSub)\n }\n return c.value_!\n}\n\nconst effectOper = (e: AlienEffect): void => {\n let dep = e.deps_\n while (dep) {\n dep = unlink(dep, e)\n }\n const sub = e.subs_\n if (sub) {\n unlink(sub)\n }\n e.flags_ = 0 satisfies ReactiveFlags.None\n}\n\nconst link = (dep: ReactiveNode, sub: ReactiveNode): void => {\n const prevDep = sub.depsTail_\n if (prevDep && prevDep.dep_ === dep) {\n return\n }\n const nextDep = prevDep ? prevDep.nextDep_ : sub.deps_\n if (nextDep && nextDep.dep_ === dep) {\n nextDep.version_ = version\n sub.depsTail_ = nextDep\n return\n }\n const prevSub = dep.subsTail_\n if (prevSub && prevSub.version_ === version && prevSub.sub_ === sub) {\n return\n }\n const newLink =\n (sub.depsTail_ =\n dep.subsTail_ =\n {\n version_: version,\n dep_: dep,\n sub_: sub,\n prevDep_: prevDep,\n nextDep_: nextDep,\n prevSub_: prevSub,\n })\n if (nextDep) {\n nextDep.prevDep_ = newLink\n }\n if (prevDep) {\n prevDep.nextDep_ = newLink\n } else {\n sub.deps_ = newLink\n }\n if (prevSub) {\n prevSub.nextSub_ = newLink\n } else {\n dep.subs_ = newLink\n }\n}\n\nconst unlink = (link: Link, sub = link.sub_): Link | undefined => {\n const dep_ = link.dep_\n const prevDep_ = link.prevDep_\n const nextDep_ = link.nextDep_\n const nextSub_ = link.nextSub_\n const prevSub_ = link.prevSub_\n if (nextDep_) {\n nextDep_.prevDep_ = prevDep_\n } else {\n sub.depsTail_ = prevDep_\n }\n if (prevDep_) {\n prevDep_.nextDep_ = nextDep_\n } else {\n sub.deps_ = nextDep_\n }\n if (nextSub_) {\n nextSub_.prevSub_ = prevSub_\n } else {\n dep_.subsTail_ = prevSub_\n }\n if (prevSub_) {\n prevSub_.nextSub_ = nextSub_\n } else if (!(dep_.subs_ = nextSub_)) {\n if ('getter' in dep_) {\n let toRemove = dep_.deps_\n if (toRemove) {\n dep_.flags_ = 17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty\n do {\n toRemove = unlink(toRemove, dep_)\n } while (toRemove)\n }\n } else if (!('previousValue' in dep_)) {\n effectOper(dep_ as AlienEffect)\n }\n }\n return nextDep_\n}\n\nconst propagate = (link: Link): void => {\n let next = link.nextSub_\n let stack: Stack | undefined\n\n top: while (true) {\n const sub = link.sub_\n\n let flags = sub.flags_\n\n if (\n !(\n flags &\n (60 as\n | ReactiveFlags.RecursedCheck\n | ReactiveFlags.Recursed\n | ReactiveFlags.Dirty\n | ReactiveFlags.Pending)\n )\n ) {\n sub.flags_ = flags | (32 satisfies ReactiveFlags.Pending)\n } else if (\n !(flags & (12 as ReactiveFlags.RecursedCheck | ReactiveFlags.Recursed))\n ) {\n flags = 0 satisfies ReactiveFlags.None\n } else if (!(flags & (4 satisfies ReactiveFlags.RecursedCheck))) {\n sub.flags_ =\n (flags & ~(8 satisfies ReactiveFlags.Recursed)) |\n (32 satisfies ReactiveFlags.Pending)\n } else if (\n !(flags & (48 as ReactiveFlags.Dirty | ReactiveFlags.Pending)) &&\n isValidLink(link, sub)\n ) {\n sub.flags_ =\n flags | (40 as ReactiveFlags.Recursed | ReactiveFlags.Pending)\n flags &= 1 satisfies ReactiveFlags.Mutable\n } else {\n flags = 0 satisfies ReactiveFlags.None\n }\n\n if (flags & (2 satisfies ReactiveFlags.Watching)) {\n notify(sub as AlienEffect)\n }\n\n if (flags & (1 satisfies ReactiveFlags.Mutable)) {\n const subSubs = sub.subs_\n if (subSubs) {\n const nextSub = (link = subSubs).nextSub_\n if (nextSub) {\n stack = { value_: next, prev_: stack }\n next = nextSub\n }\n continue\n }\n }\n\n if ((link = next!)) {\n next = link.nextSub_\n continue\n }\n\n while (stack) {\n link = stack.value_!\n stack = stack.prev_\n if (link) {\n next = link.nextSub_\n continue top\n }\n }\n\n break\n }\n}\n\nconst startTracking = (sub: ReactiveNode): void => {\n version++\n sub.depsTail_ = undefined\n sub.flags_ =\n (sub.flags_ &\n ~(56 as\n | ReactiveFlags.Recursed\n | ReactiveFlags.Dirty\n | ReactiveFlags.Pending)) |\n (4 satisfies ReactiveFlags.RecursedCheck)\n}\n\nconst endTracking = (sub: ReactiveNode): void => {\n const depsTail_ = sub.depsTail_\n let toRemove = depsTail_ ? depsTail_.nextDep_ : sub.deps_\n while (toRemove) {\n toRemove = unlink(toRemove, sub)\n }\n sub.flags_ &= ~(4 satisfies ReactiveFlags.RecursedCheck)\n}\n\nconst checkDirty = (link: Link, sub: ReactiveNode): boolean => {\n let stack: Stack | undefined\n let checkDepth = 0\n let dirty = false\n\n top: while (true) {\n const dep = link.dep_\n const flags = dep.flags_\n\n if (sub.flags_ & (16 satisfies ReactiveFlags.Dirty)) {\n dirty = true\n } else if (\n (flags & (17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty)) ===\n (17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty)\n ) {\n if (update(dep as AlienSignal | AlienComputed)) {\n const subs = dep.subs_!\n if (subs.nextSub_) {\n shallowPropagate(subs)\n }\n dirty = true\n }\n } else if (\n (flags & (33 as ReactiveFlags.Mutable | ReactiveFlags.Pending)) ===\n (33 as ReactiveFlags.Mutable | ReactiveFlags.Pending)\n ) {\n if (link.nextSub_ || link.prevSub_) {\n stack = { value_: link, prev_: stack }\n }\n link = dep.deps_!\n sub = dep\n ++checkDepth\n continue\n }\n\n if (!dirty) {\n const nextDep = link.nextDep_\n if (nextDep) {\n link = nextDep\n continue\n }\n }\n\n while (checkDepth--) {\n const firstSub = sub.subs_!\n const hasMultipleSubs = firstSub.nextSub_\n if (hasMultipleSubs) {\n link = stack!.value_\n stack = stack!.prev_\n } else {\n link = firstSub\n }\n if (dirty) {\n if (update(sub as AlienSignal | AlienComputed)) {\n if (hasMultipleSubs) {\n shallowPropagate(firstSub)\n }\n sub = link.sub_\n continue\n }\n dirty = false\n } else {\n sub.flags_ &= ~(32 satisfies ReactiveFlags.Pending)\n }\n sub = link.sub_\n if (link.nextDep_) {\n link = link.nextDep_\n continue top\n }\n }\n\n return dirty\n }\n}\n\nconst shallowPropagate = (link: Link): void => {\n do {\n const sub = link.sub_\n const flags = sub.flags_\n if (\n (flags & (48 as ReactiveFlags.Pending | ReactiveFlags.Dirty)) ===\n (32 satisfies ReactiveFlags.Pending)\n ) {\n sub.flags_ = flags | (16 satisfies ReactiveFlags.Dirty)\n if (flags & (2 satisfies ReactiveFlags.Watching)) {\n notify(sub as AlienEffect)\n }\n }\n } while ((link = link.nextSub_!))\n}\n\nconst isValidLink = (checkLink: Link, sub: ReactiveNode): boolean => {\n let link = sub.depsTail_\n while (link) {\n if (link === checkLink) {\n return true\n }\n link = link.prevDep_\n }\n return false\n}\n\nexport const getPath = (path: string): T | undefined => {\n let result = root\n const split = path.split('.')\n for (const path of split) {\n if (result == null || !hasOwn(result, path)) {\n return\n }\n result = result[path]\n }\n return result as T\n}\n\nconst deep = (value: any, prefix = ''): any => {\n const isArr = Array.isArray(value)\n if (isArr || isPojo(value)) {\n const deepObj = (isArr ? [] : {}) as Record>\n for (const key in value) {\n deepObj[key] = signal(\n deep((value as Record>)[key], `${prefix + key}.`),\n )\n }\n const keys = signal(0)\n return new Proxy(deepObj, {\n get(_, prop: string) {\n // JSON.stringify calls `.toJSON()` directly instead of checking if it exists on the object\n // so we have to check if `toJSON` is being called and prevent a signal from automatically\n // being made so JSON.stringify can fallback to the default stringify\n if (!(prop === 'toJSON' && !hasOwn(deepObj, prop))) {\n // special case for when prop is an array function because every array function needs to\n // be reactive to when the keys change\n if (isArr && prop in Array.prototype) {\n keys()\n return deepObj[prop]\n }\n // if prop is a symbol just return the symbol because we don't want to make up that theres\n // an iterator symbol on an object or not\n if (typeof prop === 'symbol') {\n return deepObj[prop]\n }\n // if obj doesnt have prop OR prop is null or undefined then create a signal and default\n // to an empty string\n if (!hasOwn(deepObj, prop) || deepObj[prop]() == null) {\n deepObj[prop] = signal('')\n dispatch(prefix + prop, '')\n keys(keys() + 1)\n }\n return deepObj[prop]()\n }\n },\n set(_, prop: string, newValue) {\n const path = prefix + prop\n // special case for when setting length so we can make a diff patch\n if (isArr && prop === 'length') {\n const diff = (deepObj[prop] as unknown as number) - newValue\n deepObj[prop] = newValue\n // manually make a diff patch for now, shouldnt have to do this when object diffing is\n // implemented. see https://github.com/starfederation/datastar-dev/issues/274\n if (diff > 0) {\n const patch: Record = {}\n for (let i = newValue; i < deepObj[prop]; i++) {\n patch[i] = null\n }\n dispatch(prefix.slice(0, -1), patch)\n keys(keys() + 1)\n }\n } else if (hasOwn(deepObj, prop)) {\n if (newValue == null) {\n delete deepObj[prop]\n // if newValue is a computed set the computed directly instead of wrapping in signal\n } else if (hasOwn(newValue, computedSymbol)) {\n deepObj[prop] = newValue\n dispatch(path, '')\n // if prop changed after setting it then dispatch\n } else {\n const currentValue = deepObj[prop]()\n const pathStr = `${path}.`\n if (isPojo(currentValue) && isPojo(newValue)) {\n for (const key in currentValue) {\n if (!hasOwn(newValue, key)) {\n delete currentValue[key]\n dispatch(pathStr + key, null)\n }\n }\n for (const key in newValue) {\n const nextVal = newValue[key]\n if (currentValue[key] !== nextVal) {\n currentValue[key] = nextVal\n }\n }\n } else if (deepObj[prop](deep(newValue, pathStr))) {\n dispatch(path, newValue)\n }\n }\n // if newValue is null or undefined then noop\n } else if (newValue != null) {\n // if newValue is a computed set the computed directly instead of wrapping in signal\n if (hasOwn(newValue, computedSymbol)) {\n deepObj[prop] = newValue\n dispatch(path, '')\n } else {\n deepObj[prop] = signal(deep(newValue, `${path}.`))\n dispatch(path, newValue)\n }\n keys(keys() + 1)\n }\n\n return true\n },\n deleteProperty(_, prop: string) {\n delete deepObj[prop]\n keys(keys() + 1)\n return true\n },\n ownKeys() {\n keys()\n return Reflect.ownKeys(deepObj)\n },\n has(_, prop) {\n keys()\n return prop in deepObj\n },\n })\n }\n return value\n}\n\nconst dispatch = (path?: string, value?: any) => {\n if (path !== undefined && value !== undefined) {\n currentPatch.push([path, value])\n }\n if (!batchDepth && currentPatch.length) {\n const detail = pathToObj(currentPatch)\n currentPatch.length = 0\n document.dispatchEvent(\n new CustomEvent(DATASTAR_SIGNAL_PATCH_EVENT, {\n detail,\n }),\n )\n }\n}\n\nexport const mergePatch = (\n patch: JSONPatch,\n { ifMissing }: MergePatchArgs = {},\n): void => {\n beginBatch()\n for (const key in patch) {\n if (patch[key] == null) {\n if (!ifMissing) {\n delete root[key]\n }\n } else {\n mergeInner(patch[key], key, root, '', ifMissing)\n }\n }\n endBatch()\n}\n\nexport const mergePaths = (paths: Paths, options?: MergePatchArgs): void =>\n mergePatch(pathToObj(paths), options)\n\nconst mergeInner = (\n patch: any,\n target: string,\n targetParent: Record,\n prefix: string,\n ifMissing: boolean | undefined,\n): void => {\n if (isPojo(patch)) {\n if (\n !(\n hasOwn(targetParent, target) &&\n (isPojo(targetParent[target]) || Array.isArray(targetParent[target]))\n )\n ) {\n targetParent[target] = {}\n }\n\n for (const key in patch) {\n if (patch[key] == null) {\n if (!ifMissing) {\n delete targetParent[target][key]\n }\n } else {\n mergeInner(\n patch[key],\n key,\n targetParent[target],\n `${prefix + target}.`,\n ifMissing,\n )\n }\n }\n } else if (!(ifMissing && hasOwn(targetParent, target))) {\n targetParent[target] = patch\n }\n}\n\nconst toRegExp = (val: string | RegExp): RegExp =>\n typeof val === 'string' ? RegExp(val.replace(/^\\/|\\/$/g, '')) : val\n\n/**\n * Filters the root store based on an include and exclude RegExp\n *\n * @returns The filtered object\n */\nexport const filtered = (\n { include = /.*/, exclude = /(?!)/ }: SignalFilterOptions = {},\n obj: JSONPatch = root,\n): Record => {\n const includeRe = toRegExp(include)\n const excludeRe = toRegExp(exclude)\n const paths: Paths = []\n const stack: [any, string][] = [[obj, '']]\n\n while (stack.length) {\n const [node, prefix] = stack.pop()!\n\n for (const key in node) {\n const path = prefix + key\n if (isPojo(node[key])) {\n stack.push([node[key], `${path}.`])\n } else if (includeRe.test(path) && !excludeRe.test(path)) {\n paths.push([path, getPath(path)])\n }\n }\n }\n\n return pathToObj(paths)\n}\n\nexport const root: Record = deep({})\n", "import type { HTMLOrSVG } from '@engine/types'\n\nexport const isHTMLOrSVG = (el: Node): el is HTMLOrSVG =>\n el instanceof HTMLElement ||\n el instanceof SVGElement ||\n el instanceof MathMLElement\n", "import type { Modifiers } from '@engine/types'\n\nexport const kebab = (str: string): string =>\n str\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1-$2')\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/([a-z])([0-9]+)/gi, '$1-$2')\n .replace(/([0-9]+)([a-z])/gi, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase()\n\nexport const camel = (str: string): string =>\n kebab(str).replace(/-./g, (x) => x[1].toUpperCase())\n\nexport const snake = (str: string): string => kebab(str).replace(/-/g, '_')\n\nexport const pascal = (str: string): string =>\n camel(str).replace(/(^.|(?<=\\.).)/g, (x) => x[0].toUpperCase())\n\nexport const title = (str: string): string =>\n str.replace(/\\b\\w/g, (char) => char.toUpperCase())\n\nconst RE_FUNCTION_LITERAL =\n /^(?:(?:async\\s+)?function\\b|(?:async\\s*)?(?:\\([^)]*\\)|[A-Za-z_$][\\w$]*)\\s*=>)/\n\ntype JsStrToObjectOptions = {\n reviveFunctionStrings?: boolean\n}\n\nexport const jsStrToObject = (\n raw: string,\n options: JsStrToObjectOptions = {},\n) => {\n const { reviveFunctionStrings = false } = options\n try {\n if (!reviveFunctionStrings) return JSON.parse(raw)\n return JSON.parse(raw, (_k, value) => {\n if (typeof value !== 'string') return value\n const trimmed = value.trim()\n if (!RE_FUNCTION_LITERAL.test(trimmed)) return value\n try {\n const revived = Function(`return (${trimmed})`)()\n return typeof revived === 'function' ? revived : value\n } catch {\n return value\n }\n })\n } catch {\n // If JSON parsing fails, try to evaluate as a JavaScript object\n // This is less safe and should be used with caution\n return Function(`return (${raw})`)()\n }\n}\n\nconst caseFns: Record string> = {\n camel: (str) => str.replace(/-[a-z]/g, (x) => x[1].toUpperCase()),\n snake: (str) => str.replace(/-/g, '_'),\n pascal: (str) => str[0].toUpperCase() + caseFns.camel(str.slice(1)),\n}\n\nexport const modifyCasing = (\n str: string,\n mods: Modifiers,\n defaultCase = 'camel',\n): string => {\n for (const c of mods.get('case') || [defaultCase]) {\n str = caseFns[c]?.(str) || str\n }\n return str\n}\n\nexport const aliasify = (name: string) =>\n ALIAS ? `data-${ALIAS}-${name}` : `data-${name}`\n\nexport const unaliasify = (name: string) => {\n if (!ALIAS) return name\n if (!name.startsWith(`${ALIAS}-`)) return null\n return name.slice(ALIAS.length + 1)\n}\n", "import {\n DATASTAR_FETCH_EVENT,\n DATASTAR_READY_EVENT,\n DSP,\n DSS,\n} from '@engine/consts'\nimport { root } from '@engine/signals'\nimport type {\n ActionContext,\n ActionPlugin,\n AttributeContext,\n AttributePlugin,\n DatastarFetchEvent,\n HTMLOrSVG,\n Modifiers,\n Requirement,\n WatcherPlugin,\n} from '@engine/types'\nimport { isHTMLOrSVG } from '@utils/dom'\nimport { aliasify, snake, unaliasify } from '@utils/text'\n\nconst url = 'https://data-star.dev/errors'\n\nconst error = (\n ctx: Record,\n reason: string,\n metadata: Record = {},\n) => {\n Object.assign(metadata, ctx)\n const e = new Error()\n const r = snake(reason)\n const q = new URLSearchParams({\n metadata: JSON.stringify(metadata),\n }).toString()\n const c = JSON.stringify(metadata, null, 2)\n e.message = `${reason}\\nMore info: ${url}/${r}?${q}\\nContext: ${c}`\n return e\n}\n\nconst actionPlugins: Map = new Map()\nconst attributePlugins: Map = new Map()\nconst watcherPlugins: Map = new Map()\n\nexport const actions: Record<\n string,\n (ctx: ActionContext, ...args: any[]) => any\n> = new Proxy(\n {},\n {\n get: (_, prop: string) => actionPlugins.get(prop)?.apply,\n has: (_, prop: string) => actionPlugins.has(prop),\n ownKeys: () => Reflect.ownKeys(actionPlugins),\n set: () => false,\n deleteProperty: () => false,\n },\n)\n\n// Map of cleanups keyed by element, attribute name, and cleanup name\nconst removals = new Map void>>>()\n\nconst queuedAttributes: AttributePlugin[] = []\nconst queuedAttributeNames = new Set()\nconst observedRoots = new Set()\nlet datastarReadyDispatched = false\n\nexport const attribute = (\n plugin: AttributePlugin,\n): void => {\n queuedAttributes.push(plugin as unknown as AttributePlugin)\n\n if (queuedAttributes.length === 1) {\n setTimeout(() => {\n for (const attribute of queuedAttributes) {\n queuedAttributeNames.add(attribute.name)\n attributePlugins.set(attribute.name, attribute)\n }\n queuedAttributes.length = 0\n const roots = observedRoots.size\n ? [...observedRoots]\n : [document.documentElement]\n for (const root of roots) {\n applyQueued(root, !observedRoots.has(root))\n }\n queuedAttributeNames.clear()\n })\n }\n}\n\nexport const action = (plugin: ActionPlugin): void => {\n actionPlugins.set(plugin.name, plugin)\n}\n\ndocument.addEventListener(DATASTAR_FETCH_EVENT, ((\n evt: CustomEvent,\n) => {\n const plugin = watcherPlugins.get(evt.detail.type)\n if (plugin) {\n plugin.apply(\n {\n error: error.bind(0, {\n plugin: { type: 'watcher', name: plugin.name },\n element: {\n id: (evt.target as Element).id,\n tag: (evt.target as Element).tagName,\n },\n }),\n },\n evt.detail.argsRaw,\n )\n }\n}) as EventListener)\n\nexport const watcher = (plugin: WatcherPlugin): void => {\n watcherPlugins.set(plugin.name, plugin)\n}\n\nconst cleanupEls = (els: Iterable): void => {\n for (const el of els) {\n const elCleanups = removals.get(el)\n if (elCleanups && removals.delete(el)) {\n for (const attrCleanups of elCleanups.values()) {\n for (const cleanup of attrCleanups.values()) {\n cleanup()\n }\n }\n }\n }\n}\n\nconst aliasedIgnore = aliasify('ignore')\nconst aliasedIgnoreAttr = `[${aliasedIgnore}]`\nconst shouldIgnore = (el: HTMLOrSVG) =>\n el.hasAttribute(`${aliasedIgnore}__self`) || !!el.closest(aliasedIgnoreAttr)\n\nconst applyEls = (els: Iterable, onlyNew?: boolean): void => {\n for (const el of els) {\n if (!shouldIgnore(el)) {\n const appliedKeys = new Set()\n for (const key in el.dataset) {\n const attrKey = key.replace(/[A-Z]/g, '-$&').toLowerCase()\n appliedKeys.add(attrKey)\n applyAttributePlugin(el, attrKey, el.dataset[key]!, onlyNew)\n }\n for (const attr of Array.from(el.attributes)) {\n if (!attr.name.startsWith('data-')) continue\n const attrKey = attr.name.slice(5)\n if (appliedKeys.has(attrKey)) continue\n applyAttributePlugin(el, attrKey, attr.value, onlyNew)\n }\n }\n }\n}\n\nconst observe = (mutations: MutationRecord[]) => {\n for (const {\n target,\n type,\n attributeName,\n addedNodes,\n removedNodes,\n } of mutations) {\n if (type === 'childList') {\n for (const node of removedNodes) {\n if (isHTMLOrSVG(node)) {\n cleanupEls([node])\n cleanupEls(node.querySelectorAll('*'))\n }\n }\n\n for (const node of addedNodes) {\n if (isHTMLOrSVG(node)) {\n applyEls([node])\n applyEls(node.querySelectorAll('*'))\n }\n }\n } else if (\n type === 'attributes' &&\n attributeName!.startsWith('data-') &&\n isHTMLOrSVG(target) &&\n !shouldIgnore(target)\n ) {\n // skip over 'data-'\n const rawAttrKey = attributeName!.slice(5)\n const key = unaliasify(rawAttrKey)\n if (!key) continue\n const value = target.getAttribute(attributeName!)\n if (value === null) {\n const elCleanups = removals.get(target)\n if (elCleanups) {\n const attrCleanups = elCleanups.get(key)\n if (attrCleanups) {\n for (const cleanup of attrCleanups.values()) {\n cleanup()\n }\n elCleanups.delete(key)\n }\n }\n } else {\n applyAttributePlugin(target, rawAttrKey, value)\n }\n }\n }\n}\n\n// TODO: mutation observer per root so applying to web component doesnt overwrite main observer\nconst mutationObserver = new MutationObserver(observe)\n\nexport const parseAttributeKey = (\n rawKey: string,\n): {\n pluginName: string\n key: string | undefined\n mods: Modifiers\n} => {\n const [namePart, ...rawModifiers] = rawKey.split('__')\n const [pluginName, key] = namePart.split(/:(.+)/)\n const mods: Modifiers = new Map()\n\n for (const rawMod of rawModifiers) {\n const [label, ...mod] = rawMod.split('.')\n mods.set(label, new Set(mod))\n }\n\n return { pluginName, key, mods }\n}\n\nexport const isDocumentObserverActive = () =>\n observedRoots.has(document.documentElement)\n\nconst dispatchDatastarReady = () => {\n if (datastarReadyDispatched || !isDocumentObserverActive()) return\n datastarReadyDispatched = true\n document.dispatchEvent(new Event(DATASTAR_READY_EVENT))\n}\n\nconst applyQueued = (\n root: HTMLOrSVG | ShadowRoot = document.documentElement,\n observeRoot = true,\n): void => {\n if (isHTMLOrSVG(root)) {\n applyEls([root], true)\n }\n applyEls(root.querySelectorAll('*'), true)\n\n if (observeRoot) {\n mutationObserver.observe(root, {\n subtree: true,\n childList: true,\n attributes: true,\n })\n observedRoots.add(root)\n dispatchDatastarReady()\n }\n}\n\nexport const apply = (\n root: HTMLOrSVG | ShadowRoot = document.documentElement,\n observeRoot = true,\n): void => {\n if (isHTMLOrSVG(root)) {\n applyEls([root])\n }\n applyEls(root.querySelectorAll('*'))\n\n if (observeRoot) {\n mutationObserver.observe(root, {\n subtree: true,\n childList: true,\n attributes: true,\n })\n observedRoots.add(root)\n dispatchDatastarReady()\n }\n}\n\nexport const applyElement = (el: HTMLOrSVG, onlyNew = false): void => {\n applyEls([el], onlyNew)\n}\n\nconst applyAttributePlugin = (\n el: HTMLOrSVG,\n attrKey: string,\n value: string,\n onlyNew?: boolean,\n): void => {\n const rawKey = unaliasify(attrKey)\n if (!rawKey) return\n const { pluginName, key, mods } = parseAttributeKey(rawKey)\n const plugin = attributePlugins.get(pluginName)\n const shouldApply =\n (!onlyNew || queuedAttributeNames.has(pluginName)) && !!plugin\n if (shouldApply) {\n const ctx = {\n el,\n rawKey,\n mods,\n error: error.bind(0, {\n plugin: { type: 'attribute', name: plugin.name },\n element: { id: el.id, tag: el.tagName },\n expression: { rawKey, key, value },\n }),\n key,\n value,\n loadedPluginNames: {\n actions: new Set(actionPlugins.keys()),\n attributes: new Set(attributePlugins.keys()),\n },\n rx: undefined,\n } as AttributeContext\n\n const keyReq =\n (plugin.requirement &&\n (typeof plugin.requirement === 'string'\n ? plugin.requirement\n : plugin.requirement.key)) ||\n 'allowed'\n const valueReq =\n (plugin.requirement &&\n (typeof plugin.requirement === 'string'\n ? plugin.requirement\n : plugin.requirement.value)) ||\n 'allowed'\n\n const keyProvided = key !== undefined && key !== null && key !== ''\n const valueProvided = value !== undefined && value !== null && value !== ''\n\n if (keyProvided) {\n if (keyReq === 'denied') {\n throw ctx.error('KeyNotAllowed')\n }\n } else if (keyReq === 'must') {\n throw ctx.error('KeyRequired')\n }\n\n if (valueProvided) {\n if (valueReq === 'denied') {\n throw ctx.error('ValueNotAllowed')\n }\n } else if (valueReq === 'must') {\n throw ctx.error('ValueRequired')\n }\n\n if (keyReq === 'exclusive' || valueReq === 'exclusive') {\n if (keyProvided && valueProvided) {\n throw ctx.error('KeyAndValueProvided')\n }\n if (!keyProvided && !valueProvided) {\n throw ctx.error('KeyOrValueRequired')\n }\n }\n\n const cleanups = new Map void>()\n if (valueProvided) {\n let cachedRx: GenRxFn\n ctx.rx = (...args: any[]) => {\n if (!cachedRx) {\n cachedRx = genRx(value, {\n returnsValue: plugin.returnsValue,\n argNames: plugin.argNames,\n cleanups,\n })\n }\n return cachedRx(el, ...args)\n }\n }\n\n const cleanup = plugin.apply(ctx)\n if (cleanup) {\n cleanups.set('attribute', cleanup)\n }\n\n let elCleanups = removals.get(el)\n if (elCleanups) {\n const attrCleanups = elCleanups.get(rawKey)\n if (attrCleanups) {\n for (const oldCleanup of attrCleanups.values()) {\n oldCleanup()\n }\n }\n } else {\n elCleanups = new Map()\n removals.set(el, elCleanups)\n }\n elCleanups.set(rawKey, cleanups)\n }\n}\n\ntype GenRxOptions = {\n returnsValue?: boolean\n argNames?: string[]\n cleanups?: Map void>\n}\n\ntype GenRxFn = (el: HTMLOrSVG, ...args: any[]) => T\n\nexport const genRx = (\n value: string,\n {\n returnsValue = false,\n argNames = [],\n cleanups = new Map(),\n }: GenRxOptions = {},\n): GenRxFn => {\n let expr = ''\n if (returnsValue) {\n // This regex allows Datastar expressions to support nested\n // regex and strings that contain ; without breaking.\n //\n // Each of these regex defines a block type we want to match\n // (importantly we ignore the content within these blocks):\n //\n // regex \\/(\\\\\\/|[^\\/])*\\/\n // double quotes \"(\\\\\"|[^\\\"])*\"\n // single quotes '(\\\\'|[^'])*'\n // ticks `(\\\\`|[^`])*`\n // iife \\(\\s*((function)\\s*\\(\\s*\\)|(\\(\\s*\\))\\s*=>)\\s*(?:\\{[\\s\\S]*?\\}|[^;)\\{]*)\\s*\\)\\s*\\(\\s*\\)\n //\n // The iife support is (intentionally) limited. It only supports\n // function and arrow syntax with no arguments, and no nested IIFEs.\n //\n // We also want to match the non delimiter part of statements\n // note we only support ; statement delimiters:\n //\n // [^;]\n //\n const statementRe =\n /(\\/(\\\\\\/|[^/])*\\/|\"(\\\\\"|[^\"])*\"|'(\\\\'|[^'])*'|`(\\\\`|[^`])*`|\\(\\s*((function)\\s*\\(\\s*\\)|(\\(\\s*\\))\\s*=>)\\s*(?:\\{[\\s\\S]*?\\}|[^;){]*)\\s*\\)\\s*\\(\\s*\\)|[^;])+/gm\n const statements = value.trim().match(statementRe)\n if (statements) {\n const lastIdx = statements.length - 1\n const last = statements[lastIdx].trim()\n if (!last.startsWith('return')) {\n statements[lastIdx] = `return (${last});`\n }\n expr = statements.join(';\\n')\n }\n } else {\n expr = value.trim()\n }\n\n // Ignore any escaped values\n const escaped = new Map()\n const escapeRe = RegExp(`(?:${DSP})(.*?)(?:${DSS})`, 'gm')\n let counter = 0\n for (const match of expr.matchAll(escapeRe)) {\n const k = match[1]\n const v = `__escaped${counter++}`\n escaped.set(v, k)\n expr = expr.replace(DSP + k + DSS, v)\n }\n\n // Replace signal references with bracket notation\n // Examples:\n // $count -> $['count']\n // $count-- -> $['count']--\n // $foo.bar -> $['foo']['bar']\n // $foo-bar -> $['foo-bar']\n // $foo.bar-baz -> $['foo']['bar-baz']\n // $foo-$bar -> $['foo']-$['bar']\n // $arr[$index] -> $['arr'][$['index']]\n // $['foo'] -> $['foo']\n // $foo[obj.bar] -> $['foo'][obj.bar]\n // $foo['bar.baz'] -> $['foo']['bar.baz']\n // $123 -> $['123']\n // $foo.0.name -> $['foo']['0']['name']\n\n // Skip replacements inside string/template literals.\n // Template interpolation support rewrites `${...}` only when braces are non-nested.\n expr = expr.replace(\n /(\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*'|`(?:\\\\.|[^`\\\\$]|\\$(?!\\{))*`)|\\$\\{([^{}]*)\\}|\\$([a-zA-Z_\\d]\\w*(?:[.-]\\w+)*)/g,\n (match, quoted, interpolationExpr, signalName) => {\n if (quoted) return match\n if (interpolationExpr !== undefined) {\n return `\\${${interpolationExpr.replace(\n /\\$([a-zA-Z_\\d]\\w*(?:[.-]\\w+)*)/g,\n (_: string, innerSignalName: string) =>\n innerSignalName\n .split('.')\n .reduce((acc: string, part: string) => `${acc}['${part}']`, '$'),\n )}}`\n }\n return signalName\n .split('.')\n .reduce((acc: string, part: string) => `${acc}['${part}']`, '$')\n },\n )\n\n expr = expr.replaceAll(/@([A-Za-z_$][\\w$]*)\\(/g, '__action(\"$1\",evt,')\n\n // Replace any escaped values\n for (const [k, v] of escaped) {\n expr = expr.replace(k, v)\n }\n\n try {\n const fn = Function('el', '$', '__action', 'evt', ...argNames, expr)\n return (el: HTMLOrSVG, ...args: any[]) => {\n const action = (name: string, evt: Event | undefined, ...args: any[]) => {\n const err = error.bind(0, {\n plugin: { type: 'action', name },\n element: { id: el.id, tag: el.tagName },\n expression: {\n fnContent: expr,\n value,\n },\n })\n const fn = actions[name]\n if (fn) {\n return fn(\n {\n el,\n evt,\n error: err,\n cleanups,\n },\n ...args,\n )\n }\n throw err('UndefinedAction')\n }\n try {\n return fn(el, root, action, undefined, ...args)\n } catch (e: any) {\n console.error(e)\n throw error(\n {\n element: { id: el.id, tag: el.tagName },\n expression: {\n fnContent: expr,\n value,\n },\n error: e.message,\n },\n 'ExecuteExpression',\n )\n }\n }\n } catch (e: any) {\n console.error(e)\n throw error(\n {\n expression: {\n fnContent: expr,\n value,\n },\n error: e.message,\n },\n 'GenerateExpression',\n )\n }\n}\n", "// Icon: ion:eye\n// Slug: Access signals without subscribing to changes.\n// Description: Allows accessing signals without subscribing to their changes in expressions.\n\nimport { action } from '@engine'\nimport { startPeeking, stopPeeking } from '@engine/signals'\n\naction({\n name: 'peek',\n apply(_, fn: () => any) {\n startPeeking()\n try {\n return fn()\n } finally {\n stopPeeking()\n }\n },\n})\n", "// Icon: ion:checkmark-round\n// Slug: Sets the value of all matching signals.\n// Description: Sets the value of all matching signals (or all signals if no filter is used) to the expression provided in the first argument.\n\nimport { action } from '@engine'\nimport {\n filtered,\n mergePatch,\n startPeeking,\n stopPeeking,\n} from '@engine/signals'\nimport type { SignalFilterOptions } from '@engine/types'\nimport { updateLeaves } from '@utils/paths'\n\naction({\n name: 'setAll',\n apply(_, value: any, filter: SignalFilterOptions) {\n // peek because in an effect you would be subscribing to signals and then setting them which\n // would cause an infinite loop and why would you want to infinite loop on purpose\n startPeeking()\n const masked = filtered(filter)\n updateLeaves(masked, () => value)\n mergePatch(masked)\n stopPeeking()\n },\n})\n", "// Icon: material-symbols:toggle-off\n// Slug: Toggles the value of all matching signals.\n// Description: Toggles the boolean value of all matching signals (or all signals if no filter is used).\n\nimport { action } from '@engine'\nimport {\n filtered,\n mergePatch,\n startPeeking,\n stopPeeking,\n} from '@engine/signals'\nimport type { SignalFilterOptions } from '@engine/types'\nimport { updateLeaves } from '@utils/paths'\n\naction({\n name: 'toggleAll',\n apply(_, filter: SignalFilterOptions) {\n // peek because in an effect you would be subscribing to signals and then setting them which\n // would cause an infinite loop and why would you want to infinite loop on purpose\n startPeeking()\n const masked = filtered(filter)\n updateLeaves(masked, (oldValue: any) => !oldValue)\n mergePatch(masked)\n stopPeeking()\n },\n})\n", "// Icon: ion:eye\n// Slug: Access signals without subscribing to changes.\n// Description: Allows accessing signals without subscribing to their changes in expressions.\n\nimport { action } from '@engine'\nimport { DATASTAR_FETCH_EVENT } from '@engine/consts'\nimport { filtered, startPeeking, stopPeeking } from '@engine/signals'\nimport type {\n DatastarFetchEvent,\n HTMLOrSVG,\n SignalFilterOptions,\n WatcherArgs,\n} from '@engine/types'\nimport { kebab } from '@utils/text'\n\nconst abortControllers = new WeakMap()\nconst methodSupportsRequestBody = (method: string): boolean =>\n !['GET', 'DELETE'].includes(method)\n\nconst createHttpMethod = (\n name: string,\n method: string,\n openWhenHiddenDefault: boolean = true,\n): void =>\n action({\n name,\n apply: async (\n { el, evt, error, cleanups },\n url: string,\n {\n selector,\n headers: userHeaders,\n contentType = 'json',\n filterSignals: { include = /.*/, exclude = /(^|\\.)_/ } = {},\n openWhenHidden = openWhenHiddenDefault,\n payload,\n requestCancellation = 'auto',\n retry = 'auto',\n retryInterval = 1_000,\n retryScaler = 2,\n retryMaxWait = 30_000,\n retryMaxCount = 10,\n }: FetchArgs = {},\n ) => {\n const controller =\n requestCancellation instanceof AbortController\n ? requestCancellation\n : new AbortController()\n if (requestCancellation === 'auto' || requestCancellation === 'cleanup') {\n abortControllers.get(el)?.abort()\n abortControllers.set(el, controller)\n }\n if (requestCancellation === 'cleanup') {\n cleanups.get(`@${name}`)?.()\n cleanups.set(`@${name}`, async () => {\n controller.abort()\n // wait one tick for FINISHED to fire\n await Promise.resolve()\n })\n }\n\n let cleanupFn = () => {}\n\n try {\n if (!url?.length) {\n throw error('FetchNoUrlProvided', { action })\n }\n\n const initialHeaders: Record = {\n Accept: 'text/event-stream, text/html, application/json',\n 'Datastar-Request': true,\n }\n if (contentType === 'json' && methodSupportsRequestBody(method)) {\n initialHeaders['Content-Type'] = 'application/json'\n }\n const headers = Object.assign({}, initialHeaders, userHeaders)\n\n // We ignore the content-type header if using form data\n // if missing the boundary will be set automatically\n\n const req: FetchEventSourceInit = {\n input: '',\n method,\n headers,\n openWhenHidden,\n retry,\n retryInterval,\n retryScaler,\n retryMaxWait,\n retryMaxCount,\n signal: controller.signal,\n onopen: async (response: Response) => {\n if (response.status >= 400) {\n console.error(`Datastar failed to reach ${response.url}`)\n dispatchFetch(ERROR, el, { status: response.status.toString() })\n }\n },\n onmessage: (evt) => {\n if (!evt.event.startsWith('datastar')) return\n const type = evt.event\n const argsRawLines: Record = {}\n\n for (const line of evt.data.split('\\n')) {\n const i = line.indexOf(' ')\n const k = line.slice(0, i)\n const v = line.slice(i + 1)\n ;(argsRawLines[k] ||= []).push(v)\n }\n\n const argsRaw = Object.fromEntries(\n Object.entries(argsRawLines).map(([k, v]) => [k, v.join('\\n')]),\n )\n\n dispatchFetch(type, el, argsRaw)\n },\n onerror: (error) => {\n if (isWrongContent(error)) {\n // don't retry if the content-type is wrong\n throw error('FetchExpectedTextEventStream', { url })\n }\n },\n }\n\n const buildFetchEventSourceInit = () => {\n const urlInstance = new URL(url, document.baseURI)\n const queryParams = new URLSearchParams(urlInstance.search)\n if (contentType === 'json') {\n startPeeking()\n const requestPayload =\n payload !== undefined ? payload : filtered({ include, exclude })\n stopPeeking()\n const body = JSON.stringify(requestPayload)\n if (methodSupportsRequestBody(method)) {\n req.body = body\n } else {\n queryParams.set('datastar', body)\n }\n } else if (contentType === 'form') {\n const formEl = (\n selector ? document.querySelector(selector) : el.closest('form')\n ) as HTMLFormElement\n if (!formEl) {\n throw error('FetchFormNotFound', { action, selector })\n }\n\n // Validate the form\n if (!formEl.noValidate && !formEl.checkValidity()) {\n formEl.reportValidity()\n return\n }\n\n // Collect the form data\n const formData = new FormData(formEl)\n let submitter = el as HTMLElement | null\n\n if (el === formEl && evt instanceof SubmitEvent) {\n // Get the submitter from the event\n submitter = evt.submitter\n } else {\n // Prevent the form being submitted\n const preventDefault = (evt: Event) => evt.preventDefault()\n formEl.addEventListener('submit', preventDefault)\n cleanupFn = () => {\n formEl.removeEventListener('submit', preventDefault)\n }\n }\n\n // Append the value of the form submitter if it is a valid submitter and has a name\n if (\n submitter instanceof HTMLButtonElement ||\n (submitter instanceof HTMLInputElement &&\n submitter.type === 'submit')\n ) {\n const name = submitter.getAttribute('name')\n if (name) formData.append(name, submitter.value)\n }\n\n const multipart =\n formEl.getAttribute('enctype') === 'multipart/form-data'\n // Leave the `Content-Type` header empty for multipart encoding so the browser can set it automatically with the correct boundary\n if (!multipart) {\n headers['Content-Type'] = 'application/x-www-form-urlencoded'\n }\n\n const formParams = new URLSearchParams(formData as any)\n if (methodSupportsRequestBody(method)) {\n if (multipart) {\n req.body = formData\n } else {\n req.body = formParams\n }\n } else {\n for (const [key, value] of formParams) {\n queryParams.append(key, value)\n }\n }\n } else {\n throw error('FetchInvalidContentType', { action, contentType })\n }\n urlInstance.search = queryParams.toString()\n req.input = urlInstance.toString()\n return req\n }\n\n dispatchFetch(STARTED, el, {})\n\n try {\n await fetchEventSource(el, buildFetchEventSourceInit)\n } catch (e: any) {\n if (!isWrongContent(e)) {\n throw error('FetchFailed', { method, url, error: e.message })\n }\n // exit gracefully and do nothing if the content-type is wrong\n // this can happen if the client is sending a request\n // where no response is expected, and they haven\u2019t\n // set the content-type to text/event-stream\n }\n } finally {\n dispatchFetch(FINISHED, el, {})\n cleanupFn()\n cleanups.delete(`@${name}`)\n }\n },\n })\n\ncreateHttpMethod('get', 'GET', false)\ncreateHttpMethod('patch', 'PATCH')\ncreateHttpMethod('post', 'POST')\ncreateHttpMethod('put', 'PUT')\ncreateHttpMethod('delete', 'DELETE')\n\nexport const STARTED = 'started'\nexport const FINISHED = 'finished'\nexport const ERROR = 'error'\nexport const RETRYING = 'retrying'\nexport const RETRIES_FAILED = 'retries-failed'\n\nconst dispatchFetch = (type: string, el: HTMLOrSVG, argsRaw: WatcherArgs) =>\n document.dispatchEvent(\n new CustomEvent(DATASTAR_FETCH_EVENT, {\n detail: { type, el, argsRaw },\n }),\n )\n\nconst isWrongContent = (err: any) => `${err}`.includes('text/event-stream')\n\ntype ResponseOverrides =\n | {\n selector?: string\n mode?: string\n namespace?: string\n useViewTransition?: boolean\n }\n | {\n onlyIfMissing?: boolean\n }\n\nexport type FetchArgs = {\n selector?: string\n headers?: Record\n contentType?: 'json' | 'form'\n filterSignals?: SignalFilterOptions\n openWhenHidden?: boolean\n payload?: any\n requestCancellation?: 'auto' | 'cleanup' | 'disabled' | AbortController\n responseOverrides?: ResponseOverrides\n retry?: 'auto' | 'error' | 'always' | 'never'\n retryInterval?: number\n retryScaler?: number\n retryMaxWait?: number\n retryMaxCount?: number\n}\n\n// Below originally from https://github.com/Azure/fetch-event-source/blob/main/LICENSE\n\n/**\n * Represents a message sent in an event stream\n * https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#Event_stream_format\n */\n\ninterface EventSourceMessage {\n id: string\n event: string\n data: string\n retry?: number\n}\n\n/**\n * Converts a ReadableStream into a callback pattern.\n * @param stream The input ReadableStream.\n * @param onChunk A function that will be called on each new byte chunk in the stream.\n * @returns {Promise} A promise that will be resolved when the stream closes.\n */\nconst getBytes = async (\n stream: ReadableStream,\n onChunk: (arr: Uint8Array) => void,\n): Promise => {\n const reader = stream.getReader()\n let result = await reader.read()\n while (!result.done) {\n onChunk(result.value)\n result = await reader.read()\n }\n}\n\nconst getLines = (onLine: (line: Uint8Array, fieldLength: number) => void) => {\n let buffer: Uint8Array | undefined\n let position: number // current read position\n let fieldLength: number // length of the `field` portion of the line\n let discardTrailingNewline = false\n\n // return a function that can process each incoming byte chunk:\n return (arr: Uint8Array) => {\n if (!buffer) {\n buffer = arr\n position = 0\n fieldLength = -1\n } else {\n // we're still parsing the old line. Append the new bytes into buffer:\n buffer = concat(buffer, arr)\n }\n\n const bufLength = buffer.length\n let lineStart = 0 // index where the current line starts\n while (position < bufLength) {\n if (discardTrailingNewline) {\n if (buffer[position] === 10) lineStart = ++position // skip to next char\n discardTrailingNewline = false\n }\n\n // start looking forward till the end of line:\n let lineEnd = -1 // index of the \\r or \\n char\n for (; position < bufLength && lineEnd === -1; ++position) {\n switch (buffer[position]) {\n case 58: // :\n if (fieldLength === -1) {\n // first colon in line\n fieldLength = position - lineStart\n }\n break\n // @ts-expect-error:7029 \\r case below should fallthrough to \\n:\n // biome-ignore lint/suspicious/noFallthroughSwitchClause: intentional fallthrough for CR to LF\n case 13: // \\r\n discardTrailingNewline = true\n case 10: // \\n\n lineEnd = position\n break\n }\n }\n\n if (lineEnd === -1) break // Wait for the next arr and then continue parsing\n\n // we've reached the line end, send it out:\n onLine(buffer.subarray(lineStart, lineEnd), fieldLength)\n lineStart = position // we're now on the next line\n fieldLength = -1\n }\n\n if (lineStart === bufLength)\n buffer = undefined // we've finished reading it\n else if (lineStart) {\n // Create a new view into buffer beginning at lineStart so we don't\n // need to copy over the previous lines when we get the new arr:\n buffer = buffer.subarray(lineStart)\n position -= lineStart\n }\n }\n}\n\nconst getMessages = (\n onId: (id: string) => void,\n onRetry: (retry: number) => void,\n onMessage?: (msg: EventSourceMessage) => void,\n): ((line: Uint8Array, fieldLength: number) => void) => {\n let message = newMessage()\n const decoder = new TextDecoder()\n\n // return a function that can process each incoming line buffer:\n return (line, fieldLength) => {\n if (!line.length) {\n // empty line denotes end of message. Trigger the callback and start a new message:\n onMessage?.(message)\n message = newMessage()\n } else if (fieldLength > 0) {\n // exclude comments and lines with no values\n // line is of format \":\" or \": \"\n // https://html.spec.whatwg.org/multipage/server-sent-events.html#event-stream-interpretation\n const field = decoder.decode(line.subarray(0, fieldLength))\n const valueOffset = fieldLength + (line[fieldLength + 1] === 32 ? 2 : 1)\n const value = decoder.decode(line.subarray(valueOffset))\n\n switch (field) {\n case 'data':\n message.data = message.data ? `${message.data}\\n${value}` : value\n break\n case 'event':\n message.event = value\n break\n case 'id':\n onId((message.id = value))\n break\n case 'retry': {\n const retry = +value\n if (!Number.isNaN(retry)) {\n // per spec, ignore non-integers\n onRetry((message.retry = retry))\n }\n break\n }\n }\n }\n }\n}\n\nconst concat = (a: Uint8Array, b: Uint8Array) => {\n const res = new Uint8Array(a.length + b.length)\n res.set(a)\n res.set(b, a.length)\n return res\n}\n\nconst newMessage = (): EventSourceMessage => ({\n // data, event, and id must be initialized to empty strings:\n // https://html.spec.whatwg.org/multipage/server-sent-events.html#event-stream-interpretation\n // retry should be initialized to undefined so we return a consistent shape\n // to the js engine all the time: https://mathiasbynens.be/notes/shapes-ics#takeaways\n data: '',\n event: '',\n id: '',\n retry: undefined,\n})\n\ntype FetchEventSourceInit =\n | (RequestInit & {\n input: RequestInfo\n headers?: Record\n onopen?: (response: Response) => Promise\n onmessage?: (ev: EventSourceMessage) => void\n onclose?: () => void\n onerror?: (error: any) => void\n openWhenHidden?: boolean\n fetch?: typeof fetch\n retry?: 'auto' | 'error' | 'always' | 'never'\n retryInterval?: number\n retryScaler?: number\n retryMaxWait?: number\n retryMaxCount?: number\n responseOverrides?: ResponseOverrides\n })\n | undefined\n\nconst fetchEventSource = (\n el: HTMLOrSVG,\n buildFetchEventSourceInit: () => FetchEventSourceInit,\n): Promise => {\n return new Promise((resolve, reject) => {\n const fetchInit = buildFetchEventSourceInit()\n if (!fetchInit) {\n return\n }\n let {\n input,\n signal: inputSignal,\n headers: inputHeaders,\n onopen: inputOnOpen,\n onmessage,\n onclose,\n openWhenHidden,\n fetch: inputFetch,\n retry = 'auto',\n retryInterval = 1_000,\n retryScaler = 2,\n retryMaxWait = 30_000,\n retryMaxCount = 10,\n responseOverrides,\n ...rest\n }: FetchEventSourceInit = fetchInit\n\n // make a copy of the input headers since we may modify it below:\n const headers: Record = {\n ...inputHeaders,\n }\n\n let curRequestController: AbortController\n const onVisibilityChange = () => {\n curRequestController.abort() // close existing request on every visibility change\n if (!document.hidden) {\n const currentFetchInit = buildFetchEventSourceInit()\n if (!currentFetchInit) return\n\n input = currentFetchInit.input\n rest.body = currentFetchInit.body\n create()\n }\n }\n\n if (!openWhenHidden) {\n document.addEventListener('visibilitychange', onVisibilityChange)\n }\n\n let retryTimer: ReturnType | undefined\n const dispose = () => {\n document.removeEventListener('visibilitychange', onVisibilityChange)\n clearTimeout(retryTimer)\n curRequestController.abort()\n }\n\n // if the incoming signal aborts, dispose resources and resolve:\n inputSignal?.addEventListener('abort', () => {\n dispose()\n resolve() // don't waste time constructing/logging errors\n })\n\n const fetch = inputFetch || window.fetch\n const onopen = inputOnOpen || (() => {})\n\n let retries = 0\n let baseRetryInterval = retryInterval\n\n const retryRequest = () => {\n if (retries < retryMaxCount) {\n dispatchFetch(RETRYING, el, {})\n clearTimeout(retryTimer)\n retryTimer = setTimeout(create, retryInterval)\n retries++\n // Prepare the interval for the next retry (exponential backoff)\n retryInterval = Math.min(retryInterval * retryScaler, retryMaxWait)\n } else {\n dispatchFetch(RETRIES_FAILED, el, {})\n dispose()\n reject('Max retries reached.')\n }\n }\n\n const create = async () => {\n curRequestController = new AbortController()\n const curRequestSignal = curRequestController.signal\n try {\n const response = await fetch(input, {\n ...rest,\n headers,\n signal: curRequestSignal,\n })\n\n await onopen(response)\n\n const dispatchNonSSE = async (\n dispatchType: string,\n response: Response,\n name: string,\n responseOverrides?: ResponseOverrides,\n ...argNames: string[]\n ) => {\n const argsRaw: WatcherArgs = {\n [name]: await response.text(),\n }\n for (const n of argNames) {\n let v = response.headers.get(`datastar-${kebab(n)}`)\n if (responseOverrides) {\n const o = (responseOverrides as any)[n]\n if (o) v = typeof o === 'string' ? o : JSON.stringify(o)\n }\n if (v) argsRaw[n] = v\n }\n\n dispatchFetch(dispatchType, el, argsRaw)\n dispose()\n resolve()\n }\n\n const status = response.status\n const isNoContentStatus = status === 204\n const isRedirectStatus = status >= 300 && status < 400\n const isErrorStatus = status >= 400 && status < 600\n\n if (status !== 200) {\n onclose?.()\n if (\n retry !== 'never' &&\n !isNoContentStatus &&\n !isRedirectStatus &&\n (retry === 'always' || (retry === 'error' && isErrorStatus))\n ) {\n retryRequest()\n return\n }\n dispose()\n resolve()\n return\n }\n\n // on successful connection, reset the retry logic\n retries = 0\n retryInterval = baseRetryInterval\n\n const ct = response.headers.get('Content-Type')\n if (ct?.includes('text/html')) {\n return await dispatchNonSSE(\n 'datastar-patch-elements',\n response,\n 'elements',\n responseOverrides,\n 'selector',\n 'mode',\n 'namespace',\n 'useViewTransition',\n )\n }\n\n if (ct?.includes('application/json')) {\n return await dispatchNonSSE(\n 'datastar-patch-signals',\n response,\n 'signals',\n responseOverrides,\n 'onlyIfMissing',\n )\n }\n\n if (ct?.includes('text/javascript')) {\n const script = document.createElement('script')\n const scriptAttributesHeader = response.headers.get(\n 'datastar-script-attributes',\n )\n\n if (scriptAttributesHeader) {\n for (const [name, value] of Object.entries(\n JSON.parse(scriptAttributesHeader),\n )) {\n script.setAttribute(name, value as string)\n }\n }\n script.textContent = await response.text()\n document.head.appendChild(script)\n dispose()\n return\n }\n\n await getBytes(\n response.body!,\n getLines(\n getMessages(\n (id) => {\n if (id) {\n // signals the id and send it back on the next retry:\n headers['last-event-id'] = id\n } else {\n // don't send the last-event-id header anymore:\n delete headers['last-event-id']\n }\n },\n (retry) => {\n baseRetryInterval = retryInterval = retry\n },\n onmessage,\n ),\n ),\n )\n\n onclose?.()\n\n if (retry === 'always' && !isRedirectStatus) {\n retryRequest()\n return\n }\n\n dispose()\n resolve()\n } catch {\n if (!curRequestSignal.aborted) {\n try {\n retryRequest()\n } catch (innerErr) {\n dispose()\n reject(innerErr)\n }\n }\n }\n }\n\n create()\n })\n}\n", "// Icon: material-symbols:edit-attributes-outline\n// Slug: Syncs the value of an attribute with an expression.\n// Description: Sets the value of any HTML attribute to an expression, and keeps it in sync.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\n\nattribute({\n name: 'attr',\n requirement: { value: 'must' },\n returnsValue: true,\n apply({ el, key, rx }) {\n const syncAttr = (key: string, val: any) => {\n if (val === '' || val === true) {\n el.setAttribute(key, '')\n } else if (val === false || val == null) {\n el.removeAttribute(key)\n } else if (typeof val === 'string') {\n el.setAttribute(key, val)\n } else if (typeof val === 'function') {\n el.setAttribute(key, val.toString())\n } else {\n el.setAttribute(\n key,\n JSON.stringify(val, (_k, v) =>\n typeof v === 'function' ? v.toString() : v,\n ),\n )\n }\n }\n\n const update = key\n ? () => {\n observer.disconnect()\n const val = rx() as string\n syncAttr(key, val)\n observer.observe(el, {\n attributeFilter: [key],\n })\n }\n : () => {\n observer.disconnect()\n const obj = rx() as Record\n const attributeFilter = Object.keys(obj)\n for (const key of attributeFilter) {\n syncAttr(key, obj[key])\n }\n observer.observe(el, {\n attributeFilter,\n })\n }\n\n const observer = new MutationObserver(update)\n const cleanup = effect(update)\n\n return () => {\n observer.disconnect()\n cleanup()\n }\n },\n})\n", "// Icon: akar-icons:link-chain\n// Slug: Creates a signal with two-way data binding.\n// Description: Creates a signal (if one doesn\u2019t already exist) and sets up two-way data binding between it and an element\u2019s value.\n\nimport { attribute } from '@engine'\nimport { DATASTAR_PROP_CHANGE_EVENT } from '@engine/consts'\nimport { effect, getPath, mergePaths } from '@engine/signals'\nimport type { Paths } from '@engine/types'\nimport { hasOwn } from '@utils/polyfills'\nimport { aliasify, camel, modifyCasing } from '@utils/text'\n\ntype SignalFile = {\n name: string\n contents: string\n mime: string\n}\n\ntype BindAdapter = {\n get: (el: any, type: string) => any\n set: (el: any, value: any) => void\n events: string[]\n}\n\nconst propAdapter = (prop: string, ...events: string[]): BindAdapter => ({\n get: (el: any) => el[prop],\n set: (el: any, value: any) => {\n el[prop] = value\n },\n events,\n})\n\nconst attrAdapter = (attr: string, ...events: string[]): BindAdapter => ({\n get: (el: Element) => el.getAttribute(attr),\n set: (el: Element, value: any) => {\n el.setAttribute(attr, `${value}`)\n },\n events,\n})\n\nconst valueAdapter = (\n treatUndefinedAsString = false,\n ...events: string[]\n): BindAdapter => ({\n get: (el: HTMLInputElement | HTMLSelectElement, type: string) =>\n type === 'string' || (treatUndefinedAsString && type === 'undefined')\n ? el.value\n : +el.value,\n set: (el: HTMLInputElement | HTMLSelectElement, value: string | number) => {\n el.value = `${value}`\n },\n events,\n})\n\nconst dataURIRegex = /^data:(?[^;]+);base64,(?.*)$/\nconst empty = Symbol('empty')\n\nconst boundPath = (\n el: Element,\n key: string | null | undefined,\n rawKey: string,\n signalName: string,\n adapter: BindAdapter,\n initialValue: any,\n) => {\n const rawAttribute = aliasify(CSS.escape(rawKey))\n const selector = key\n ? `[${rawAttribute}]`\n : `[${rawAttribute}=\"${CSS.escape(signalName)}\"]`\n if (\n initialValue === undefined &&\n el instanceof HTMLInputElement &&\n el.type === 'radio'\n ) {\n const checked = [...document.querySelectorAll(selector)].find(\n (input): input is HTMLInputElement =>\n input instanceof HTMLInputElement && input.checked,\n )\n // Missing radio binds adopt the checked option.\n if (checked) {\n mergePaths([[signalName, checked.value]], { ifMissing: true })\n }\n }\n\n if (\n !Array.isArray(initialValue) ||\n (el instanceof HTMLSelectElement && el.multiple)\n ) {\n mergePaths([[signalName, adapter.get(el, typeof initialValue)]], {\n ifMissing: true,\n })\n return signalName\n }\n\n const inputs = document.querySelectorAll(selector) as NodeListOf\n\n const paths: Paths = []\n let i = 0\n for (const input of inputs) {\n // Missing proxy slots materialize as '', which breaks `ifMissing`.\n paths.push([\n `${signalName}.${i}`,\n adapter.get(\n input,\n typeof (hasOwn(initialValue, i) ? initialValue[i] : undefined),\n ),\n ])\n if (el === input) {\n break\n }\n i++\n }\n mergePaths(paths, { ifMissing: true })\n return `${signalName}.${i}`\n}\n\nattribute({\n name: 'bind',\n requirement: 'exclusive',\n apply({ el, key, rawKey, mods, value, error }) {\n const signalName = key != null ? modifyCasing(key, mods) : value\n\n const props = mods.get('prop')\n const events = mods.get('event')\n let adapter: BindAdapter | null = null\n\n if (el instanceof HTMLInputElement) {\n switch (el.type) {\n case 'range':\n case 'number':\n adapter = valueAdapter(false, 'input')\n break\n case 'checkbox':\n adapter = {\n get: (el: HTMLInputElement, type: string) => {\n if (el.value !== 'on') {\n return type === 'boolean'\n ? el.checked\n : el.checked\n ? el.value\n : ''\n }\n return type === 'string'\n ? el.checked\n ? el.value\n : ''\n : el.checked\n },\n set: (el: HTMLInputElement, value: string | boolean) => {\n el.checked =\n typeof value === 'string' ? value === el.value : value\n },\n events: ['input'],\n }\n break\n case 'radio':\n if (!el.getAttribute('name')?.length) {\n el.setAttribute('name', signalName)\n }\n adapter = {\n get: (el: HTMLInputElement, type: string) =>\n el.checked ? (type === 'number' ? +el.value : el.value) : empty,\n set: (el: HTMLInputElement, value: string | number) => {\n el.checked =\n value === (typeof value === 'number' ? +el.value : el.value)\n },\n events: ['input'],\n }\n break\n case 'file': {\n const syncSignal = () => {\n const files = [...(el.files || [])]\n const signalFiles: SignalFile[] = []\n Promise.all(\n files.map(\n (f) =>\n new Promise((resolve) => {\n const reader = new FileReader()\n reader.onload = () => {\n if (typeof reader.result !== 'string') {\n throw error('InvalidFileResultType', {\n resultType: typeof reader.result,\n })\n }\n const match = reader.result.match(dataURIRegex)\n if (!match?.groups) {\n throw error('InvalidDataUri', {\n result: reader.result,\n })\n }\n signalFiles.push({\n name: f.name,\n contents: match.groups.contents,\n mime: match.groups.mime,\n })\n }\n reader.onloadend = () => resolve()\n reader.readAsDataURL(f)\n }),\n ),\n ).then(() => {\n mergePaths([[signalName, signalFiles]])\n })\n }\n\n el.addEventListener('change', syncSignal)\n return () => {\n el.removeEventListener('change', syncSignal)\n }\n }\n default:\n adapter = valueAdapter(true, 'input')\n }\n } else if (el instanceof HTMLSelectElement && el.multiple) {\n const typeMap = new Map()\n adapter = {\n get: (el: HTMLSelectElement) =>\n [...el.selectedOptions].map((option) => {\n const type = typeMap.get(option.value)\n return type === 'string' || type == null\n ? option.value\n : +option.value\n }),\n set: (el: HTMLSelectElement, value: (string | number)[]) => {\n for (const option of el.options) {\n if (value.includes(option.value)) {\n typeMap.set(option.value, 'string')\n option.selected = true\n } else if (value.includes(+option.value)) {\n typeMap.set(option.value, 'number')\n option.selected = true\n } else {\n option.selected = false\n }\n }\n },\n events: ['change'],\n }\n } else if (el instanceof HTMLSelectElement) {\n adapter = valueAdapter(true, 'change')\n } else if (el instanceof HTMLTextAreaElement) {\n adapter = propAdapter('value', 'input')\n } else if (el instanceof HTMLElement && el.tagName.includes('-')) {\n adapter =\n 'value' in el\n ? propAdapter('value', 'input', 'change')\n : attrAdapter('value', 'input', 'change')\n } else if (el instanceof HTMLElement && 'value' in el) {\n adapter = propAdapter('value', 'change')\n } else {\n adapter = attrAdapter('value', 'change')\n }\n if (!adapter) {\n throw error('InvalidBindAdapter')\n }\n\n const firstProp = props && [...props][0]\n if (props && !firstProp) throw error('BindPropNameMissing')\n if (firstProp) {\n const prop = camel(firstProp)\n adapter = propAdapter(prop, ...(events ? [...events] : adapter.events))\n } else if (events) {\n adapter.events = [...events]\n }\n\n const initialValue = getPath(signalName)\n const path = boundPath(\n el,\n key,\n rawKey,\n signalName,\n adapter,\n initialValue,\n )\n\n const syncSignal = () => {\n const signalValue = getPath(path)\n if (signalValue != null) {\n const value = adapter.get(el, typeof signalValue)\n if (value !== empty) {\n mergePaths([[path, value]])\n }\n }\n }\n\n for (const eventName of adapter.events) {\n el.addEventListener(eventName, syncSignal)\n }\n el.addEventListener(DATASTAR_PROP_CHANGE_EVENT, syncSignal)\n const cleanup = effect(() => {\n adapter.set(el, getPath(path))\n })\n\n return () => {\n cleanup()\n for (const eventName of adapter.events) {\n el.removeEventListener(eventName, syncSignal)\n }\n el.removeEventListener(DATASTAR_PROP_CHANGE_EVENT, syncSignal)\n }\n },\n})\n", "// Icon: ic:baseline-format-paint\n// Slug: Adds or removes a class based on an expression.\n// Description: Adds or removes a class to or from an element based on an expression.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\nimport { modifyCasing } from '@utils/text'\n\nattribute({\n name: 'class',\n requirement: {\n value: 'must',\n },\n returnsValue: true,\n apply({ key, el, mods, rx }) {\n key &&= modifyCasing(key, mods, 'kebab')\n\n let classes: Record\n const callback = () => {\n observer.disconnect()\n\n classes = key\n ? { [key]: rx() as boolean }\n : (rx() as Record)\n\n for (const k in classes) {\n const classNames = k.split(/\\s+/).filter((cn) => cn.length > 0)\n if (classes[k]) {\n for (const name of classNames) {\n if (!el.classList.contains(name)) {\n el.classList.add(name)\n }\n }\n } else {\n for (const name of classNames) {\n if (el.classList.contains(name)) {\n el.classList.remove(name)\n }\n }\n }\n }\n\n observer.observe(el, { attributeFilter: ['class'] })\n }\n\n const observer = new MutationObserver(callback)\n const cleanup = effect(callback)\n\n return () => {\n observer.disconnect()\n cleanup()\n\n for (const k in classes) {\n const classNames = k.split(/\\s+/).filter((cn) => cn.length > 0)\n for (const name of classNames) {\n el.classList.remove(name)\n }\n }\n }\n },\n})\n", "// Icon: streamline-ultimate:wifi-signal-2\n// Slug: Creates a computed signal.\n// Description: Creates a signal that is computed based on an expression.\n\nimport { attribute } from '@engine'\nimport { computed, mergePaths, mergePatch } from '@engine/signals'\nimport { modifyCasing } from '@utils/text'\nimport { updateLeaves } from '@utils/paths'\n\nattribute({\n name: 'computed',\n requirement: {\n value: 'must',\n },\n returnsValue: true,\n apply({ key, mods, rx, error }) {\n if (key) {\n mergePaths([[modifyCasing(key, mods), computed(rx)]])\n } else {\n const patch = Object.assign({}, rx() as Record any>)\n updateLeaves(patch, (old) => {\n if (typeof old === 'function') {\n return computed(old)\n } else {\n throw error('ComputedExpectedFunction')\n }\n })\n mergePatch(patch)\n }\n },\n})\n", "// Icon: oui:security-signal\n// Slug: Executes an expression when signals change.\n// Description: Executes an expression on page load and whenever any signals in the expression change.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\n\nattribute({\n name: 'effect',\n requirement: {\n key: 'denied',\n value: 'must',\n },\n apply: ({ rx }) => effect(rx),\n})\n", "// Icon: streamline:signal-loading-remix\n// Slug: Creates an indicator for whether an SSE request is in flight.\n// Description: Creates a signal and sets its value to `true` while an SSE request request is in flight, otherwise `false`.\n\nimport { attribute } from '@engine'\nimport { DATASTAR_FETCH_EVENT } from '@engine/consts'\nimport { mergePaths } from '@engine/signals'\nimport type { DatastarFetchEvent } from '@engine/types'\nimport { FINISHED, STARTED } from '@plugins/actions/fetch'\nimport { modifyCasing } from '@utils/text'\n\nattribute({\n name: 'indicator',\n requirement: 'exclusive',\n apply({ el, key, mods, value }) {\n const signalName = key != null ? modifyCasing(key, mods) : value\n let activeFetches = 0\n\n mergePaths([[signalName, false]])\n\n const watcher = ((event: CustomEvent) => {\n const { type, el: elt } = event.detail\n if (elt !== el) {\n return\n }\n switch (type) {\n case STARTED:\n activeFetches++\n mergePaths([[signalName, true]])\n break\n case FINISHED:\n activeFetches = Math.max(0, activeFetches - 1)\n mergePaths([[signalName, activeFetches > 0]])\n break\n }\n }) as EventListener\n document.addEventListener(DATASTAR_FETCH_EVENT, watcher)\n return () => {\n activeFetches = 0\n mergePaths([[signalName, false]])\n document.removeEventListener(DATASTAR_FETCH_EVENT, watcher)\n }\n },\n})\n", "export const tagToMs = (args: Set) => {\n if (!args || args.size <= 0) return 0\n for (const arg of args) {\n if (arg.endsWith('ms')) {\n return +arg.replace('ms', '')\n }\n if (arg.endsWith('s')) {\n return +arg.replace('s', '') * 1000\n }\n try {\n return Number.parseFloat(arg)\n } catch (_) {}\n }\n return 0\n}\n\nexport const tagHas = (\n tags: Set,\n tag: string,\n defaultValue = false,\n) => {\n if (!tags) return defaultValue\n return tags.has(tag.toLowerCase())\n}\n\nexport const tagFirst = (tags?: Set, defaultValue = ''): string => {\n if (tags && tags.size > 0) {\n for (const tag of tags) {\n return tag\n }\n }\n return defaultValue\n}\n", "import type { EventCallbackHandler, Modifiers } from '@engine/types'\nimport { tagHas, tagToMs } from '@utils/tags'\n\nexport const delay = (\n callback: EventCallbackHandler,\n wait: number,\n): EventCallbackHandler => {\n return (...args: any[]) => {\n setTimeout(() => {\n callback(...args)\n }, wait)\n }\n}\n\nexport const throttle = (\n callback: EventCallbackHandler,\n wait: number,\n leading = true,\n trailing = false,\n debounce = false,\n): EventCallbackHandler => {\n let lastArgs: Parameters | null = null\n let timer: ReturnType | number = 0\n\n return (...args: any[]) => {\n if (leading && !timer) {\n callback(...args)\n lastArgs = null\n } else {\n lastArgs = args\n }\n if (!timer || debounce) {\n if (timer) {\n clearTimeout(timer)\n }\n timer = setTimeout(() => {\n if (trailing && lastArgs !== null) {\n callback(...lastArgs)\n }\n lastArgs = null\n timer = 0\n }, wait)\n }\n }\n}\n\nexport const modifyTiming = (\n callback: EventCallbackHandler,\n mods: Modifiers,\n): EventCallbackHandler => {\n const delayArgs = mods.get('delay')\n if (delayArgs) {\n const wait = tagToMs(delayArgs)\n callback = delay(callback, wait)\n }\n\n const debounceArgs = mods.get('debounce')\n if (debounceArgs) {\n const wait = tagToMs(debounceArgs)\n const leading = tagHas(debounceArgs, 'leading', false)\n const trailing = !tagHas(debounceArgs, 'notrailing', false)\n callback = throttle(callback, wait, leading, trailing, true)\n }\n\n const throttleArgs = mods.get('throttle')\n if (throttleArgs) {\n const wait = tagToMs(throttleArgs)\n const leading = !tagHas(throttleArgs, 'noleading', false)\n const trailing = tagHas(throttleArgs, 'trailing', false)\n callback = throttle(callback, wait, leading, trailing)\n }\n\n return callback\n}\n", "import type { EventCallbackHandler, Modifiers } from '@engine/types'\n\nexport const supportsViewTransitions = (\n element: Element = document.documentElement,\n): boolean => 'startViewTransition' in element\n\nexport const modifyViewTransition = (\n callback: EventCallbackHandler,\n mods: Modifiers,\n): EventCallbackHandler => {\n if (mods.has('viewtransition') && supportsViewTransitions()) {\n const cb = callback // I hate javascript\n callback = (...args: any[]) =>\n document.startViewTransition(() => cb(...args))\n }\n\n return callback\n}\n", "// Icon: material-symbols:timer-play-outline\n// Slug: Runs an expression when loaded into the DOM.\n// Description: Runs an expression when the element is loaded into the DOM.\n\nimport { attribute } from '@engine'\nimport { beginBatch, endBatch } from '@engine/signals'\nimport { tagToMs } from '@utils/tags'\nimport { delay } from '@utils/timing'\nimport { modifyViewTransition } from '@utils/view-transitions'\n\nattribute({\n name: 'init',\n requirement: {\n key: 'denied',\n value: 'must',\n },\n apply({ rx, mods }) {\n let callback = () => {\n beginBatch()\n rx()\n endBatch()\n }\n callback = modifyViewTransition(callback, mods)\n let wait = 0\n const delayArgs = mods.get('delay')\n if (delayArgs) {\n wait = tagToMs(delayArgs)\n if (wait > 0) {\n callback = delay(callback, wait)\n }\n }\n callback()\n },\n})\n", "// Icon: si:json-fill\n// Slug: Outputs a JSON stringified version of signals.\n// Description: Sets the text content of an element to a reactive JSON stringified version of signals.\n\nimport { attribute } from '@engine'\nimport { effect, filtered } from '@engine/signals'\nimport type { SignalFilterOptions } from '@engine/types'\nimport { jsStrToObject } from '@utils/text'\n\nattribute({\n name: 'json-signals',\n requirement: {\n key: 'denied',\n },\n apply({ el, value, mods }) {\n const spaces = mods.has('terse') ? 0 : 2\n let filters: SignalFilterOptions = {}\n if (value) {\n filters = jsStrToObject(value)\n }\n\n const callback = () => {\n observer.disconnect()\n el.textContent = JSON.stringify(filtered(filters), null, spaces)\n observer.observe(el, {\n childList: true,\n characterData: true,\n subtree: true,\n })\n }\n const observer = new MutationObserver(callback)\n const cleanup = effect(callback)\n\n return () => {\n observer.disconnect()\n cleanup()\n }\n },\n})\n", "// Icon: material-symbols:mail\n// Slug: Attaches an event listener to an element.\n// Description: Attaches an event listener to an element, executing an expression whenever the event is triggered.\n\nimport { attribute } from '@engine'\nimport {\n DATASTAR_FETCH_EVENT,\n DATASTAR_SIGNAL_PATCH_EVENT,\n} from '@engine/consts'\nimport { beginBatch, endBatch } from '@engine/signals'\nimport { modifyCasing } from '@utils/text'\nimport { modifyTiming } from '@utils/timing'\nimport { modifyViewTransition } from '@utils/view-transitions'\n\nattribute({\n name: 'on',\n requirement: 'must',\n argNames: ['evt'],\n apply({ el, key, mods, rx }) {\n let target: Element | Window | Document = el\n if (mods.has('window')) {\n target = window\n } else if (mods.has('document')) {\n target = document\n }\n let callback = (evt?: Event) => {\n beginBatch()\n rx(evt)\n endBatch()\n }\n callback = modifyViewTransition(callback, mods)\n callback = modifyTiming(callback, mods)\n const eventName = modifyCasing(key, mods, 'kebab')\n const evtListOpts: AddEventListenerOptions = {\n capture: mods.has('capture'),\n passive: mods.has('passive'),\n once: mods.has('once'),\n }\n if (mods.has('outside')) {\n target = document\n const cb = callback\n callback = (evt?: Event) => {\n if (!el.contains(evt?.target as HTMLElement)) {\n cb(evt)\n }\n }\n }\n // Listen for Datastar events on the document\n if (\n eventName === DATASTAR_FETCH_EVENT ||\n eventName === DATASTAR_SIGNAL_PATCH_EVENT\n ) {\n target = document\n }\n // Apply event-side effects before timing/view-transition wrappers run.\n const listener = (evt?: Event) => {\n if (evt) {\n if (mods.has('prevent')) evt.preventDefault()\n if (mods.has('stop')) evt.stopPropagation()\n // Keep data-on:submit from falling through to native form submission.\n if (el instanceof HTMLFormElement && eventName === 'submit') evt.preventDefault()\n }\n callback(evt)\n }\n target.addEventListener(eventName, listener, evtListOpts)\n return () => {\n target.removeEventListener(eventName, listener, evtListOpts)\n }\n },\n})\n", "export const clamp = (value: number, min: number, max: number): number => {\n return Math.max(min, Math.min(max, value))\n}\n\nexport const lerp = (\n min: number,\n max: number,\n t: number,\n clamped = true,\n): number => {\n const v = min + (max - min) * t\n return clamped ? clamp(v, min, max) : v\n}\n\nexport const inverseLerp = (\n min: number,\n max: number,\n value: number,\n clamped = true,\n): number => {\n if (value < min) return 0\n if (value > max) return 1\n const v = (value - min) / (max - min)\n return clamped ? clamp(v, min, max) : v\n}\n\nexport const fit = (\n value: number,\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n clamped = true,\n rounded = false,\n): number => {\n const t = inverseLerp(inMin, inMax, value, clamped)\n const fitted = lerp(outMin, outMax, t, clamped)\n return rounded ? Math.round(fitted) : fitted\n}\n", "// Icon: mdi-light:vector-intersection\n// Slug: Runs an expression on intersection.\n// Description: Runs an expression when the element intersects with the viewport.\n\nimport { attribute } from '@engine'\nimport { beginBatch, endBatch } from '@engine/signals'\nimport type { HTMLOrSVG } from '@engine/types'\nimport { clamp } from '@utils/math'\nimport { tagFirst } from '@utils/tags'\nimport { modifyTiming } from '@utils/timing'\nimport { modifyViewTransition } from '@utils/view-transitions'\n\nconst once = new WeakSet()\n\nattribute({\n name: 'on-intersect',\n requirement: {\n key: 'denied',\n value: 'must',\n },\n apply({ el, mods, rx }) {\n let callback = () => {\n beginBatch()\n rx()\n endBatch()\n }\n callback = modifyViewTransition(callback, mods)\n callback = modifyTiming(callback, mods)\n const options = { threshold: 0 }\n if (mods.has('full')) {\n options.threshold = 1\n } else if (mods.has('half')) {\n options.threshold = 0.5\n } else {\n const threshold = mods.get('threshold')\n if (threshold) {\n options.threshold = clamp(Number(tagFirst(threshold)), 0, 100) / 100\n }\n }\n const exit = mods.has('exit')\n let observer: IntersectionObserver | null = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting !== exit) {\n callback()\n if (observer && once.has(el)) {\n observer.disconnect()\n }\n }\n }\n },\n options,\n )\n observer.observe(el)\n if (mods.has('once')) {\n once.add(el)\n }\n return () => {\n if (!mods.has('once')) {\n once.delete(el)\n }\n if (observer) {\n observer.disconnect()\n observer = null\n }\n }\n },\n})\n", "// Icon: material-symbols:timer-outline\n// Slug: Runs an expression at a regular interval.\n// Description: Runs an expression at a regular interval.\n\nimport { attribute } from '@engine'\nimport { beginBatch, endBatch } from '@engine/signals'\nimport { tagHas, tagToMs } from '@utils/tags'\nimport { modifyViewTransition } from '@utils/view-transitions'\n\nattribute({\n name: 'on-interval',\n requirement: {\n key: 'denied',\n value: 'must',\n },\n apply({ mods, rx }) {\n let callback = () => {\n beginBatch()\n rx()\n endBatch()\n }\n callback = modifyViewTransition(callback, mods)\n let duration = 1000\n const durationArgs = mods.get('duration')\n if (durationArgs) {\n duration = tagToMs(durationArgs)\n const leading = tagHas(durationArgs, 'leading', false)\n if (leading) {\n callback()\n }\n }\n const intervalId = setInterval(callback, duration)\n return () => {\n clearInterval(intervalId)\n }\n },\n})\n", "// Icon: material-symbols:change-circle-outline\n// Slug: Runs an expression when signals are patched.\n// Description: Runs an expression whenever one or more signals are patched.\n\nimport { attribute } from '@engine'\nimport { DATASTAR_SIGNAL_PATCH_EVENT } from '@engine/consts'\nimport { beginBatch, endBatch, filtered } from '@engine/signals'\nimport type { JSONPatch, SignalFilterOptions } from '@engine/types'\nimport { isEmpty } from '@utils/paths'\nimport { aliasify, jsStrToObject } from '@utils/text'\nimport { modifyTiming } from '@utils/timing'\n\nattribute({\n name: 'on-signal-patch',\n requirement: {\n value: 'must',\n },\n argNames: ['patch'],\n returnsValue: true,\n apply({ el, key, mods, rx, error }) {\n if (!!key && key !== 'filter') {\n throw error('KeyNotAllowed')\n }\n\n const filterAttr = aliasify(`${this.name}-filter`)\n const filtersRaw = el.getAttribute(filterAttr)\n let filters: SignalFilterOptions = {}\n if (filtersRaw) {\n filters = jsStrToObject(filtersRaw)\n }\n\n let running = false\n\n const callback: EventListener = modifyTiming(\n (evt: CustomEvent) => {\n if (running) return\n const watched = filtered(filters, evt.detail)\n if (!isEmpty(watched)) {\n running = true\n beginBatch()\n try {\n rx(watched)\n } finally {\n endBatch()\n running = false\n }\n }\n },\n mods,\n )\n\n document.addEventListener(DATASTAR_SIGNAL_PATCH_EVENT, callback)\n return () => {\n document.removeEventListener(DATASTAR_SIGNAL_PATCH_EVENT, callback)\n }\n },\n})\n", "// Icon: mdi:cursor-pointer\n// Slug: Creates a reference to an element.\n// Description: Creates a new signal that is a reference to the element on which the data attribute is placed.\n\nimport { attribute } from '@engine'\nimport { mergePaths } from '@engine/signals'\nimport { modifyCasing } from '@utils/text'\n\nattribute({\n name: 'ref',\n requirement: 'exclusive',\n apply({ el, key, mods, value }) {\n const signalName = key != null ? modifyCasing(key, mods) : value\n mergePaths([[signalName, el]])\n },\n})\n", "// Icon: streamline:interface-edit-view-eye-eyeball-open-view\n// Slug: Shows or hides an element.\n// Description: Shows or hides an element based on whether an expression evaluates to `true` or `false`.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\n\nconst NONE = 'none'\nconst DISPLAY = 'display'\n\nattribute({\n name: 'show',\n requirement: {\n key: 'denied',\n value: 'must',\n },\n returnsValue: true,\n apply({ el, rx }) {\n const update = () => {\n observer.disconnect()\n const shouldShow = rx()\n if (shouldShow) {\n if (el.style.display === NONE) el.style.removeProperty(DISPLAY)\n } else {\n el.style.setProperty(DISPLAY, NONE)\n }\n observer.observe(el, { attributeFilter: ['style'] })\n }\n const observer = new MutationObserver(update)\n const cleanup = effect(update)\n\n return () => {\n observer.disconnect()\n cleanup()\n }\n },\n})\n", "// Icon: streamline:wifi-signal-full-remix\n// Slug: Patches signals into the existing signals.\n// Description: Patches (adds, updates or removes) one or more signals into the existing signals.\n\nimport { attribute } from '@engine'\nimport { mergePatch, mergePaths } from '@engine/signals'\nimport { modifyCasing } from '@utils/text'\n\nattribute({\n name: 'signals',\n returnsValue: true,\n apply({ key, mods, rx }) {\n const ifMissing = mods.has('ifmissing')\n\n if (key) {\n key = modifyCasing(key, mods)\n const value = rx?.()\n mergePaths([[key, value]], { ifMissing })\n } else {\n const patch = Object.assign({}, rx?.() as Record)\n mergePatch(patch, { ifMissing })\n }\n },\n})\n", "// Icon: material-symbols:format-paint-outline\n// Slug: Sets inline styles on an element based on an expression.\n// Description: Sets CSS styles on an element using either key-based or object syntax, and keeps them in sync with reactive signals.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\nimport { kebab } from '@utils/text'\n\nattribute({\n name: 'style',\n requirement: {\n value: 'must',\n },\n returnsValue: true,\n apply({ key, el, rx }) {\n const { style } = el\n const initialStyles = new Map()\n\n const apply = (prop: string, value: any) => {\n const initial = initialStyles.get(prop)\n if (!value && value !== 0) {\n initial !== undefined &&\n (initial\n ? style.setProperty(prop, initial)\n : style.removeProperty(prop))\n } else {\n initial === undefined &&\n initialStyles.set(prop, style.getPropertyValue(prop))\n style.setProperty(prop, String(value))\n }\n }\n\n const update = () => {\n observer.disconnect()\n\n if (key) {\n apply(key, rx())\n } else {\n const styles = rx() as Record\n\n for (const [prop, initial] of initialStyles) {\n prop in styles ||\n (initial\n ? style.setProperty(prop, initial)\n : style.removeProperty(prop))\n }\n\n for (const prop in styles) {\n apply(kebab(prop), styles[prop])\n }\n }\n\n observer.observe(el, { attributeFilter: ['style'] })\n }\n\n const observer = new MutationObserver(update)\n const cleanup = effect(update)\n\n return () => {\n observer.disconnect()\n cleanup()\n for (const [prop, initial] of initialStyles) {\n initial ? style.setProperty(prop, initial) : style.removeProperty(prop)\n }\n }\n },\n})\n", "// Icon: icon-park-outline:text\n// Slug: Binds the text content of an element.\n// Description: Binds the text content of an element to an expression.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\n\nattribute({\n name: 'text',\n requirement: {\n key: 'denied',\n value: 'must',\n },\n returnsValue: true,\n apply({ el, rx }) {\n const update = () => {\n observer.disconnect()\n el.textContent = `${rx()}`\n observer.observe(el, {\n childList: true,\n characterData: true,\n subtree: true,\n })\n }\n\n const observer = new MutationObserver(update)\n const cleanup = effect(update)\n\n return () => {\n observer.disconnect()\n cleanup()\n }\n },\n})\n", "// Icon: material-symbols:cloud-download\n// Slug: Patches elements into the DOM.\n// Description: Patches elements into the DOM.\n\nimport { watcher } from '@engine'\nimport {\n DATASTAR_PROP_CHANGE_EVENT,\n DATASTAR_SCOPE_CHILDREN_EVENT,\n} from '@engine/consts'\nimport type { WatcherArgsValue, WatcherContext } from '@engine/types'\nimport { isHTMLOrSVG } from '@utils/dom'\nimport { aliasify } from '@utils/text'\nimport { supportsViewTransitions } from '@utils/view-transitions'\n\nconst isValidType = (\n arr: T,\n value: string,\n): value is T[number] => (arr as readonly string[]).includes(value)\n\nconst PATCH_MODES = [\n 'remove',\n 'outer',\n 'inner',\n 'replace',\n 'prepend',\n 'append',\n 'before',\n 'after',\n] as const\ntype PatchElementsMode = (typeof PATCH_MODES)[number]\n\nconst NAMESPACES = ['html', 'svg', 'mathml'] as const\ntype Namespace = (typeof NAMESPACES)[number]\n\ntype PatchElementsArgs = {\n selector: string\n mode: PatchElementsMode\n namespace: Namespace\n elements: WatcherArgsValue\n}\n\nwatcher({\n name: 'datastar-patch-elements',\n apply(ctx, args) {\n const selector = typeof args.selector === 'string' ? args.selector : ''\n const mode = typeof args.mode === 'string' ? args.mode : 'outer'\n const namespace =\n typeof args.namespace === 'string' ? args.namespace : 'html'\n const useViewTransition =\n typeof args.useViewTransition === 'string' && args.useViewTransition.trim() === 'true'\n const viewTransitionSelector =\n typeof args.viewTransitionSelector === 'string' ? args.viewTransitionSelector : ''\n const elements = args.elements\n\n if (!isValidType(PATCH_MODES, mode)) {\n throw ctx.error('PatchElementsInvalidMode', { mode })\n }\n\n if (!selector && mode !== 'outer' && mode !== 'replace') {\n throw ctx.error('PatchElementsExpectedSelector')\n }\n\n if (!isValidType(NAMESPACES, namespace)) {\n throw ctx.error('PatchElementsInvalidNamespace', { namespace })\n }\n\n const patchElementsArgs: PatchElementsArgs = {\n selector,\n mode,\n namespace,\n elements,\n }\n\n if (useViewTransition && supportsViewTransitions()) {\n let element: any = document.documentElement\n if (viewTransitionSelector) {\n const el = document.querySelector(viewTransitionSelector)\n if (el && supportsViewTransitions(el)) {\n element = el\n }\n }\n element.startViewTransition(() => onPatchElements(ctx, patchElementsArgs))\n } else {\n onPatchElements(ctx, patchElementsArgs)\n }\n },\n})\n\nconst onPatchElements = (\n { error }: WatcherContext,\n { selector, mode, namespace, elements }: PatchElementsArgs,\n) => {\n let newContent = document.createDocumentFragment()\n let consume = typeof elements !== 'string' && !!elements\n\n if (typeof elements === 'string') {\n const elementsWithSvgsRemoved = elements.replace(\n /]*>|>)([\\s\\S]*?)<\\/svg>/gim,\n '',\n )\n const hasHtml = /<\\/html>/.test(elementsWithSvgsRemoved)\n const hasHead = /<\\/head>/.test(elementsWithSvgsRemoved)\n const hasBody = /<\\/body>/.test(elementsWithSvgsRemoved)\n\n const wrapperTag =\n namespace === 'svg' ? 'svg' : namespace === 'mathml' ? 'math' : ''\n const wrappedEls = wrapperTag\n ? `<${wrapperTag}>${elements}`\n : elements\n\n const newDocument = new DOMParser().parseFromString(\n hasHtml || hasHead || hasBody\n ? elements\n : ``,\n 'text/html',\n )\n\n if (hasHtml) {\n newContent.appendChild(newDocument.documentElement)\n } else if (hasHead && hasBody) {\n newContent.appendChild(newDocument.head)\n newContent.appendChild(newDocument.body)\n } else if (hasHead) {\n newContent.appendChild(newDocument.head)\n } else if (hasBody) {\n newContent.appendChild(newDocument.body)\n } else if (wrapperTag) {\n const wrapperEl = newDocument\n .querySelector('template')!\n .content.querySelector(wrapperTag)!\n for (const child of wrapperEl.childNodes) {\n newContent.appendChild(child)\n }\n } else {\n newContent = newDocument.querySelector('template')!.content\n }\n } else if (elements) {\n if (elements instanceof DocumentFragment) {\n newContent = elements\n } else if (elements instanceof Element) {\n newContent.appendChild(elements)\n }\n }\n\n if (!selector && (mode === 'outer' || mode === 'replace')) {\n const children = Array.from(newContent.children)\n for (const child of children) {\n let target: Element\n if (child instanceof HTMLHtmlElement) {\n target = document.documentElement\n } else if (child instanceof HTMLBodyElement) {\n target = document.body\n } else if (child instanceof HTMLHeadElement) {\n target = document.head\n } else {\n target = document.getElementById(child.id)!\n if (!target) {\n console.warn(error('PatchElementsNoTargetsFound'), {\n element: { id: child.id },\n })\n continue\n }\n }\n\n // Consume the new content so we don\u2019t deep clone.\n applyToTargets(mode as PatchElementsMode, child, [target], true)\n }\n } else {\n const targets = document.querySelectorAll(selector)\n if (!targets.length) {\n console.warn(error('PatchElementsNoTargetsFound'), { selector })\n return\n }\n\n const targetList = consume && mode !== 'remove' ? [targets[0]!] : targets\n\n // If only one target exists, we can safely consume the new content which prevents deep cloning (https://github.com/starfederation/datastar/issues/1155).\n if (targetList.length === 1) {\n consume = true\n }\n\n applyToTargets(mode as PatchElementsMode, newContent, targetList, consume)\n }\n}\n\nconst scripts = new WeakSet()\nfor (const script of document.querySelectorAll('script')) {\n scripts.add(script)\n}\n\nconst execute = (target: Element): void => {\n const elScripts =\n target instanceof HTMLScriptElement\n ? [target]\n : target.querySelectorAll('script')\n for (const old of elScripts) {\n if (!scripts.has(old)) {\n const script = document.createElement('script')\n for (const { name, value } of old.attributes) {\n script.setAttribute(name, value)\n }\n script.text = old.text\n old.replaceWith(script)\n scripts.add(script)\n }\n }\n}\n\nconst applyPatchMode = (\n targets: Iterable,\n element: DocumentFragment | Element,\n action: string,\n consume: boolean,\n) => {\n let used = false\n for (const target of targets) {\n if (consume && used) {\n break\n }\n const nextNode = consume ? element : (element.cloneNode(true) as Element)\n execute(nextNode as Element)\n // @ts-expect-error - calling dynamic method path on DOM element\n target[action](nextNode)\n used = true\n }\n}\n\nconst applyToTargets = (\n mode: PatchElementsMode,\n element: DocumentFragment | Element,\n targets: Iterable,\n consume: boolean,\n) => {\n switch (mode) {\n case 'remove':\n for (const target of targets) {\n target.remove()\n }\n break\n case 'outer':\n case 'inner':\n {\n let used = false\n for (const target of targets) {\n if (consume && used) {\n break\n }\n const nextNode = consume ? element : (element.cloneNode(true) as Element)\n morph(target, nextNode, mode)\n execute(target)\n const scopeHost = target.closest('[data-scope-children]')\n if (scopeHost) {\n scopeHost.dispatchEvent(\n new CustomEvent(DATASTAR_SCOPE_CHILDREN_EVENT, {\n bubbles: false,\n }),\n )\n }\n used = true\n }\n }\n break\n case 'replace':\n applyPatchMode(targets, element, 'replaceWith', consume)\n break\n case 'prepend':\n case 'append':\n case 'before':\n case 'after':\n applyPatchMode(targets, element, mode, consume)\n }\n}\n\nconst ctxIdMap = new Map>()\nconst ctxPersistentIds = new Set()\nconst oldIdTagNameMap = new Map()\nconst duplicateIds = new Set()\nconst ctxPantry = document.createElement('div')\nctxPantry.hidden = true\n\nconst aliasedIgnoreMorph = aliasify('ignore-morph')\nconst aliasedIgnoreMorphAttr = `[${aliasedIgnoreMorph}]`\nexport const morph = (\n oldElt: Element | ShadowRoot,\n newContent: DocumentFragment | Element,\n mode: 'outer' | 'inner' = 'outer',\n): void => {\n if (\n (isHTMLOrSVG(oldElt) &&\n isHTMLOrSVG(newContent) &&\n oldElt.hasAttribute(aliasedIgnoreMorph) &&\n newContent.hasAttribute(aliasedIgnoreMorph)) ||\n oldElt.parentElement?.closest(aliasedIgnoreMorphAttr)\n ) {\n return\n }\n\n const normalizedElt = document.createElement('div')\n normalizedElt.append(newContent)\n document.body.insertAdjacentElement('afterend', ctxPantry)\n\n // Computes the set of IDs that persist between the two contents excluding duplicates\n const oldIdElements = oldElt.querySelectorAll('[id]')\n for (const { id, tagName } of oldIdElements) {\n if (oldIdTagNameMap.has(id)) {\n duplicateIds.add(id)\n } else {\n oldIdTagNameMap.set(id, tagName)\n }\n }\n if (oldElt instanceof Element && oldElt.id) {\n if (oldIdTagNameMap.has(oldElt.id)) {\n duplicateIds.add(oldElt.id)\n } else {\n oldIdTagNameMap.set(oldElt.id, oldElt.tagName)\n }\n }\n\n ctxPersistentIds.clear()\n const newIdElements = normalizedElt.querySelectorAll('[id]')\n for (const { id, tagName } of newIdElements) {\n if (ctxPersistentIds.has(id)) {\n duplicateIds.add(id)\n } else if (oldIdTagNameMap.get(id) === tagName) {\n ctxPersistentIds.add(id)\n }\n }\n\n for (const id of duplicateIds) {\n ctxPersistentIds.delete(id)\n }\n\n oldIdTagNameMap.clear()\n duplicateIds.clear()\n ctxIdMap.clear()\n\n const parent = mode === 'outer' ? oldElt.parentElement! : oldElt\n populateIdMapWithTree(parent, oldIdElements)\n populateIdMapWithTree(normalizedElt, newIdElements)\n\n morphChildren(\n parent,\n normalizedElt,\n mode === 'outer' ? oldElt : null,\n oldElt.nextSibling,\n )\n\n ctxPantry.remove()\n}\n\n// This is the core algorithm for matching up children.\n// The idea is to use ID sets to try to match up nodes as faithfully as possible.\n// We greedily match, which allows us to keep the algorithm fast,\n// but by using ID sets, we are able to better match up with content deeper in the DOM.\nconst morphChildren = (\n oldParent: Element | ShadowRoot, // the old content that we are merging the new content into\n newParent: Element, // the parent element of the new content\n insertionPoint: Node | null = null, // the point in the DOM we start morphing at (defaults to first child)\n endPoint: Node | null = null, // the point in the DOM we stop morphing at (defaults to after last child)\n): void => {\n // normalize\n if (\n oldParent instanceof HTMLTemplateElement &&\n newParent instanceof HTMLTemplateElement\n ) {\n // we can pretend the DocumentElement is an Element\n oldParent = oldParent.content as unknown as Element\n newParent = newParent.content as unknown as Element\n }\n insertionPoint ??= oldParent.firstChild\n\n // run through all the new content\n for (const newChild of newParent.childNodes) {\n // once we reach the end of the old parent content skip to the end and insert the rest\n if (insertionPoint && insertionPoint !== endPoint) {\n const bestMatch = findBestMatch(newChild, insertionPoint, endPoint)\n if (bestMatch) {\n // if the node to morph is not at the insertion point then remove/move up to it\n if (bestMatch !== insertionPoint) {\n let cursor: Node | null = insertionPoint\n // Remove nodes between the start and end nodes\n while (cursor && cursor !== bestMatch) {\n const tempNode = cursor\n cursor = cursor.nextSibling\n removeNode(tempNode)\n }\n }\n morphNode(bestMatch, newChild)\n insertionPoint = bestMatch.nextSibling\n continue\n }\n }\n\n // if the matching node is elsewhere in the original content\n if (newChild instanceof Element && ctxPersistentIds.has(newChild.id)) {\n // move it and all its children here and morph, will always be found\n // Search for an element by ID within the document and pantry, and move it using moveBefore.\n const movedChild = document.getElementById(newChild.id) as Element\n\n // Removes an element from its ancestors' ID maps.\n // This is needed when an element is moved from the \"future\" via `moveBeforeId`.\n // Otherwise, its erstwhile ancestors could be mistakenly moved to the pantry rather than being deleted,\n // preventing their removal hooks from being called.\n let current = movedChild\n while ((current = current.parentNode as Element)) {\n const idSet = ctxIdMap.get(current)\n if (idSet) {\n idSet.delete(newChild.id)\n if (!idSet.size) {\n ctxIdMap.delete(current)\n }\n }\n }\n\n moveBefore(oldParent, movedChild, insertionPoint)\n morphNode(movedChild, newChild)\n insertionPoint = movedChild.nextSibling\n continue\n }\n\n // This performs the action of inserting a new node while handling situations where the node contains\n // elements with persistent IDs and possible state info we can still preserve by moving in and then morphing\n if (ctxIdMap.has(newChild)) {\n // node has children with IDs with possible state so create a dummy elt of same type and apply full morph algorithm\n const namespaceURI = (newChild as Element).namespaceURI\n const tagName = (newChild as Element).tagName\n const newEmptyChild =\n namespaceURI && namespaceURI !== 'http://www.w3.org/1999/xhtml'\n ? document.createElementNS(namespaceURI, tagName)\n : document.createElement(tagName)\n oldParent.insertBefore(newEmptyChild, insertionPoint)\n morphNode(newEmptyChild, newChild)\n insertionPoint = newEmptyChild.nextSibling\n } else {\n // optimization: no id state to preserve so we can just insert a clone of the newChild and its descendants\n const newClonedChild = document.importNode(newChild, true) // importNode to not mutate newParent\n oldParent.insertBefore(newClonedChild, insertionPoint)\n insertionPoint = newClonedChild.nextSibling\n }\n }\n\n // remove any remaining old nodes that didn't match up with new content\n while (insertionPoint && insertionPoint !== endPoint) {\n const tempNode = insertionPoint\n insertionPoint = insertionPoint.nextSibling\n removeNode(tempNode)\n }\n}\n\n// Scans forward from the startPoint to the endPoint looking for a match for the node.\n// It looks for an id set match first, then a soft match.\n// We abort soft matching if we find two future soft matches, to reduce churn.\nconst findBestMatch = (\n node: Node,\n startPoint: Node | null,\n endPoint: Node | null,\n): Node | null => {\n let bestMatch: Node | null | undefined = null\n let nextSibling = node.nextSibling\n let siblingSoftMatchCount = 0\n let displaceMatchCount = 0\n\n // Max ID matches we are willing to displace in our search\n const nodeMatchCount = ctxIdMap.get(node)?.size || 0\n\n let cursor = startPoint\n while (cursor && cursor !== endPoint) {\n // soft matching is a prerequisite for id set matching\n if (isSoftMatch(cursor, node)) {\n let isIdSetMatch = false\n const oldSet = ctxIdMap.get(cursor)\n const newSet = ctxIdMap.get(node)\n\n if (newSet && oldSet) {\n for (const id of oldSet) {\n // a potential match is an id in the new and old nodes that\n // has not already been merged into the DOM\n // But the newNode content we call this on has not been\n // merged yet and we don't allow duplicate IDs so it is simple\n if (newSet.has(id)) {\n isIdSetMatch = true\n break\n }\n }\n }\n\n if (isIdSetMatch) {\n return cursor // found an id set match, we're done!\n }\n\n // we haven\u2019t yet saved a soft match fallback\n // the current soft match will hard match something else in the future, leave it\n if (!bestMatch && !ctxIdMap.has(cursor)) {\n // optimization: if node can't id set match, we can just return the soft match immediately\n if (!nodeMatchCount) {\n return cursor\n }\n // save this as the fallback if we get through the loop without finding a hard match\n bestMatch = cursor\n }\n }\n\n // check for IDs we may be displaced when matching\n displaceMatchCount += ctxIdMap.get(cursor)?.size || 0\n if (displaceMatchCount > nodeMatchCount) {\n // if we are going to displace more IDs than the node contains then\n // we do not have a good candidate for an ID match, so return\n break\n }\n\n if (bestMatch === null && nextSibling && isSoftMatch(cursor, nextSibling)) {\n // The next new node has a soft match with this node, so\n // increment the count of future soft matches\n siblingSoftMatchCount++\n nextSibling = nextSibling.nextSibling\n\n // If there are two future soft matches, block soft matching for this node to allow\n // future siblings to soft match. This is to reduce churn in the DOM when an element\n // is prepended.\n if (siblingSoftMatchCount >= 2) {\n bestMatch = undefined\n }\n }\n\n cursor = cursor.nextSibling\n }\n\n return bestMatch || null\n}\n\n// ok to cast: if one is not element, `id` and `tagName` will be null and we'll just compare that.\nconst isSoftMatch = (oldNode: Node, newNode: Node): boolean =>\n oldNode.nodeType === newNode.nodeType &&\n (oldNode as Element).tagName === (newNode as Element).tagName &&\n // If oldElt has an `id` with possible state and it doesn\u2019t match newElt.id then avoid morphing.\n // We'll still match an anonymous node with an IDed newElt, though, because if it got this far,\n // its not persistent, and new nodes can't have any hidden state.\n (!(oldNode as Element).id ||\n (oldNode as Element).id === (newNode as Element).id)\n\n// Gets rid of an unwanted DOM node; strategy depends on nature of its reuse:\n// - Persistent nodes will be moved to the pantry for later reuse\n// - Other nodes will have their hooks called, and then are removed\nconst removeNode = (node: Node): void => {\n // are we going to id set match this later?\n ctxIdMap.has(node)\n ? // skip callbacks and move to pantry\n moveBefore(ctxPantry, node, null)\n : // remove for realsies\n node.parentNode?.removeChild(node)\n}\n\n// Moves an element before another element within the same parent.\n// Uses the proposed `moveBefore` API if available (and working), otherwise falls back to `insertBefore`.\n// This is essentially a forward-compat wrapper.\nconst moveBefore = (parentNode: Node, node: Node, after: Node | null): void => {\n if ('moveBefore' in parentNode) {\n const moveableParent = parentNode as Node & {\n moveBefore: (node: Node, child: Node | null) => Node\n }\n moveableParent.moveBefore(node, after)\n return\n }\n parentNode.insertBefore(node, after)\n}\n\nconst aliasedPreserveAttr = aliasify('preserve-attr')\n\n// syncs the oldNode to the newNode, copying over all attributes and\n// inner element state from the newNode to the oldNode\nconst morphNode = (\n oldNode: Node, // root node to merge content into\n newNode: Node, // new content to merge\n): Node => {\n const type = newNode.nodeType\n\n // if is an element type, sync the attributes from the\n // new node into the new node\n if (type === 1 /* element type */) {\n const oldElt = oldNode as Element\n const newElt = newNode as Element\n const shouldScopeChildren = oldElt.hasAttribute('data-scope-children')\n if (\n oldElt.hasAttribute(aliasedIgnoreMorph) &&\n newElt.hasAttribute(aliasedIgnoreMorph)\n ) {\n return oldNode\n }\n\n // The following logic for handling inputs, textareas, and options is finnicky.\n // Only change with extreme caution and lots of testing!\n // --\n // many bothans died to bring us this information:\n // https://github.com/patrick-steele-idem/morphdom/blob/master/src/specialElHandlers.js\n // https://github.com/choojs/nanomorph/blob/master/lib/morph.js#L113\n // --\n\n const preserveAttrs = (\n (newNode as HTMLElement).getAttribute(aliasedPreserveAttr) ?? ''\n ).split(' ')\n\n const updateElementProp = (\n oldElt: Element,\n newElt: Element,\n name: string,\n ): boolean => {\n const newEltHasAttr = newElt.hasAttribute(name)\n if (\n oldElt.hasAttribute(name) !== newEltHasAttr &&\n !preserveAttrs.includes(name)\n ) {\n // @ts-expect-error - setting dynamic property for native DOM properties\n oldElt[name] = newEltHasAttr\n return true\n }\n return false\n }\n\n let shouldDispatchPropChangeEvent = false\n if (\n oldElt instanceof HTMLInputElement &&\n newElt instanceof HTMLInputElement &&\n newElt.type !== 'file'\n ) {\n // Modify the value only if the new element\u2019s value attribute is different from the old element\u2019s value attribute\n const newValue = newElt.getAttribute('value')\n if (\n oldElt.getAttribute('value') !== newValue &&\n !preserveAttrs.includes('value')\n ) {\n oldElt.value = newValue ?? ''\n shouldDispatchPropChangeEvent = true\n }\n // Update checked and disabled properties\n shouldDispatchPropChangeEvent =\n updateElementProp(oldElt, newElt, 'checked') ||\n shouldDispatchPropChangeEvent\n updateElementProp(oldElt, newElt, 'disabled')\n } else if (\n oldElt instanceof HTMLTextAreaElement &&\n newElt instanceof HTMLTextAreaElement\n ) {\n // Modify the value only if the new element\u2019s value is different from the old element\u2019s default value\n const newValue = newElt.value\n if (oldElt.defaultValue !== newValue) {\n oldElt.value = newValue\n shouldDispatchPropChangeEvent = true\n }\n } else if (\n oldElt instanceof HTMLOptionElement &&\n newElt instanceof HTMLOptionElement\n ) {\n shouldDispatchPropChangeEvent =\n updateElementProp(oldElt, newElt, 'selected') ||\n shouldDispatchPropChangeEvent\n }\n\n for (const { name, value } of newElt.attributes) {\n if (\n oldElt.getAttribute(name) !== value &&\n !preserveAttrs.includes(name)\n ) {\n oldElt.setAttribute(name, value)\n }\n }\n\n // Create a static copy, so we can iterate forward safely as we remove attributes\n for (const { name } of Array.from(oldElt.attributes)) {\n if (!newElt.hasAttribute(name) && !preserveAttrs.includes(name)) {\n oldElt.removeAttribute(name)\n }\n }\n\n if (shouldDispatchPropChangeEvent) {\n const dispatchElt =\n oldElt instanceof HTMLOptionElement ? oldElt.closest('select') : oldElt\n dispatchElt?.dispatchEvent(\n new Event(DATASTAR_PROP_CHANGE_EVENT, { bubbles: true }),\n )\n }\n\n // Preserve the scope marker even if the incoming markup doesn't carry it.\n if (shouldScopeChildren && !oldElt.hasAttribute('data-scope-children')) {\n oldElt.setAttribute('data-scope-children', '')\n }\n\n if (\n oldElt instanceof HTMLTemplateElement &&\n newElt instanceof HTMLTemplateElement\n ) {\n oldElt.innerHTML = newElt.innerHTML\n } else if (!oldElt.isEqualNode(newElt)) {\n morphChildren(oldElt, newElt)\n }\n\n if (shouldScopeChildren) {\n oldElt.dispatchEvent(\n new CustomEvent(DATASTAR_SCOPE_CHILDREN_EVENT, { bubbles: false }),\n )\n }\n }\n\n if (type === 8 /* comment */ || type === 3 /* text */) {\n if (oldNode.nodeValue !== newNode.nodeValue) {\n oldNode.nodeValue = newNode.nodeValue\n }\n }\n\n return oldNode\n}\n\n// A bottom-up algorithm that populates a map of Element -> IdSet.\n// The ID set for a given element is the set of all IDs contained within its subtree.\n// As an optimization, we filter these IDs through the given list of persistent IDs,\n// because we don't need to bother considering IDed elements that won't be in the new content.\nconst populateIdMapWithTree = (\n root: Element | ShadowRoot | null,\n elements: Iterable,\n): void => {\n for (const elt of elements) {\n if (ctxPersistentIds.has(elt.id)) {\n let current: Element | null = elt\n // walk up the parent hierarchy of that element, adding the ID of element to the parent's ID set\n while (current && current !== root) {\n let idSet = ctxIdMap.get(current)\n // if the ID set doesn\u2019t exist, create it and insert it in the map\n if (!idSet) {\n idSet = new Set()\n ctxIdMap.set(current, idSet)\n }\n idSet.add(elt.id)\n current = current.parentElement\n }\n }\n }\n}\n", "// Icon: material-symbols:settings-input-antenna\n// Slug: Patches signals.\n// Description: Patches signals.\n\nimport { watcher } from '@engine'\nimport { mergePatch } from '@engine/signals'\nimport { jsStrToObject } from '@utils/text'\n\nwatcher({\n name: 'datastar-patch-signals',\n apply({ error }, { signals, onlyIfMissing }) {\n if (typeof signals !== 'string') {\n throw error('PatchSignalsExpectedSignals')\n }\n\n const ifMissing =\n typeof onlyIfMissing === 'string' && onlyIfMissing.trim() === 'true'\n mergePatch(jsStrToObject(signals), { ifMissing })\n },\n})\n"], + "mappings": "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", + "names": ["lol", "DSP", "DSS", "DATASTAR_FETCH_EVENT", "DATASTAR_PROP_CHANGE_EVENT", "DATASTAR_READY_EVENT", "DATASTAR_SCOPE_CHILDREN_EVENT", "DATASTAR_SIGNAL_PATCH_EVENT", "hasOwn", "isPojo", "obj", "isEmpty", "prop", "hasOwn", "updateLeaves", "fn", "key", "val", "pathToObj", "paths", "result", "path", "value", "keys", "lastKey", "acc", "currentPatch", "queuedEffects", "batchDepth", "notifyIndex", "queuedEffectsLength", "prevSub", "activeSub", "version", "beginBatch", "endBatch", "flush", "dispatch", "startPeeking", "sub", "stopPeeking", "signal", "initialValue", "signalOper", "value_", "flags_", "computedSymbol", "computed", "getter", "c", "computedOper", "effect", "fn", "e", "fn_", "link", "effectOper", "run", "update", "updateComputed", "updateSignal", "startTracking", "oldValue", "endTracking", "s", "value", "notify", "flags", "subs", "subs_", "sub_", "checkDirty", "deps_", "dep", "dep_", "depFlags", "nextDep_", "propagate", "currentValue", "shallowPropagate", "unlink", "prevDep", "depsTail_", "nextDep", "version_", "subsTail_", "newLink", "prevDep_", "prevSub_", "nextSub_", "toRemove", "next", "stack", "top", "isValidLink", "subSubs", "nextSub", "prev_", "checkDepth", "dirty", "firstSub", "hasMultipleSubs", "checkLink", "getPath", "path", "result", "root", "split", "hasOwn", "deep", "prefix", "isArr", "isPojo", "deepObj", "key", "keys", "_", "prop", "newValue", "diff", "patch", "i", "pathStr", "nextVal", "detail", "pathToObj", "DATASTAR_SIGNAL_PATCH_EVENT", "mergePatch", "ifMissing", "mergeInner", "mergePaths", "paths", "options", "target", "targetParent", "toRegExp", "val", "filtered", "include", "exclude", "obj", "includeRe", "excludeRe", "node", "isHTMLOrSVG", "el", "kebab", "str", "camel", "x", "snake", "RE_FUNCTION_LITERAL", "jsStrToObject", "raw", "options", "reviveFunctionStrings", "_k", "value", "trimmed", "revived", "caseFns", "str", "x", "modifyCasing", "mods", "defaultCase", "c", "aliasify", "name", "unaliasify", "url", "error", "ctx", "reason", "metadata", "e", "r", "snake", "q", "c", "actionPlugins", "attributePlugins", "watcherPlugins", "actions", "_", "prop", "removals", "queuedAttributes", "queuedAttributeNames", "observedRoots", "datastarReadyDispatched", "attribute", "plugin", "roots", "root", "applyQueued", "action", "DATASTAR_FETCH_EVENT", "evt", "watcher", "cleanupEls", "els", "el", "elCleanups", "attrCleanups", "cleanup", "aliasedIgnore", "aliasify", "aliasedIgnoreAttr", "shouldIgnore", "applyEls", "onlyNew", "appliedKeys", "key", "attrKey", "applyAttributePlugin", "attr", "observe", "mutations", "target", "type", "attributeName", "addedNodes", "removedNodes", "node", "isHTMLOrSVG", "rawAttrKey", "unaliasify", "value", "mutationObserver", "parseAttributeKey", "rawKey", "namePart", "rawModifiers", "pluginName", "mods", "rawMod", "label", "mod", "isDocumentObserverActive", "dispatchDatastarReady", "DATASTAR_READY_EVENT", "observeRoot", "applyAttributePlugin", "el", "attrKey", "value", "onlyNew", "rawKey", "unaliasify", "pluginName", "key", "mods", "parseAttributeKey", "plugin", "attributePlugins", "queuedAttributeNames", "ctx", "error", "actionPlugins", "keyReq", "valueReq", "keyProvided", "valueProvided", "cleanups", "cachedRx", "args", "genRx", "cleanup", "elCleanups", "removals", "attrCleanups", "oldCleanup", "returnsValue", "argNames", "expr", "statementRe", "statements", "lastIdx", "last", "escaped", "escapeRe", "DSP", "DSS", "counter", "match", "k", "v", "quoted", "interpolationExpr", "signalName", "_", "innerSignalName", "acc", "part", "fn", "action", "name", "evt", "err", "actions", "root", "e", "action", "_", "fn", "startPeeking", "stopPeeking", "action", "_", "value", "filter", "startPeeking", "masked", "filtered", "updateLeaves", "mergePatch", "stopPeeking", "action", "_", "filter", "startPeeking", "masked", "filtered", "updateLeaves", "oldValue", "mergePatch", "stopPeeking", "abortControllers", "methodSupportsRequestBody", "method", "createHttpMethod", "name", "openWhenHiddenDefault", "action", "el", "evt", "error", "cleanups", "url", "selector", "userHeaders", "contentType", "include", "exclude", "openWhenHidden", "payload", "requestCancellation", "retry", "retryInterval", "retryScaler", "retryMaxWait", "retryMaxCount", "controller", "cleanupFn", "initialHeaders", "headers", "req", "response", "dispatchFetch", "ERROR", "type", "argsRawLines", "line", "i", "k", "v", "argsRaw", "isWrongContent", "buildFetchEventSourceInit", "urlInstance", "queryParams", "startPeeking", "requestPayload", "filtered", "stopPeeking", "body", "formEl", "formData", "submitter", "preventDefault", "multipart", "formParams", "key", "value", "STARTED", "fetchEventSource", "e", "FINISHED", "RETRYING", "RETRIES_FAILED", "DATASTAR_FETCH_EVENT", "err", "getBytes", "stream", "onChunk", "reader", "result", "getLines", "onLine", "buffer", "position", "fieldLength", "discardTrailingNewline", "arr", "concat", "bufLength", "lineStart", "lineEnd", "getMessages", "onId", "onRetry", "onMessage", "message", "newMessage", "decoder", "field", "valueOffset", "a", "b", "res", "resolve", "reject", "fetchInit", "input", "inputSignal", "inputHeaders", "inputOnOpen", "onmessage", "onclose", "inputFetch", "responseOverrides", "rest", "curRequestController", "onVisibilityChange", "currentFetchInit", "create", "retryTimer", "dispose", "fetch", "onopen", "retries", "baseRetryInterval", "retryRequest", "curRequestSignal", "dispatchNonSSE", "dispatchType", "argNames", "n", "kebab", "o", "status", "isNoContentStatus", "isRedirectStatus", "isErrorStatus", "ct", "script", "scriptAttributesHeader", "id", "innerErr", "attribute", "el", "key", "rx", "syncAttr", "val", "_k", "v", "update", "observer", "obj", "attributeFilter", "cleanup", "effect", "propAdapter", "prop", "events", "el", "value", "attrAdapter", "attr", "valueAdapter", "treatUndefinedAsString", "type", "dataURIRegex", "empty", "boundPath", "key", "rawKey", "signalName", "adapter", "initialValue", "rawAttribute", "aliasify", "selector", "checked", "input", "mergePaths", "inputs", "paths", "i", "hasOwn", "attribute", "mods", "error", "modifyCasing", "props", "syncSignal", "files", "signalFiles", "f", "resolve", "reader", "match", "typeMap", "option", "firstProp", "camel", "getPath", "path", "signalValue", "eventName", "DATASTAR_PROP_CHANGE_EVENT", "cleanup", "effect", "attribute", "key", "el", "mods", "rx", "modifyCasing", "classes", "callback", "observer", "k", "classNames", "cn", "name", "cleanup", "effect", "attribute", "key", "mods", "rx", "error", "mergePaths", "modifyCasing", "computed", "patch", "updateLeaves", "old", "mergePatch", "attribute", "rx", "effect", "attribute", "el", "key", "mods", "value", "signalName", "modifyCasing", "activeFetches", "mergePaths", "watcher", "event", "type", "elt", "STARTED", "FINISHED", "DATASTAR_FETCH_EVENT", "tagToMs", "args", "arg", "tagHas", "tags", "tag", "defaultValue", "tagFirst", "delay", "callback", "wait", "args", "throttle", "leading", "trailing", "debounce", "lastArgs", "timer", "modifyTiming", "mods", "delayArgs", "tagToMs", "debounceArgs", "tagHas", "throttleArgs", "supportsViewTransitions", "element", "modifyViewTransition", "callback", "mods", "cb", "args", "attribute", "rx", "mods", "callback", "beginBatch", "endBatch", "modifyViewTransition", "wait", "delayArgs", "tagToMs", "delay", "attribute", "el", "value", "mods", "spaces", "filters", "jsStrToObject", "callback", "observer", "filtered", "cleanup", "effect", "attribute", "el", "key", "mods", "rx", "target", "callback", "evt", "beginBatch", "endBatch", "modifyViewTransition", "modifyTiming", "eventName", "modifyCasing", "evtListOpts", "cb", "DATASTAR_FETCH_EVENT", "DATASTAR_SIGNAL_PATCH_EVENT", "listener", "clamp", "value", "min", "max", "once", "attribute", "el", "mods", "rx", "callback", "beginBatch", "endBatch", "modifyViewTransition", "modifyTiming", "options", "threshold", "clamp", "tagFirst", "exit", "observer", "entries", "entry", "attribute", "mods", "rx", "callback", "beginBatch", "endBatch", "modifyViewTransition", "duration", "durationArgs", "tagToMs", "tagHas", "intervalId", "attribute", "el", "key", "mods", "rx", "error", "filterAttr", "aliasify", "filtersRaw", "filters", "jsStrToObject", "running", "callback", "modifyTiming", "evt", "watched", "filtered", "isEmpty", "beginBatch", "endBatch", "DATASTAR_SIGNAL_PATCH_EVENT", "attribute", "el", "key", "mods", "value", "signalName", "modifyCasing", "mergePaths", "NONE", "DISPLAY", "attribute", "el", "rx", "update", "observer", "cleanup", "effect", "attribute", "key", "mods", "rx", "ifMissing", "modifyCasing", "value", "mergePaths", "patch", "mergePatch", "attribute", "key", "el", "rx", "style", "initialStyles", "apply", "prop", "value", "initial", "update", "observer", "styles", "kebab", "cleanup", "effect", "attribute", "el", "rx", "update", "observer", "cleanup", "effect", "isValidType", "arr", "value", "PATCH_MODES", "NAMESPACES", "watcher", "ctx", "args", "selector", "mode", "namespace", "useViewTransition", "viewTransitionSelector", "elements", "patchElementsArgs", "supportsViewTransitions", "element", "el", "onPatchElements", "error", "newContent", "consume", "elementsWithSvgsRemoved", "hasHtml", "hasHead", "hasBody", "wrapperTag", "wrappedEls", "newDocument", "wrapperEl", "child", "children", "target", "applyToTargets", "targets", "targetList", "scripts", "script", "execute", "elScripts", "old", "name", "applyPatchMode", "action", "used", "nextNode", "morph", "scopeHost", "DATASTAR_SCOPE_CHILDREN_EVENT", "ctxIdMap", "ctxPersistentIds", "oldIdTagNameMap", "duplicateIds", "ctxPantry", "aliasedIgnoreMorph", "aliasify", "aliasedIgnoreMorphAttr", "oldElt", "isHTMLOrSVG", "normalizedElt", "oldIdElements", "id", "tagName", "newIdElements", "parent", "populateIdMapWithTree", "morphChildren", "oldParent", "newParent", "insertionPoint", "endPoint", "newChild", "bestMatch", "findBestMatch", "cursor", "tempNode", "removeNode", "morphNode", "movedChild", "current", "idSet", "moveBefore", "namespaceURI", "newEmptyChild", "newClonedChild", "node", "startPoint", "nextSibling", "siblingSoftMatchCount", "displaceMatchCount", "nodeMatchCount", "isSoftMatch", "isIdSetMatch", "oldSet", "newSet", "oldNode", "newNode", "parentNode", "after", "aliasedPreserveAttr", "type", "newElt", "shouldScopeChildren", "preserveAttrs", "updateElementProp", "newEltHasAttr", "shouldDispatchPropChangeEvent", "newValue", "DATASTAR_PROP_CHANGE_EVENT", "root", "elt", "watcher", "error", "signals", "onlyIfMissing", "ifMissing", "mergePatch", "jsStrToObject"] } diff --git a/library/src/plugins/actions/fetch.ts b/library/src/plugins/actions/fetch.ts index 96bc2f90..5987fdba 100644 --- a/library/src/plugins/actions/fetch.ts +++ b/library/src/plugins/actions/fetch.ts @@ -90,8 +90,9 @@ const createHttpMethod = ( retryMaxCount, signal: controller.signal, onopen: async (response: Response) => { - if (response.status >= 400) + if (response.status >= 400) { dispatchFetch(ERROR, el, { status: response.status.toString() }) + } }, onmessage: (evt) => { if (!evt.event.startsWith('datastar')) return @@ -116,11 +117,6 @@ const createHttpMethod = ( // don't retry if the content-type is wrong throw error('FetchExpectedTextEventStream', { url }) } - // do nothing and it will retry - if (error) { - console.error(error.message) - dispatchFetch(RETRYING, el, { message: error.message }) - } }, } @@ -440,7 +436,7 @@ type FetchEventSourceInit = onopen?: (response: Response) => Promise onmessage?: (ev: EventSourceMessage) => void onclose?: () => void - onerror?: (err: any) => void + onerror?: (error: any) => void openWhenHidden?: boolean fetch?: typeof fetch retry?: 'auto' | 'error' | 'always' | 'never' @@ -468,7 +464,6 @@ const fetchEventSource = ( onopen: inputOnOpen, onmessage, onclose, - onerror, openWhenHidden, fetch: inputFetch, retry = 'auto', @@ -522,14 +517,11 @@ const fetchEventSource = ( let baseRetryInterval = retryInterval const retryRequest = () => { - retries++ - if (retries <= retryMaxCount) { + if (retries < retryMaxCount) { + dispatchFetch(RETRYING, el, {}) clearTimeout(retryTimer) - console.error( - `Datastar failed to reach ${input.toString()} retrying in ${retryInterval}ms.`, - ) retryTimer = setTimeout(create, retryInterval) - + retries++ // Prepare the interval for the next retry (exponential backoff) retryInterval = Math.min(retryInterval * retryScaler, retryMaxWait) } else {