diff --git a/MORPH_IMPROVEMENTS.md b/MORPH_IMPROVEMENTS.md new file mode 100644 index 00000000..ae745c68 --- /dev/null +++ b/MORPH_IMPROVEMENTS.md @@ -0,0 +1,91 @@ +# morphing Improvements Ported to Datastar + +## Overview + +This document describes the improvements ported from my test version of Idiomorph/htmx4 to Datastar's `patchElements.ts` morphing algorithm. These changes reduce DOM churn and improve matching behavior when updating the DOM. + +## Key Changes + +### 1. Enhanced Node Matching + +**New Function:** +- `matchesUpcomingSibling()` - Checks if a node matches any upcoming siblings within a limit using `isEqualNode()` + +**Changes:** +- Direct use of `isEqualNode()` for exact node matching in `findBestMatch()` and `matchesUpcomingSibling()` + +**Benefits:** +- Deep equality checking via `isEqualNode()` catches identical nodes +- Prevents premature matching when better matches exist later in the DOM +- Reduces unnecessary DOM operations + +### 2. Improved `findBestMatch()` Algorithm + +**Changes:** +- Added non-element node early exit (text/comment nodes only check first position) +- Replaced sibling soft match counting with scan limit (10 nodes) +- Added exact matching within scan window before falling back to tag-only matches +- Optimized active element check (moved earlier in loop for better performance) +- Added final check to defer soft match if upcoming siblings will use it better + +**Matching Priority:** +1. ID set match (highest priority) +2. Exact match via `isEqualNode()` (within scan window) +3. Tag-only match (fallback) + +**Benefits:** +- Better matching accuracy, especially for prepended elements +- Limits how far the algorithm scans to improve performance +- Reduces DOM churn by avoiding poor matches + +### 3. Node Preservation Strategy + +**New Function:** +- `moveNodesBetweenToEnd()` - Replaces inline removal logic + +**Changes:** +- Instead of removing nodes between insertion point and best match, potentially useful nodes are moved to the end for later reuse +- Nodes are preserved if they: + - Have ID children (contain state) + - Match upcoming new content + +**Benefits:** +- Preserves nodes that might be reused later +- Reduces unnecessary removal and recreation of DOM nodes +- Better state preservation + +**New Context Variables:** +- `ctxFutureMatches` - WeakSet tracking nodes that match upcoming siblings +- `ctxActiveElementAndParents` - Array of active element and its ancestors + +**Benefits:** +- optimize performance of slow contains Active Element lookup +- Tracks which nodes should be deferred for better matches + +## Performance Impact + +These improvements result in: +- **Reduced DOM churn** - Fewer unnecessary node removals and recreations +- **Better state preservation** - Nodes with IDs and form state are handled more carefully +- **Smarter matching** - Better heuristics for finding the right node to morph + +## Use Cases Improved + +1. **Prepending elements** - No longer causes excessive DOM churn +2. **Reordering lists** - Better detection of moved elements +3. **Dynamic content** - More accurate matching of similar elements + +## Technical Details + +### Scan Limit +The algorithm now scans up to 10 nodes ahead when looking for matches. This balances accuracy with performance. + +### Future Match Deferral +If a soft match would be better used by an upcoming sibling, the algorithm returns null to insert the current node instead, allowing the soft match to be used later. + +### Deep Equality Checking +The algorithm uses `isEqualNode()` which performs a deep comparison of nodes including their attributes, children, and content. This catches exact duplicates efficiently. + +## Source + +These improvements are based on recent enhancements to the Idiomorph algorithm that has been worked on for htmx4 based on the ideas from morphlex, which Datastar's morphing algorithm is derived from. diff --git a/bundles/datastar-core.js b/bundles/datastar-core.js index 4cabbae6..67883fc2 100644 --- a/bundles/datastar-core.js +++ b/bundles/datastar-core.js @@ -1,6 +1,5 @@ -// Datastar Core v1.0.0-RC.7 -var Y=/🖕JS_DS🚀/.source,K=Y.slice(0,5),j=Y.slice(4),ee="datastar-fetch",te="datastar-signal-patch";var g=Object.hasOwn??Object.prototype.hasOwnProperty.call;var v=e=>e!==null&&typeof e=="object"&&(Object.getPrototypeOf(e)===Object.prototype||Object.getPrototypeOf(e)===null);var _=e=>{let t={};for(let[n,i]of e){let s=n.split("."),o=s.pop(),r=s.reduce((a,c)=>a[c]??={},t);r[o]=i}return t};var M=[],W=[],C=0,E=0,J=0,z,p,L=0,$=()=>{C++},D=()=>{--C||(ie(),m())},G=e=>{z=p,p=e},V=()=>{p=z,z=void 0},x=e=>Pe.bind(0,{previousValue:e,t:e,e:1}),U=Symbol("computed"),xe=e=>{let t=Fe.bind(0,{e:17,getter:e});return t[U]=1,t},Te=e=>{let t={d:e,e:2};p&&Q(t,p),G(t),$();try{t.d()}finally{D(),V()}return ce.bind(0,t)},ie=()=>{for(;E"getter"in e?re(e):oe(e,e.t),re=e=>{G(e),le(e);try{let t=e.t;return t!==(e.t=e.getter(t))}finally{V(),fe(e)}},oe=(e,t)=>(e.e=1,e.previousValue!==(e.previousValue=t)),B=e=>{let t=e.e;if(!(t&64)){e.e=t|64;let n=e.s;n?B(n.o):W[J++]=e}},ae=(e,t)=>{if(t&16||t&32&&ue(e.i,e)){G(e),le(e),$();try{e.d()}finally{D(),V(),fe(e)}return}t&32&&(e.e=t&-33);let n=e.i;for(;n;){let i=n.c,s=i.e;s&64&&ae(i,i.e=s&-65),n=n.r}},Pe=(e,...t)=>{if(t.length){if(e.t!==(e.t=t[0])){e.e=17;let i=e.s;return i&&(we(i),C||ie()),!0}return!1}let n=e.t;if(e.e&16&&oe(e,n)){let i=e.s;i&&k(i)}return p&&Q(e,p),n},Fe=e=>{let t=e.e;if(t&16||t&32&&ue(e.i,e)){if(re(e)){let n=e.s;n&&k(n)}}else t&32&&(e.e=t&-33);return p&&Q(e,p),e.t},ce=e=>{let t=e.i;for(;t;)t=O(t,e);let n=e.s;n&&O(n),e.e=0},Q=(e,t)=>{let n=t.a;if(n&&n.c===e)return;let i=n?n.r:t.i;if(i&&i.c===e){i.g=L,t.a=i;return}let s=e.p;if(s&&s.g===L&&s.o===t)return;let o=t.a=e.p={g:L,c:e,o:t,l:n,r:i,f:s};i&&(i.l=o),n?n.r=o:t.i=o,s?s.n=o:e.s=o},O=(e,t=e.o)=>{let n=e.c,i=e.l,s=e.r,o=e.n,r=e.f;if(s?s.l=i:t.a=i,i?i.r=s:t.i=s,o?o.f=r:n.p=r,r)r.n=o;else if(!(n.s=o))if("getter"in n){let a=n.i;if(a){n.e=17;do a=O(a,n);while(a)}}else"previousValue"in n||ce(n);return s},we=e=>{let t=e.n,n;e:for(;;){let i=e.o,s=i.e;if(s&60?s&12?s&4?!(s&48)&&_e(e,i)?(i.e=s|40,s&=1):s=0:i.e=s&-9|32:s=0:i.e=s|32,s&2&&B(i),s&1){let o=i.s;if(o){let r=(e=o).n;r&&(n={t,u:n},t=r);continue}}if(e=t){t=e.n;continue}for(;n;)if(e=n.t,n=n.u,e){t=e.n;continue e}break}},le=e=>{L++,e.a=void 0,e.e=e.e&-57|4},fe=e=>{let t=e.a,n=t?t.r:e.i;for(;n;)n=O(n,e);e.e&=-5},ue=(e,t)=>{let n,i=0,s=!1;e:for(;;){let o=e.c,r=o.e;if(t.e&16)s=!0;else if((r&17)===17){if(ne(o)){let a=o.s;a.n&&k(a),s=!0}}else if((r&33)===33){(e.n||e.f)&&(n={t:e,u:n}),e=o.i,t=o,++i;continue}if(!s){let a=e.r;if(a){e=a;continue}}for(;i--;){let a=t.s,c=a.n;if(c?(e=n.t,n=n.u):e=a,s){if(ne(t)){c&&k(a),t=e.o;continue}s=!1}else t.e&=-33;if(t=e.o,e.r){e=e.r;continue e}}return s}},k=e=>{do{let t=e.o,n=t.e;(n&48)===32&&(t.e=n|16,n&2&&B(t))}while(e=e.n)},_e=(e,t)=>{let n=t.a;for(;n;){if(n===e)return!0;n=n.l}return!1},de=e=>{let t=R,n=e.split(".");for(let i of n){if(t==null||!g(t,i))return;t=t[i]}return t},N=(e,t="")=>{let n=Array.isArray(e);if(n||v(e)){let i=n?[]:{};for(let o in e)i[o]=x(N(e[o],`${t+o}.`));let s=x(0);return new Proxy(i,{get(o,r){if(!(r==="toJSON"&&!g(i,r)))return n&&r in Array.prototype?(s(),i[r]):typeof r=="symbol"?i[r]:((!g(i,r)||i[r]()==null)&&(i[r]=x(""),m(t+r,""),s(s()+1)),i[r]())},set(o,r,a){let c=t+r;if(n&&r==="length"){let l=i[r]-a;if(i[r]=a,l>0){let f={};for(let u=a;u{if(e!==void 0&&t!==void 0&&M.push([e,t]),!C&&M.length){let n=_(M);M.length=0,document.dispatchEvent(new CustomEvent(te,{detail:n}))}},ge=(e,{ifMissing:t}={})=>{$();for(let n in e)e[n]==null?t||delete R[n]:pe(e[n],n,R,"",t);D()},Me=(e,t)=>ge(_(e),t),pe=(e,t,n,i,s)=>{if(v(e)){g(n,t)&&(v(n[t])||Array.isArray(n[t]))||(n[t]={});for(let o in e)e[o]==null?s||delete n[t][o]:pe(e[o],o,n[t],`${i+t}.`,s)}else s&&g(n,t)||(n[t]=e)},se=e=>typeof e=="string"?RegExp(e.replace(/^\/|\/$/g,"")):e,Ee=({include:e=/.*/,exclude:t=/(?!)/}={},n=R)=>{let i=se(e),s=se(t),o=[],r=[[n,""]];for(;r.length;){let[a,c]=r.pop();for(let l in a){let f=c+l;v(a[l])?r.push([a[l],`${f}.`]):i.test(f)&&!s.test(f)&&o.push([f,de(f)])}}return _(o)},R=N({});var T=e=>e instanceof HTMLElement||e instanceof SVGElement||e instanceof MathMLElement;var Le=e=>e.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();var ye=e=>Le(e).replace(/-/g,"_");var me=e=>`data-${e}`;var Ne="https://data-star.dev/errors",P=(e,t,n={})=>{Object.assign(n,e);let i=new Error,s=ye(t),o=new URLSearchParams({metadata:JSON.stringify(n)}).toString(),r=JSON.stringify(n,null,2);return i.message=`${t} -More info: ${Ne}/${s}?${o} -Context: ${r}`,i},F=new Map,Z=new Map,Re=new Map,he=new Proxy({},{get:(e,t)=>F.get(t)?.apply,has:(e,t)=>F.has(t),ownKeys:()=>Reflect.ownKeys(F),set:()=>!1,deleteProperty:()=>!1}),w=new Map,q=[],X=new Set,Oe=new WeakSet,ke=e=>{q.push(e),q.length===1&&setTimeout(()=>{for(let t of q)X.add(t.name),Z.set(t.name,t);q.length=0,He(),X.clear()})},Ce=e=>{F.set(e.name,e)};document.addEventListener(ee,e=>{let t=Re.get(e.detail.type);t&&t.apply({error:P.bind(0,{plugin:{type:"watcher",name:t.name},element:{id:e.target.id,tag:e.target.tagName}})},e.detail.argsRaw)});var $e=e=>{Re.set(e.name,e)},ve=e=>{for(let t of e){let n=w.get(t);if(n&&w.delete(t))for(let i of n.values())for(let s of i.values())s()}},Ae=me("ignore"),De=`[${Ae}]`,be=e=>e.hasAttribute(`${Ae}__self`)||!!e.closest(De),H=(e,t)=>{for(let n of e)if(!be(n))for(let i in n.dataset)Se(n,i.replace(/[A-Z]/g,"-$&").toLowerCase(),n.dataset[i],t)},Ge=e=>{for(let{target:t,type:n,attributeName:i,addedNodes:s,removedNodes:o}of e)if(n==="childList"){for(let r of o)T(r)&&(ve([r]),ve(r.querySelectorAll("*")));for(let r of s)T(r)&&(H([r]),H(r.querySelectorAll("*")))}else if(n==="attributes"&&i.startsWith("data-")&&T(t)&&!be(t)){let r=i.slice(5),a=t.getAttribute(i);if(a===null){let c=w.get(t);if(c){let l=c.get(r);if(l){for(let f of l.values())f();c.delete(r)}}}else Se(t,r,a)}},Ve=new MutationObserver(Ge),qe=e=>{let[t,...n]=e.split("__"),[i,s]=t.split(/:(.+)/),o=new Map;for(let r of n){let[a,...c]=r.split(".");o.set(a,new Set(c))}return{pluginName:i,key:s,mods:o}};var He=(e=document.documentElement,t=!0)=>{T(e)&&H([e],!0),H(e.querySelectorAll("*"),!0),t&&(Ve.observe(e,{subtree:!0,childList:!0,attributes:!0}),Oe.add(e))},Se=(e,t,n,i)=>{{let s=t,{pluginName:o,key:r,mods:a}=qe(s),c=Z.get(o);if((!i||X.has(o))&&c){let l={el:e,rawKey:s,mods:a,error:P.bind(0,{plugin:{type:"attribute",name:c.name},element:{id:e.id,tag:e.tagName},expression:{rawKey:s,key:r,value:n}}),key:r,value:n,loadedPluginNames:{actions:new Set(F.keys()),attributes:new Set(Z.keys())},rx:void 0},f=c.requirement&&(typeof c.requirement=="string"?c.requirement:c.requirement.key)||"allowed",u=c.requirement&&(typeof c.requirement=="string"?c.requirement:c.requirement.value)||"allowed",d=r!=null&&r!=="",h=n!=null&&n!=="";if(d){if(f==="denied")throw l.error("KeyNotAllowed")}else if(f==="must")throw l.error("KeyRequired");if(h){if(u==="denied")throw l.error("ValueNotAllowed")}else if(u==="must")throw l.error("ValueRequired");if(f==="exclusive"||u==="exclusive"){if(d&&h)throw l.error("KeyAndValueProvided");if(!d&&!h)throw l.error("KeyOrValueRequired")}let b=new Map;if(h){let A;l.rx=(...I)=>(A||(A=Ie(n,{returnsValue:c.returnsValue,argNames:c.argNames,cleanups:b})),A(e,...I))}let S=c.apply(l);S&&b.set("attribute",S);let y=w.get(e);if(y){let A=y.get(s);if(A)for(let I of A.values())I()}else y=new Map,w.set(e,y);y.set(s,b)}}},Ie=(e,{returnsValue:t=!1,argNames:n=[],cleanups:i=new Map}={})=>{let s="";if(t){let c=/(\/(\\\/|[^/])*\/|"(\\"|[^"])*"|'(\\'|[^'])*'|`(\\`|[^`])*`|\(\s*((function)\s*\(\s*\)|(\(\s*\))\s*=>)\s*(?:\{[\s\S]*?\}|[^;){]*)\s*\)\s*\(\s*\)|[^;])+/gm,l=e.trim().match(c);if(l){let f=l.length-1,u=l[f].trim();u.startsWith("return")||(l[f]=`return (${u});`),s=l.join(`; -`)}}else s=e.trim();let o=new Map,r=RegExp(`(?:${K})(.*?)(?:${j})`,"gm"),a=0;for(let c of s.matchAll(r)){let l=c[1],f=`__escaped${a++}`;o.set(f,l),s=s.replace(K+l+j,f)}s=s.replace(/\$\['([a-zA-Z_$\d][\w$]*)'\]/g,"$$$1").replace(/\$([a-zA-Z_\d]\w*(?:[.-]\w+)*)/g,(c,l)=>l.split(".").reduce((f,u)=>`${f}['${u}']`,"$")),s=s.replaceAll(/@([A-Za-z_$][\w$]*)\(/g,'__action("$1",evt,');for(let[c,l]of o)s=s.replace(c,l);try{let c=Function("el","$","__action","evt",...n,s);return(l,...f)=>{let u=(d,h,...b)=>{let S=P.bind(0,{plugin:{type:"action",name:d},element:{id:l.id,tag:l.tagName},expression:{fnContent:s,value:e}}),y=he[d];if(y)return y({el:l,evt:h,error:S,cleanups:i},...b);throw S("UndefinedAction")};try{return c(l,R,u,void 0,...f)}catch(d){throw console.error(d),P({element:{id:l.id,tag:l.tagName},expression:{fnContent:s,value:e},error:d.message},"ExecuteExpression")}}}catch(c){throw console.error(c),P({expression:{fnContent:s,value:e},error:c.message},"GenerateExpression")}};export{Ce as action,he as actions,ke as attribute,$ as beginBatch,xe as computed,Te as effect,D as endBatch,Ee as filtered,de as getPath,ge as mergePatch,Me as mergePaths,R as root,x as signal,G as startPeeking,V as stopPeeking,$e as watcher}; +var Y=/🖕JS_DS🚀/.source,j=Y.slice(0,5),W=Y.slice(4),ee="datastar-fetch",te="datastar-signal-patch";var g=Object.hasOwn??Object.prototype.hasOwnProperty.call;var y=e=>e!==null&&typeof e=="object"&&(Object.getPrototypeOf(e)===Object.prototype||Object.getPrototypeOf(e)===null);var w=e=>{let t={};for(let[s,i]of e){let n=s.split("."),o=n.pop(),r=n.reduce((a,c)=>a[c]??={},t);r[o]=i}return t};var M=[],K=[],k=0,E=0,J=0,z,p,L=0,C=()=>{k++},$=()=>{--k||(ie(),v())},G=e=>{z=p,p=e},V=()=>{p=z,z=void 0},S=e=>Te.bind(0,{previousValue:e,value_:e,flags_:1}),U=Symbol("computed"),Se=e=>{let t=Pe.bind(0,{flags_:17,getter:e});return t[U]=1,t},Ae=e=>{let t={fn_:e,flags_:2};p&&Q(t,p),G(t),C();try{t.fn_()}finally{$(),V()}return ce.bind(0,t)},ie=()=>{for(;E"getter"in e?re(e):oe(e,e.value_),re=e=>{G(e),le(e);try{let t=e.value_;return t!==(e.value_=e.getter(t))}finally{V(),fe(e)}},oe=(e,t)=>(e.flags_=1,e.previousValue!==(e.previousValue=t)),B=e=>{let t=e.flags_;if(!(t&64)){e.flags_=t|64;let s=e.subs_;s?B(s.sub_):K[J++]=e}},ae=(e,t)=>{if(t&16||t&32&&ue(e.deps_,e)){G(e),le(e),C();try{e.fn_()}finally{$(),V(),fe(e)}return}t&32&&(e.flags_=t&-33);let s=e.deps_;for(;s;){let i=s.dep_,n=i.flags_;n&64&&ae(i,i.flags_=n&-65),s=s.nextDep_}},Te=(e,...t)=>{if(t.length){if(e.value_!==(e.value_=t[0])){e.flags_=17;let i=e.subs_;return i&&(Fe(i),k||ie()),!0}return!1}let s=e.value_;if(e.flags_&16&&oe(e,s)){let i=e.subs_;i&&O(i)}return p&&Q(e,p),s},Pe=e=>{let t=e.flags_;if(t&16||t&32&&ue(e.deps_,e)){if(re(e)){let s=e.subs_;s&&O(s)}}else t&32&&(e.flags_=t&-33);return p&&Q(e,p),e.value_},ce=e=>{let t=e.deps_;for(;t;)t=N(t,e);let s=e.subs_;s&&N(s),e.flags_=0},Q=(e,t)=>{let s=t.depsTail_;if(s&&s.dep_===e)return;let i=s?s.nextDep_:t.deps_;if(i&&i.dep_===e){i.version_=L,t.depsTail_=i;return}let n=e.subsTail_;if(n&&n.version_===L&&n.sub_===t)return;let o=t.depsTail_=e.subsTail_={version_:L,dep_:e,sub_:t,prevDep_:s,nextDep_:i,prevSub_:n};i&&(i.prevDep_=o),s?s.nextDep_=o:t.deps_=o,n?n.nextSub_=o:e.subs_=o},N=(e,t=e.sub_)=>{let s=e.dep_,i=e.prevDep_,n=e.nextDep_,o=e.nextSub_,r=e.prevSub_;if(n?n.prevDep_=i:t.depsTail_=i,i?i.nextDep_=n:t.deps_=n,o?o.prevSub_=r:s.subsTail_=r,r)r.nextSub_=o;else if(!(s.subs_=o))if("getter"in s){let a=s.deps_;if(a){s.flags_=17;do a=N(a,s);while(a)}}else"previousValue"in s||ce(s);return n},Fe=e=>{let t=e.nextSub_,s;e:for(;;){let i=e.sub_,n=i.flags_;if(n&60?n&12?n&4?!(n&48)&&we(e,i)?(i.flags_=n|40,n&=1):n=0:i.flags_=n&-9|32:n=0:i.flags_=n|32,n&2&&B(i),n&1){let o=i.subs_;if(o){let r=(e=o).nextSub_;r&&(s={value_:t,prev_:s},t=r);continue}}if(e=t){t=e.nextSub_;continue}for(;s;)if(e=s.value_,s=s.prev_,e){t=e.nextSub_;continue e}break}},le=e=>{L++,e.depsTail_=void 0,e.flags_=e.flags_&-57|4},fe=e=>{let t=e.depsTail_,s=t?t.nextDep_:e.deps_;for(;s;)s=N(s,e);e.flags_&=-5},ue=(e,t)=>{let s,i=0,n=!1;e:for(;;){let o=e.dep_,r=o.flags_;if(t.flags_&16)n=!0;else if((r&17)===17){if(se(o)){let a=o.subs_;a.nextSub_&&O(a),n=!0}}else if((r&33)===33){(e.nextSub_||e.prevSub_)&&(s={value_:e,prev_:s}),e=o.deps_,t=o,++i;continue}if(!n){let a=e.nextDep_;if(a){e=a;continue}}for(;i--;){let a=t.subs_,c=a.nextSub_;if(c?(e=s.value_,s=s.prev_):e=a,n){if(se(t)){c&&O(a),t=e.sub_;continue}n=!1}else t.flags_&=-33;if(t=e.sub_,e.nextDep_){e=e.nextDep_;continue e}}return n}},O=e=>{do{let t=e.sub_,s=t.flags_;(s&48)===32&&(t.flags_=s|16,s&2&&B(t))}while(e=e.nextSub_)},we=(e,t)=>{let s=t.depsTail_;for(;s;){if(s===e)return!0;s=s.prevDep_}return!1},de=e=>{let t=m,s=e.split(".");for(let i of s){if(t==null||!g(t,i))return;t=t[i]}return t},D=(e,t="")=>{let s=Array.isArray(e);if(s||y(e)){let i=s?[]:{};for(let o in e)i[o]=S(D(e[o],`${t+o}.`));let n=S(0);return new Proxy(i,{get(o,r){if(!(r==="toJSON"&&!g(i,r)))return s&&r in Array.prototype?(n(),i[r]):typeof r=="symbol"?i[r]:((!g(i,r)||i[r]()==null)&&(i[r]=S(""),v(t+r,""),n(n()+1)),i[r]())},set(o,r,a){let c=t+r;if(s&&r==="length"){let l=i[r]-a;if(i[r]=a,l>0){let f={};for(let u=a;u{if(e!==void 0&&t!==void 0&&M.push([e,t]),!k&&M.length){let s=w(M);M.length=0,document.dispatchEvent(new CustomEvent(te,{detail:s}))}},ge=(e,{ifMissing:t}={})=>{C();for(let s in e)e[s]==null?t||delete m[s]:pe(e[s],s,m,"",t);$()},Me=(e,t)=>ge(w(e),t),pe=(e,t,s,i,n)=>{if(y(e)){g(s,t)&&(y(s[t])||Array.isArray(s[t]))||(s[t]={});for(let o in e)e[o]==null?n||delete s[t][o]:pe(e[o],o,s[t],`${i+t}.`,n)}else n&&g(s,t)||(s[t]=e)},ne=e=>typeof e=="string"?RegExp(e.replace(/^\/|\/$/g,"")):e,Ee=({include:e=/.*/,exclude:t=/(?!)/}={},s=m)=>{let i=ne(e),n=ne(t),o=[],r=[[s,""]];for(;r.length;){let[a,c]=r.pop();for(let l in a){let f=c+l;y(a[l])?r.push([a[l],`${f}.`]):i.test(f)&&!n.test(f)&&o.push([f,de(f)])}}return w(o)},m=D({});var A=e=>e instanceof HTMLElement||e instanceof SVGElement||e instanceof MathMLElement;var Le=e=>e.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();var _e=e=>Le(e).replace(/-/g,"_");var ve=e=>ALIAS?`data-${ALIAS}-${e}`:`data-${e}`;var De="https://data-star.dev/errors",T=(e,t,s={})=>{Object.assign(s,e);let i=new Error,n=_e(t),o=new URLSearchParams({metadata:JSON.stringify(s)}).toString(),r=JSON.stringify(s,null,2);return i.message=`${t} +More info: ${De}/${n}?${o} +Context: ${r}`,i},P=new Map,Z=new Map,me=new Map,be=new Proxy({},{get:(e,t)=>P.get(t)?.apply,has:(e,t)=>P.has(t),ownKeys:()=>Reflect.ownKeys(P),set:()=>!1,deleteProperty:()=>!1}),F=new Map,q=[],X=new Set,Ne=new WeakSet,Oe=e=>{q.push(e),q.length===1&&setTimeout(()=>{for(let t of q)X.add(t.name),Z.set(t.name,t);q.length=0,He(),X.clear()})},ke=e=>{P.set(e.name,e)};document.addEventListener(ee,(e=>{let t=me.get(e.detail.type);t&&t.apply({error:T.bind(0,{plugin:{type:"watcher",name:t.name},element:{id:e.target.id,tag:e.target.tagName}})},e.detail.argsRaw)}));var Ce=e=>{me.set(e.name,e)},ye=e=>{for(let t of e){let s=F.get(t);if(s&&F.delete(t))for(let i of s.values())for(let n of i.values())n()}},Re=ve("ignore"),$e=`[${Re}]`,he=e=>e.hasAttribute(`${Re}__self`)||!!e.closest($e),H=(e,t)=>{for(let s of e)if(!he(s))for(let i in s.dataset)xe(s,i.replace(/[A-Z]/g,"-$&").toLowerCase(),s.dataset[i],t)},Ge=e=>{for(let{target:t,type:s,attributeName:i,addedNodes:n,removedNodes:o}of e)if(s==="childList"){for(let r of o)A(r)&&(ye([r]),ye(r.querySelectorAll("*")));for(let r of n)A(r)&&(H([r]),H(r.querySelectorAll("*")))}else if(s==="attributes"&&i.startsWith("data-")&&A(t)&&!he(t)){let r=i.slice(5),a=t.getAttribute(i);if(a===null){let c=F.get(t);if(c){let l=c.get(r);if(l){for(let f of l.values())f();c.delete(r)}}}else xe(t,r,a)}},Ve=new MutationObserver(Ge),qe=e=>{let[t,...s]=e.split("__"),[i,n]=t.split(/:(.+)/),o=new Map;for(let r of s){let[a,...c]=r.split(".");o.set(a,new Set(c))}return{pluginName:i,key:n,mods:o}};var He=(e=document.documentElement,t=!0)=>{A(e)&&H([e],!0),H(e.querySelectorAll("*"),!0),t&&(Ve.observe(e,{subtree:!0,childList:!0,attributes:!0}),Ne.add(e))},xe=(e,t,s,i)=>{if(!ALIAS||t.startsWith(`${ALIAS}-`)){let n=ALIAS?t.slice(ALIAS.length+1):t,{pluginName:o,key:r,mods:a}=qe(n),c=Z.get(o);if((!i||X.has(o))&&c){let l={el:e,rawKey:n,mods:a,error:T.bind(0,{plugin:{type:"attribute",name:c.name},element:{id:e.id,tag:e.tagName},expression:{rawKey:n,key:r,value:s}}),key:r,value:s,loadedPluginNames:{actions:new Set(P.keys()),attributes:new Set(Z.keys())},rx:void 0},f=c.requirement&&(typeof c.requirement=="string"?c.requirement:c.requirement.key)||"allowed",u=c.requirement&&(typeof c.requirement=="string"?c.requirement:c.requirement.value)||"allowed",d=r!=null&&r!=="",b=s!=null&&s!=="";if(d){if(f==="denied")throw l.error("KeyNotAllowed")}else if(f==="must")throw l.error("KeyRequired");if(b){if(u==="denied")throw l.error("ValueNotAllowed")}else if(u==="must")throw l.error("ValueRequired");if(f==="exclusive"||u==="exclusive"){if(d&&b)throw l.error("KeyAndValueProvided");if(!d&&!b)throw l.error("KeyOrValueRequired")}let h=new Map;if(b){let R;l.rx=(...I)=>(R||(R=Ie(s,{returnsValue:c.returnsValue,argNames:c.argNames,cleanups:h})),R(e,...I))}let x=c.apply(l);x&&h.set("attribute",x);let _=F.get(e);if(_){let R=_.get(n);if(R)for(let I of R.values())I()}else _=new Map,F.set(e,_);_.set(n,h)}}},Ie=(e,{returnsValue:t=!1,argNames:s=[],cleanups:i=new Map}={})=>{let n="";if(t){let c=/(\/(\\\/|[^/])*\/|"(\\"|[^"])*"|'(\\'|[^'])*'|`(\\`|[^`])*`|\(\s*((function)\s*\(\s*\)|(\(\s*\))\s*=>)\s*(?:\{[\s\S]*?\}|[^;){]*)\s*\)\s*\(\s*\)|[^;])+/gm,l=e.trim().match(c);if(l){let f=l.length-1,u=l[f].trim();u.startsWith("return")||(l[f]=`return (${u});`),n=l.join(`; +`)}}else n=e.trim();let o=new Map,r=RegExp(`(?:${j})(.*?)(?:${W})`,"gm"),a=0;for(let c of n.matchAll(r)){let l=c[1],f=`__escaped${a++}`;o.set(f,l),n=n.replace(j+l+W,f)}n=n.replace(/\$\['([a-zA-Z_$\d][\w$]*)'\]/g,"$$$1").replace(/\$([a-zA-Z_\d]\w*(?:[.-]\w+)*)/g,(c,l)=>l.split(".").reduce((f,u)=>`${f}['${u}']`,"$")),n=n.replaceAll(/@([A-Za-z_$][\w$]*)\(/g,'__action("$1",evt,');for(let[c,l]of o)n=n.replace(c,l);try{let c=Function("el","$","__action","evt",...s,n);return(l,...f)=>{let u=(d,b,...h)=>{let x=T.bind(0,{plugin:{type:"action",name:d},element:{id:l.id,tag:l.tagName},expression:{fnContent:n,value:e}}),_=be[d];if(_)return _({el:l,evt:b,error:x,cleanups:i},...h);throw x("UndefinedAction")};try{return c(l,m,u,void 0,...f)}catch(d){throw console.error(d),T({element:{id:l.id,tag:l.tagName},expression:{fnContent:n,value:e},error:d.message},"ExecuteExpression")}}}catch(c){throw console.error(c),T({expression:{fnContent:n,value:e},error:c.message},"GenerateExpression")}};export{ke as action,be as actions,Oe as attribute,C as beginBatch,Se as computed,Ae as effect,$ as endBatch,Ee as filtered,de as getPath,ge as mergePatch,Me as mergePaths,m as root,S as signal,G as startPeeking,V as stopPeeking,Ce as watcher}; //# sourceMappingURL=datastar-core.js.map diff --git a/bundles/datastar-core.js.map b/bundles/datastar-core.js.map index 9fa3c937..fee0a31c 100644 --- a/bundles/datastar-core.js.map +++ b/bundles/datastar-core.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"], - "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_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-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, '-') // Replace whitespace and underscores with hyphens\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\nexport const jsStrToObject = (raw: string) => {\n try {\n return JSON.parse(raw)\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", "import { DATASTAR_FETCH_EVENT, DSP, DSS } 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 } 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 WeakSet()\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 apply()\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 for (const key in el.dataset) {\n applyAttributePlugin(\n el,\n key.replace(/[A-Z]/g, '-$&').toLowerCase(),\n el.dataset[key]!,\n onlyNew,\n )\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 key = attributeName!.slice(5)\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, key, 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\nexport const apply = (\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 }\n}\n\nconst applyAttributePlugin = (\n el: HTMLOrSVG,\n attrKey: string,\n value: string,\n onlyNew?: boolean,\n): void => {\n if (!ALIAS || attrKey.startsWith(`${ALIAS}-`)) {\n const rawKey = ALIAS ? attrKey.slice(ALIAS.length + 1) : attrKey\n const { pluginName, key, mods } = parseAttributeKey(rawKey)\n const plugin = attributePlugins.get(pluginName)\n if ((!onlyNew || queuedAttributeNames.has(pluginName)) && plugin) {\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 =\n 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}\n\ntype GenRxOptions = {\n returnsValue?: boolean\n argNames?: string[]\n cleanups?: Map void>\n}\n\ntype GenRxFn = (el: HTMLOrSVG, ...args: any[]) => T\n\nconst 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 expr = expr\n // $['x'] -> $x (normalize existing bracket notation)\n .replace(/\\$\\['([a-zA-Z_$\\d][\\w$]*)'\\]/g, '$$$1')\n // $x -> $['x'] (including dots and hyphens)\n .replace(/\\$([a-zA-Z_\\d]\\w*(?:[.-]\\w+)*)/g, (_, signalName) =>\n signalName\n .split('.')\n .reduce((acc: string, part: string) => `${acc}['${part}']`, '$'),\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"], - "mappings": "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", - "names": ["lol", "DSP", "DSS", "DATASTAR_FETCH_EVENT", "DATASTAR_SIGNAL_PATCH_EVENT", "hasOwn", "isPojo", "obj", "pathToObj", "paths", "result", "path", "value", "keys", "lastKey", "obj", "acc", "key", "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", "snake", "str", "kebab", "aliasify", "name", "url", "error", "ctx", "reason", "metadata", "e", "r", "snake", "q", "c", "actionPlugins", "attributePlugins", "watcherPlugins", "actions", "_", "prop", "removals", "queuedAttributes", "queuedAttributeNames", "observedRoots", "attribute", "plugin", "apply", "action", "DATASTAR_FETCH_EVENT", "evt", "watcher", "cleanupEls", "els", "el", "elCleanups", "attrCleanups", "cleanup", "aliasedIgnore", "aliasify", "aliasedIgnoreAttr", "shouldIgnore", "applyEls", "onlyNew", "key", "applyAttributePlugin", "observe", "mutations", "target", "type", "attributeName", "addedNodes", "removedNodes", "node", "isHTMLOrSVG", "value", "mutationObserver", "parseAttributeKey", "rawKey", "namePart", "rawModifiers", "pluginName", "mods", "rawMod", "label", "mod", "apply", "root", "observeRoot", "isHTMLOrSVG", "applyEls", "mutationObserver", "observedRoots", "applyAttributePlugin", "el", "attrKey", "value", "onlyNew", "rawKey", "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", "_", "signalName", "acc", "part", "fn", "action", "name", "evt", "err", "actions", "e"] + "sourcesContent": ["const lol = /\uD83D\uDD95JS_DS\uD83D\uDE80/.source\r\nexport const DSP = lol.slice(0, 5)\r\nexport const DSS = lol.slice(4)\r\nexport const DATASTAR_FETCH_EVENT = 'datastar-fetch'\r\nexport const DATASTAR_SIGNAL_PATCH_EVENT = 'datastar-signal-patch'\r\n", "export const hasOwn: (obj: object, prop: PropertyKey) => boolean =\r\n // @ts-expect-error\r\n Object.hasOwn ?? Object.prototype.hasOwnProperty.call\r\n", "import type { Paths } from '@engine/types'\r\nimport { hasOwn } from '@utils/polyfills'\r\n\r\nexport const isPojo = (obj: any): obj is Record =>\r\n obj !== null &&\r\n typeof obj === 'object' &&\r\n (Object.getPrototypeOf(obj) === Object.prototype ||\r\n Object.getPrototypeOf(obj) === null)\r\n\r\nexport const isEmpty = (obj: Record): boolean => {\r\n for (const prop in obj) {\r\n if (hasOwn(obj, prop)) {\r\n return false\r\n }\r\n }\r\n return true\r\n}\r\n\r\nexport const updateLeaves = (\r\n obj: Record,\r\n fn: (oldValue: any) => any,\r\n) => {\r\n for (const key in obj) {\r\n const val = obj[key]\r\n if (isPojo(val) || Array.isArray(val)) {\r\n updateLeaves(val, fn)\r\n } else {\r\n obj[key] = fn(val)\r\n }\r\n }\r\n}\r\n\r\nexport const pathToObj = (paths: Paths): Record => {\r\n const result: Record = {}\r\n for (const [path, value] of paths) {\r\n const keys = path.split('.')\r\n const lastKey = keys.pop()!\r\n const obj = keys.reduce((acc, key) => (acc[key] ??= {}), result)\r\n obj[lastKey] = value\r\n }\r\n return result\r\n}\r\n", "import { DATASTAR_SIGNAL_PATCH_EVENT } from '@engine/consts'\r\nimport type {\r\n Computed,\r\n Effect,\r\n JSONPatch,\r\n MergePatchArgs,\r\n Paths,\r\n Signal,\r\n SignalFilterOptions,\r\n} from '@engine/types'\r\nimport { isPojo, pathToObj } from '@utils/paths'\r\nimport { hasOwn } from '@utils/polyfills'\r\n\r\ninterface ReactiveNode {\r\n deps_?: Link\r\n depsTail_?: Link\r\n subs_?: Link\r\n subsTail_?: Link\r\n flags_: ReactiveFlags\r\n}\r\n\r\ninterface Link {\r\n version_: number\r\n dep_: ReactiveNode\r\n sub_: ReactiveNode\r\n prevSub_?: Link\r\n nextSub_?: Link\r\n prevDep_?: Link\r\n nextDep_?: Link\r\n}\r\n\r\ninterface Stack {\r\n value_: T\r\n prev_?: Stack\r\n}\r\n\r\nenum ReactiveFlags {\r\n None = 0,\r\n Mutable = 1 << 0,\r\n Watching = 1 << 1,\r\n RecursedCheck = 1 << 2,\r\n Recursed = 1 << 3,\r\n Dirty = 1 << 4,\r\n Pending = 1 << 5,\r\n}\r\n\r\nenum EffectFlags {\r\n Queued = 1 << 6,\r\n}\r\n\r\ninterface AlienEffect extends ReactiveNode {\r\n fn_(): void\r\n}\r\n\r\ninterface AlienComputed extends ReactiveNode {\r\n value_?: T\r\n getter(previousValue?: T): T\r\n}\r\n\r\ninterface AlienSignal extends ReactiveNode {\r\n previousValue: T\r\n value_: T\r\n}\r\n\r\nconst currentPatch: Paths = []\r\nconst queuedEffects: (AlienEffect | undefined)[] = []\r\nlet batchDepth = 0\r\nlet notifyIndex = 0\r\nlet queuedEffectsLength = 0\r\nlet prevSub: ReactiveNode | undefined\r\nlet activeSub: ReactiveNode | undefined\r\nlet version = 0\r\n\r\nexport const beginBatch = (): void => {\r\n batchDepth++\r\n}\r\n\r\nexport const endBatch = (): void => {\r\n if (!--batchDepth) {\r\n flush()\r\n dispatch()\r\n }\r\n}\r\n\r\nexport const startPeeking = (sub?: ReactiveNode): void => {\r\n prevSub = activeSub\r\n activeSub = sub\r\n}\r\n\r\nexport const stopPeeking = (): void => {\r\n activeSub = prevSub\r\n prevSub = undefined\r\n}\r\n\r\nexport const signal = (initialValue?: T): Signal => {\r\n return signalOper.bind(0, {\r\n previousValue: initialValue,\r\n value_: initialValue,\r\n flags_: 1 satisfies ReactiveFlags.Mutable,\r\n }) as Signal\r\n}\r\n\r\nconst computedSymbol = Symbol('computed')\r\nexport const computed = (getter: (previousValue?: T) => T): Computed => {\r\n const c = computedOper.bind(0, {\r\n flags_: 17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty,\r\n getter,\r\n }) as Computed\r\n // @ts-expect-error\r\n c[computedSymbol] = 1\r\n return c\r\n}\r\n\r\nexport const effect = (fn: () => void): Effect => {\r\n const e: AlienEffect = {\r\n fn_: fn,\r\n flags_: 2 satisfies ReactiveFlags.Watching,\r\n }\r\n if (activeSub) {\r\n link(e, activeSub)\r\n }\r\n startPeeking(e)\r\n beginBatch()\r\n try {\r\n e.fn_()\r\n } finally {\r\n endBatch()\r\n stopPeeking()\r\n }\r\n return effectOper.bind(0, e)\r\n}\r\n\r\nconst flush = () => {\r\n while (notifyIndex < queuedEffectsLength) {\r\n const effect = queuedEffects[notifyIndex]!\r\n queuedEffects[notifyIndex++] = undefined\r\n run(effect, (effect.flags_ &= ~EffectFlags.Queued))\r\n }\r\n notifyIndex = 0\r\n queuedEffectsLength = 0\r\n}\r\n\r\nconst update = (signal: AlienSignal | AlienComputed): boolean => {\r\n if ('getter' in signal) {\r\n return updateComputed(signal)\r\n }\r\n return updateSignal(signal, signal.value_)\r\n}\r\n\r\nconst updateComputed = (c: AlienComputed): boolean => {\r\n startPeeking(c)\r\n startTracking(c)\r\n try {\r\n const oldValue = c.value_\r\n return oldValue !== (c.value_ = c.getter(oldValue))\r\n } finally {\r\n stopPeeking()\r\n endTracking(c)\r\n }\r\n}\r\n\r\nconst updateSignal = (s: AlienSignal, value: T): boolean => {\r\n s.flags_ = 1 satisfies ReactiveFlags.Mutable\r\n return s.previousValue !== (s.previousValue = value)\r\n}\r\n\r\nconst notify = (e: AlienEffect): void => {\r\n const flags = e.flags_\r\n if (!(flags & EffectFlags.Queued)) {\r\n e.flags_ = flags | EffectFlags.Queued\r\n const subs = e.subs_\r\n if (subs) {\r\n notify(subs.sub_ as AlienEffect)\r\n } else {\r\n queuedEffects[queuedEffectsLength++] = e\r\n }\r\n }\r\n}\r\n\r\nconst run = (e: AlienEffect, flags: ReactiveFlags): void => {\r\n if (\r\n flags & (16 satisfies ReactiveFlags.Dirty) ||\r\n (flags & (32 satisfies ReactiveFlags.Pending) && checkDirty(e.deps_!, e))\r\n ) {\r\n startPeeking(e)\r\n startTracking(e)\r\n beginBatch()\r\n try {\r\n e.fn_()\r\n } finally {\r\n endBatch()\r\n stopPeeking()\r\n endTracking(e)\r\n }\r\n return\r\n }\r\n if (flags & (32 satisfies ReactiveFlags.Pending)) {\r\n e.flags_ = flags & ~(32 satisfies ReactiveFlags.Pending)\r\n }\r\n let link = e.deps_\r\n while (link) {\r\n const dep = link.dep_\r\n const depFlags = dep.flags_\r\n if (depFlags & EffectFlags.Queued) {\r\n run(dep as AlienEffect, (dep.flags_ = depFlags & ~EffectFlags.Queued))\r\n }\r\n link = link.nextDep_\r\n }\r\n}\r\n\r\nconst signalOper = (s: AlienSignal, ...value: [T]): T | boolean => {\r\n if (value.length) {\r\n if (s.value_ !== (s.value_ = value[0])) {\r\n s.flags_ = 17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty\r\n const subs = s.subs_\r\n if (subs) {\r\n propagate(subs)\r\n if (!batchDepth) {\r\n flush()\r\n }\r\n }\r\n return true\r\n }\r\n return false\r\n }\r\n const currentValue = s.value_\r\n if (s.flags_ & (16 satisfies ReactiveFlags.Dirty)) {\r\n if (updateSignal(s, currentValue)) {\r\n const subs_ = s.subs_\r\n if (subs_) {\r\n shallowPropagate(subs_)\r\n }\r\n }\r\n }\r\n if (activeSub) {\r\n link(s, activeSub)\r\n }\r\n return currentValue\r\n}\r\n\r\nconst computedOper = (c: AlienComputed): T => {\r\n const flags = c.flags_\r\n if (\r\n flags & (16 satisfies ReactiveFlags.Dirty) ||\r\n (flags & (32 satisfies ReactiveFlags.Pending) && checkDirty(c.deps_!, c))\r\n ) {\r\n if (updateComputed(c)) {\r\n const subs = c.subs_\r\n if (subs) {\r\n shallowPropagate(subs)\r\n }\r\n }\r\n } else if (flags & (32 satisfies ReactiveFlags.Pending)) {\r\n c.flags_ = flags & ~(32 satisfies ReactiveFlags.Pending)\r\n }\r\n if (activeSub) {\r\n link(c, activeSub)\r\n }\r\n return c.value_!\r\n}\r\n\r\nconst effectOper = (e: AlienEffect): void => {\r\n let dep = e.deps_\r\n while (dep) {\r\n dep = unlink(dep, e)\r\n }\r\n const sub = e.subs_\r\n if (sub) {\r\n unlink(sub)\r\n }\r\n e.flags_ = 0 satisfies ReactiveFlags.None\r\n}\r\n\r\nconst link = (dep: ReactiveNode, sub: ReactiveNode): void => {\r\n const prevDep = sub.depsTail_\r\n if (prevDep && prevDep.dep_ === dep) {\r\n return\r\n }\r\n const nextDep = prevDep ? prevDep.nextDep_ : sub.deps_\r\n if (nextDep && nextDep.dep_ === dep) {\r\n nextDep.version_ = version\r\n sub.depsTail_ = nextDep\r\n return\r\n }\r\n const prevSub = dep.subsTail_\r\n if (prevSub && prevSub.version_ === version && prevSub.sub_ === sub) {\r\n return\r\n }\r\n const newLink =\r\n (sub.depsTail_ =\r\n dep.subsTail_ =\r\n {\r\n version_: version,\r\n dep_: dep,\r\n sub_: sub,\r\n prevDep_: prevDep,\r\n nextDep_: nextDep,\r\n prevSub_: prevSub,\r\n })\r\n if (nextDep) {\r\n nextDep.prevDep_ = newLink\r\n }\r\n if (prevDep) {\r\n prevDep.nextDep_ = newLink\r\n } else {\r\n sub.deps_ = newLink\r\n }\r\n if (prevSub) {\r\n prevSub.nextSub_ = newLink\r\n } else {\r\n dep.subs_ = newLink\r\n }\r\n}\r\n\r\nconst unlink = (link: Link, sub = link.sub_): Link | undefined => {\r\n const dep_ = link.dep_\r\n const prevDep_ = link.prevDep_\r\n const nextDep_ = link.nextDep_\r\n const nextSub_ = link.nextSub_\r\n const prevSub_ = link.prevSub_\r\n if (nextDep_) {\r\n nextDep_.prevDep_ = prevDep_\r\n } else {\r\n sub.depsTail_ = prevDep_\r\n }\r\n if (prevDep_) {\r\n prevDep_.nextDep_ = nextDep_\r\n } else {\r\n sub.deps_ = nextDep_\r\n }\r\n if (nextSub_) {\r\n nextSub_.prevSub_ = prevSub_\r\n } else {\r\n dep_.subsTail_ = prevSub_\r\n }\r\n if (prevSub_) {\r\n prevSub_.nextSub_ = nextSub_\r\n } else if (!(dep_.subs_ = nextSub_)) {\r\n if ('getter' in dep_) {\r\n let toRemove = dep_.deps_\r\n if (toRemove) {\r\n dep_.flags_ = 17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty\r\n do {\r\n toRemove = unlink(toRemove, dep_)\r\n } while (toRemove)\r\n }\r\n } else if (!('previousValue' in dep_)) {\r\n effectOper(dep_ as AlienEffect)\r\n }\r\n }\r\n return nextDep_\r\n}\r\n\r\nconst propagate = (link: Link): void => {\r\n let next = link.nextSub_\r\n let stack: Stack | undefined\r\n\r\n top: while (true) {\r\n const sub = link.sub_\r\n\r\n let flags = sub.flags_\r\n\r\n if (\r\n !(\r\n flags &\r\n (60 as\r\n | ReactiveFlags.RecursedCheck\r\n | ReactiveFlags.Recursed\r\n | ReactiveFlags.Dirty\r\n | ReactiveFlags.Pending)\r\n )\r\n ) {\r\n sub.flags_ = flags | (32 satisfies ReactiveFlags.Pending)\r\n } else if (\r\n !(flags & (12 as ReactiveFlags.RecursedCheck | ReactiveFlags.Recursed))\r\n ) {\r\n flags = 0 satisfies ReactiveFlags.None\r\n } else if (!(flags & (4 satisfies ReactiveFlags.RecursedCheck))) {\r\n sub.flags_ =\r\n (flags & ~(8 satisfies ReactiveFlags.Recursed)) |\r\n (32 satisfies ReactiveFlags.Pending)\r\n } else if (\r\n !(flags & (48 as ReactiveFlags.Dirty | ReactiveFlags.Pending)) &&\r\n isValidLink(link, sub)\r\n ) {\r\n sub.flags_ =\r\n flags | (40 as ReactiveFlags.Recursed | ReactiveFlags.Pending)\r\n flags &= 1 satisfies ReactiveFlags.Mutable\r\n } else {\r\n flags = 0 satisfies ReactiveFlags.None\r\n }\r\n\r\n if (flags & (2 satisfies ReactiveFlags.Watching)) {\r\n notify(sub as AlienEffect)\r\n }\r\n\r\n if (flags & (1 satisfies ReactiveFlags.Mutable)) {\r\n const subSubs = sub.subs_\r\n if (subSubs) {\r\n const nextSub = (link = subSubs).nextSub_\r\n if (nextSub) {\r\n stack = { value_: next, prev_: stack }\r\n next = nextSub\r\n }\r\n continue\r\n }\r\n }\r\n\r\n if ((link = next!)) {\r\n next = link.nextSub_\r\n continue\r\n }\r\n\r\n while (stack) {\r\n link = stack.value_!\r\n stack = stack.prev_\r\n if (link) {\r\n next = link.nextSub_\r\n continue top\r\n }\r\n }\r\n\r\n break\r\n }\r\n}\r\n\r\nconst startTracking = (sub: ReactiveNode): void => {\r\n version++\r\n sub.depsTail_ = undefined\r\n sub.flags_ =\r\n (sub.flags_ &\r\n ~(56 as\r\n | ReactiveFlags.Recursed\r\n | ReactiveFlags.Dirty\r\n | ReactiveFlags.Pending)) |\r\n (4 satisfies ReactiveFlags.RecursedCheck)\r\n}\r\n\r\nconst endTracking = (sub: ReactiveNode): void => {\r\n const depsTail_ = sub.depsTail_\r\n let toRemove = depsTail_ ? depsTail_.nextDep_ : sub.deps_\r\n while (toRemove) {\r\n toRemove = unlink(toRemove, sub)\r\n }\r\n sub.flags_ &= ~(4 satisfies ReactiveFlags.RecursedCheck)\r\n}\r\n\r\nconst checkDirty = (link: Link, sub: ReactiveNode): boolean => {\r\n let stack: Stack | undefined\r\n let checkDepth = 0\r\n let dirty = false\r\n\r\n top: while (true) {\r\n const dep = link.dep_\r\n const flags = dep.flags_\r\n\r\n if (sub.flags_ & (16 satisfies ReactiveFlags.Dirty)) {\r\n dirty = true\r\n } else if (\r\n (flags & (17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty)) ===\r\n (17 as ReactiveFlags.Mutable | ReactiveFlags.Dirty)\r\n ) {\r\n if (update(dep as AlienSignal | AlienComputed)) {\r\n const subs = dep.subs_!\r\n if (subs.nextSub_) {\r\n shallowPropagate(subs)\r\n }\r\n dirty = true\r\n }\r\n } else if (\r\n (flags & (33 as ReactiveFlags.Mutable | ReactiveFlags.Pending)) ===\r\n (33 as ReactiveFlags.Mutable | ReactiveFlags.Pending)\r\n ) {\r\n if (link.nextSub_ || link.prevSub_) {\r\n stack = { value_: link, prev_: stack }\r\n }\r\n link = dep.deps_!\r\n sub = dep\r\n ++checkDepth\r\n continue\r\n }\r\n\r\n if (!dirty) {\r\n const nextDep = link.nextDep_\r\n if (nextDep) {\r\n link = nextDep\r\n continue\r\n }\r\n }\r\n\r\n while (checkDepth--) {\r\n const firstSub = sub.subs_!\r\n const hasMultipleSubs = firstSub.nextSub_\r\n if (hasMultipleSubs) {\r\n link = stack!.value_\r\n stack = stack!.prev_\r\n } else {\r\n link = firstSub\r\n }\r\n if (dirty) {\r\n if (update(sub as AlienSignal | AlienComputed)) {\r\n if (hasMultipleSubs) {\r\n shallowPropagate(firstSub)\r\n }\r\n sub = link.sub_\r\n continue\r\n }\r\n dirty = false\r\n } else {\r\n sub.flags_ &= ~(32 satisfies ReactiveFlags.Pending)\r\n }\r\n sub = link.sub_\r\n if (link.nextDep_) {\r\n link = link.nextDep_\r\n continue top\r\n }\r\n }\r\n\r\n return dirty\r\n }\r\n}\r\n\r\nconst shallowPropagate = (link: Link): void => {\r\n do {\r\n const sub = link.sub_\r\n const flags = sub.flags_\r\n if (\r\n (flags & (48 as ReactiveFlags.Pending | ReactiveFlags.Dirty)) ===\r\n (32 satisfies ReactiveFlags.Pending)\r\n ) {\r\n sub.flags_ = flags | (16 satisfies ReactiveFlags.Dirty)\r\n if (flags & (2 satisfies ReactiveFlags.Watching)) {\r\n notify(sub as AlienEffect)\r\n }\r\n }\r\n } while ((link = link.nextSub_!))\r\n}\r\n\r\nconst isValidLink = (checkLink: Link, sub: ReactiveNode): boolean => {\r\n let link = sub.depsTail_\r\n while (link) {\r\n if (link === checkLink) {\r\n return true\r\n }\r\n link = link.prevDep_\r\n }\r\n return false\r\n}\r\n\r\nexport const getPath = (path: string): T | undefined => {\r\n let result = root\r\n const split = path.split('.')\r\n for (const path of split) {\r\n if (result == null || !hasOwn(result, path)) {\r\n return\r\n }\r\n result = result[path]\r\n }\r\n return result as T\r\n}\r\n\r\nconst deep = (value: any, prefix = ''): any => {\r\n const isArr = Array.isArray(value)\r\n if (isArr || isPojo(value)) {\r\n const deepObj = (isArr ? [] : {}) as Record>\r\n for (const key in value) {\r\n deepObj[key] = signal(\r\n deep((value as Record>)[key], `${prefix + key}.`),\r\n )\r\n }\r\n const keys = signal(0)\r\n return new Proxy(deepObj, {\r\n get(_, prop: string) {\r\n // JSON.stringify calls `.toJSON()` directly instead of checking if it exists on the object\r\n // so we have to check if `toJSON` is being called and prevent a signal from automatically\r\n // being made so JSON.stringify can fallback to the default stringify\r\n if (!(prop === 'toJSON' && !hasOwn(deepObj, prop))) {\r\n // special case for when prop is an array function because every array function needs to\r\n // be reactive to when the keys change\r\n if (isArr && prop in Array.prototype) {\r\n keys()\r\n return deepObj[prop]\r\n }\r\n // if prop is a symbol just return the symbol because we don't want to make up that theres\r\n // an iterator symbol on an object or not\r\n if (typeof prop === 'symbol') {\r\n return deepObj[prop]\r\n }\r\n // if obj doesnt have prop OR prop is null or undefined then create a signal and default\r\n // to an empty string\r\n if (!hasOwn(deepObj, prop) || deepObj[prop]() == null) {\r\n deepObj[prop] = signal('')\r\n dispatch(prefix + prop, '')\r\n keys(keys() + 1)\r\n }\r\n return deepObj[prop]()\r\n }\r\n },\r\n set(_, prop: string, newValue) {\r\n const path = prefix + prop\r\n // special case for when setting length so we can make a diff patch\r\n if (isArr && prop === 'length') {\r\n const diff = (deepObj[prop] as unknown as number) - newValue\r\n deepObj[prop] = newValue\r\n // manually make a diff patch for now, shouldnt have to do this when object diffing is\r\n // implemented. see https://github.com/starfederation/datastar-dev/issues/274\r\n if (diff > 0) {\r\n const patch: Record = {}\r\n for (let i = newValue; i < deepObj[prop]; i++) {\r\n patch[i] = null\r\n }\r\n dispatch(prefix.slice(0, -1), patch)\r\n keys(keys() + 1)\r\n }\r\n } else if (hasOwn(deepObj, prop)) {\r\n if (newValue == null) {\r\n delete deepObj[prop]\r\n // if newValue is a computed set the computed directly instead of wrapping in signal\r\n } else if (hasOwn(newValue, computedSymbol)) {\r\n deepObj[prop] = newValue\r\n dispatch(path, '')\r\n // if prop changed after setting it then dispatch\r\n } else {\r\n const currentValue = deepObj[prop]()\r\n const pathStr = `${path}.`\r\n if (isPojo(currentValue) && isPojo(newValue)) {\r\n for (const key in currentValue) {\r\n if (!hasOwn(newValue, key)) {\r\n delete currentValue[key]\r\n dispatch(pathStr + key, null)\r\n }\r\n }\r\n for (const key in newValue) {\r\n const nextVal = newValue[key]\r\n if (currentValue[key] !== nextVal) {\r\n currentValue[key] = nextVal\r\n }\r\n }\r\n } else if (deepObj[prop](deep(newValue, pathStr))) {\r\n dispatch(path, newValue)\r\n }\r\n }\r\n // if newValue is null or undefined then noop\r\n } else if (newValue != null) {\r\n // if newValue is a computed set the computed directly instead of wrapping in signal\r\n if (hasOwn(newValue, computedSymbol)) {\r\n deepObj[prop] = newValue\r\n dispatch(path, '')\r\n } else {\r\n deepObj[prop] = signal(deep(newValue, `${path}.`))\r\n dispatch(path, newValue)\r\n }\r\n keys(keys() + 1)\r\n }\r\n\r\n return true\r\n },\r\n deleteProperty(_, prop: string) {\r\n delete deepObj[prop]\r\n keys(keys() + 1)\r\n return true\r\n },\r\n ownKeys() {\r\n keys()\r\n return Reflect.ownKeys(deepObj)\r\n },\r\n has(_, prop) {\r\n keys()\r\n return prop in deepObj\r\n },\r\n })\r\n }\r\n return value\r\n}\r\n\r\nconst dispatch = (path?: string, value?: any) => {\r\n if (path !== undefined && value !== undefined) {\r\n currentPatch.push([path, value])\r\n }\r\n if (!batchDepth && currentPatch.length) {\r\n const detail = pathToObj(currentPatch)\r\n currentPatch.length = 0\r\n document.dispatchEvent(\r\n new CustomEvent(DATASTAR_SIGNAL_PATCH_EVENT, {\r\n detail,\r\n }),\r\n )\r\n }\r\n}\r\n\r\nexport const mergePatch = (\r\n patch: JSONPatch,\r\n { ifMissing }: MergePatchArgs = {},\r\n): void => {\r\n beginBatch()\r\n for (const key in patch) {\r\n if (patch[key] == null) {\r\n if (!ifMissing) {\r\n delete root[key]\r\n }\r\n } else {\r\n mergeInner(patch[key], key, root, '', ifMissing)\r\n }\r\n }\r\n endBatch()\r\n}\r\n\r\nexport const mergePaths = (paths: Paths, options?: MergePatchArgs): void =>\r\n mergePatch(pathToObj(paths), options)\r\n\r\nconst mergeInner = (\r\n patch: any,\r\n target: string,\r\n targetParent: Record,\r\n prefix: string,\r\n ifMissing: boolean | undefined,\r\n): void => {\r\n if (isPojo(patch)) {\r\n if (\r\n !(\r\n hasOwn(targetParent, target) &&\r\n (isPojo(targetParent[target]) || Array.isArray(targetParent[target]))\r\n )\r\n ) {\r\n targetParent[target] = {}\r\n }\r\n\r\n for (const key in patch) {\r\n if (patch[key] == null) {\r\n if (!ifMissing) {\r\n delete targetParent[target][key]\r\n }\r\n } else {\r\n mergeInner(\r\n patch[key],\r\n key,\r\n targetParent[target],\r\n `${prefix + target}.`,\r\n ifMissing,\r\n )\r\n }\r\n }\r\n } else if (!(ifMissing && hasOwn(targetParent, target))) {\r\n targetParent[target] = patch\r\n }\r\n}\r\n\r\nconst toRegExp = (val: string | RegExp): RegExp =>\r\n typeof val === 'string' ? RegExp(val.replace(/^\\/|\\/$/g, '')) : val\r\n\r\n/**\r\n * Filters the root store based on an include and exclude RegExp\r\n *\r\n * @returns The filtered object\r\n */\r\nexport const filtered = (\r\n { include = /.*/, exclude = /(?!)/ }: SignalFilterOptions = {},\r\n obj: JSONPatch = root,\r\n): Record => {\r\n const includeRe = toRegExp(include)\r\n const excludeRe = toRegExp(exclude)\r\n const paths: Paths = []\r\n const stack: [any, string][] = [[obj, '']]\r\n\r\n while (stack.length) {\r\n const [node, prefix] = stack.pop()!\r\n\r\n for (const key in node) {\r\n const path = prefix + key\r\n if (isPojo(node[key])) {\r\n stack.push([node[key], `${path}.`])\r\n } else if (includeRe.test(path) && !excludeRe.test(path)) {\r\n paths.push([path, getPath(path)])\r\n }\r\n }\r\n }\r\n\r\n return pathToObj(paths)\r\n}\r\n\r\nexport const root: Record = deep({})\r\n", "import type { HTMLOrSVG } from '@engine/types'\r\n\r\nexport const isHTMLOrSVG = (el: Node): el is HTMLOrSVG =>\r\n el instanceof HTMLElement ||\r\n el instanceof SVGElement ||\r\n el instanceof MathMLElement\r\n", "import type { Modifiers } from '@engine/types'\r\n\r\nexport const kebab = (str: string): string =>\r\n str\r\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\r\n .replace(/([a-z])([0-9]+)/gi, '$1-$2')\r\n .replace(/([0-9]+)([a-z])/gi, '$1-$2')\r\n .replace(/[\\s_]+/g, '-') // Replace whitespace and underscores with hyphens\r\n .toLowerCase()\r\n\r\nexport const camel = (str: string): string =>\r\n kebab(str).replace(/-./g, (x) => x[1].toUpperCase())\r\n\r\nexport const snake = (str: string): string => kebab(str).replace(/-/g, '_')\r\n\r\nexport const pascal = (str: string): string =>\r\n camel(str).replace(/(^.|(?<=\\.).)/g, (x) => x[0].toUpperCase())\r\n\r\nexport const title = (str: string): string =>\r\n str.replace(/\\b\\w/g, (char) => char.toUpperCase())\r\n\r\nexport const jsStrToObject = (raw: string) => {\r\n try {\r\n return JSON.parse(raw)\r\n } catch {\r\n // If JSON parsing fails, try to evaluate as a JavaScript object\r\n // This is less safe and should be used with caution\r\n return Function(`return (${raw})`)()\r\n }\r\n}\r\n\r\nconst caseFns: Record string> = {\r\n camel: (str) => str.replace(/-[a-z]/g, (x) => x[1].toUpperCase()),\r\n snake: (str) => str.replace(/-/g, '_'),\r\n pascal: (str) => str[0].toUpperCase() + caseFns.camel(str.slice(1)),\r\n}\r\n\r\nexport const modifyCasing = (\r\n str: string,\r\n mods: Modifiers,\r\n defaultCase = 'camel',\r\n): string => {\r\n for (const c of mods.get('case') || [defaultCase]) {\r\n str = caseFns[c]?.(str) || str\r\n }\r\n return str\r\n}\r\n\r\nexport const aliasify = (name: string) =>\r\n ALIAS ? `data-${ALIAS}-${name}` : `data-${name}`\r\n", "import { DATASTAR_FETCH_EVENT, DSP, DSS } from '@engine/consts'\r\nimport { root } from '@engine/signals'\r\nimport type {\r\n ActionContext,\r\n ActionPlugin,\r\n AttributeContext,\r\n AttributePlugin,\r\n DatastarFetchEvent,\r\n HTMLOrSVG,\r\n Modifiers,\r\n Requirement,\r\n WatcherPlugin,\r\n} from '@engine/types'\r\nimport { isHTMLOrSVG } from '@utils/dom'\r\nimport { aliasify, snake } from '@utils/text'\r\n\r\nconst url = 'https://data-star.dev/errors'\r\n\r\nconst error = (\r\n ctx: Record,\r\n reason: string,\r\n metadata: Record = {},\r\n) => {\r\n Object.assign(metadata, ctx)\r\n const e = new Error()\r\n const r = snake(reason)\r\n const q = new URLSearchParams({\r\n metadata: JSON.stringify(metadata),\r\n }).toString()\r\n const c = JSON.stringify(metadata, null, 2)\r\n e.message = `${reason}\\nMore info: ${url}/${r}?${q}\\nContext: ${c}`\r\n return e\r\n}\r\n\r\nconst actionPlugins: Map = new Map()\r\nconst attributePlugins: Map = new Map()\r\nconst watcherPlugins: Map = new Map()\r\n\r\nexport const actions: Record<\r\n string,\r\n (ctx: ActionContext, ...args: any[]) => any\r\n> = new Proxy(\r\n {},\r\n {\r\n get: (_, prop: string) => actionPlugins.get(prop)?.apply,\r\n has: (_, prop: string) => actionPlugins.has(prop),\r\n ownKeys: () => Reflect.ownKeys(actionPlugins),\r\n set: () => false,\r\n deleteProperty: () => false,\r\n },\r\n)\r\n\r\n// Map of cleanups keyed by element, attribute name, and cleanup name\r\nconst removals = new Map void>>>()\r\n\r\nconst queuedAttributes: AttributePlugin[] = []\r\nconst queuedAttributeNames = new Set()\r\nconst observedRoots = new WeakSet()\r\nexport const attribute = (\r\n plugin: AttributePlugin,\r\n): void => {\r\n queuedAttributes.push(plugin as unknown as AttributePlugin)\r\n\r\n if (queuedAttributes.length === 1) {\r\n setTimeout(() => {\r\n for (const attribute of queuedAttributes) {\r\n queuedAttributeNames.add(attribute.name)\r\n attributePlugins.set(attribute.name, attribute)\r\n }\r\n queuedAttributes.length = 0\r\n apply()\r\n queuedAttributeNames.clear()\r\n })\r\n }\r\n}\r\n\r\nexport const action = (plugin: ActionPlugin): void => {\r\n actionPlugins.set(plugin.name, plugin)\r\n}\r\n\r\ndocument.addEventListener(DATASTAR_FETCH_EVENT, ((\r\n evt: CustomEvent,\r\n) => {\r\n const plugin = watcherPlugins.get(evt.detail.type)\r\n if (plugin) {\r\n plugin.apply(\r\n {\r\n error: error.bind(0, {\r\n plugin: { type: 'watcher', name: plugin.name },\r\n element: {\r\n id: (evt.target as Element).id,\r\n tag: (evt.target as Element).tagName,\r\n },\r\n }),\r\n },\r\n evt.detail.argsRaw,\r\n )\r\n }\r\n}) as EventListener)\r\n\r\nexport const watcher = (plugin: WatcherPlugin): void => {\r\n watcherPlugins.set(plugin.name, plugin)\r\n}\r\n\r\nconst cleanupEls = (els: Iterable): void => {\r\n for (const el of els) {\r\n const elCleanups = removals.get(el)\r\n if (elCleanups && removals.delete(el)) {\r\n for (const attrCleanups of elCleanups.values()) {\r\n for (const cleanup of attrCleanups.values()) {\r\n cleanup()\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst aliasedIgnore = aliasify('ignore')\r\nconst aliasedIgnoreAttr = `[${aliasedIgnore}]`\r\nconst shouldIgnore = (el: HTMLOrSVG) =>\r\n el.hasAttribute(`${aliasedIgnore}__self`) || !!el.closest(aliasedIgnoreAttr)\r\n\r\nconst applyEls = (els: Iterable, onlyNew?: boolean): void => {\r\n for (const el of els) {\r\n if (!shouldIgnore(el)) {\r\n for (const key in el.dataset) {\r\n applyAttributePlugin(\r\n el,\r\n key.replace(/[A-Z]/g, '-$&').toLowerCase(),\r\n el.dataset[key]!,\r\n onlyNew,\r\n )\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst observe = (mutations: MutationRecord[]) => {\r\n for (const {\r\n target,\r\n type,\r\n attributeName,\r\n addedNodes,\r\n removedNodes,\r\n } of mutations) {\r\n if (type === 'childList') {\r\n for (const node of removedNodes) {\r\n if (isHTMLOrSVG(node)) {\r\n cleanupEls([node])\r\n cleanupEls(node.querySelectorAll('*'))\r\n }\r\n }\r\n\r\n for (const node of addedNodes) {\r\n if (isHTMLOrSVG(node)) {\r\n applyEls([node])\r\n applyEls(node.querySelectorAll('*'))\r\n }\r\n }\r\n } else if (\r\n type === 'attributes' &&\r\n attributeName!.startsWith('data-') &&\r\n isHTMLOrSVG(target) &&\r\n !shouldIgnore(target)\r\n ) {\r\n // skip over 'data-'\r\n const key = attributeName!.slice(5)\r\n const value = target.getAttribute(attributeName!)\r\n if (value === null) {\r\n const elCleanups = removals.get(target)\r\n if (elCleanups) {\r\n const attrCleanups = elCleanups.get(key)\r\n if (attrCleanups) {\r\n for (const cleanup of attrCleanups.values()) {\r\n cleanup()\r\n }\r\n elCleanups.delete(key)\r\n }\r\n }\r\n } else {\r\n applyAttributePlugin(target, key, value)\r\n }\r\n }\r\n }\r\n}\r\n\r\n// TODO: mutation observer per root so applying to web component doesnt overwrite main observer\r\nconst mutationObserver = new MutationObserver(observe)\r\n\r\nexport const parseAttributeKey = (\r\n rawKey: string,\r\n): {\r\n pluginName: string\r\n key: string | undefined\r\n mods: Modifiers\r\n} => {\r\n const [namePart, ...rawModifiers] = rawKey.split('__')\r\n const [pluginName, key] = namePart.split(/:(.+)/)\r\n const mods: Modifiers = new Map()\r\n\r\n for (const rawMod of rawModifiers) {\r\n const [label, ...mod] = rawMod.split('.')\r\n mods.set(label, new Set(mod))\r\n }\r\n\r\n return { pluginName, key, mods }\r\n}\r\n\r\nexport const isDocumentObserverActive = () =>\r\n observedRoots.has(document.documentElement)\r\n\r\nexport const apply = (\r\n root: HTMLOrSVG | ShadowRoot = document.documentElement,\r\n observeRoot = true,\r\n): void => {\r\n if (isHTMLOrSVG(root)) {\r\n applyEls([root], true)\r\n }\r\n applyEls(root.querySelectorAll('*'), true)\r\n\r\n if (observeRoot) {\r\n mutationObserver.observe(root, {\r\n subtree: true,\r\n childList: true,\r\n attributes: true,\r\n })\r\n observedRoots.add(root)\r\n }\r\n}\r\n\r\nconst applyAttributePlugin = (\r\n el: HTMLOrSVG,\r\n attrKey: string,\r\n value: string,\r\n onlyNew?: boolean,\r\n): void => {\r\n if (!ALIAS || attrKey.startsWith(`${ALIAS}-`)) {\r\n const rawKey = ALIAS ? attrKey.slice(ALIAS.length + 1) : attrKey\r\n const { pluginName, key, mods } = parseAttributeKey(rawKey)\r\n const plugin = attributePlugins.get(pluginName)\r\n if ((!onlyNew || queuedAttributeNames.has(pluginName)) && plugin) {\r\n const ctx = {\r\n el,\r\n rawKey,\r\n mods,\r\n error: error.bind(0, {\r\n plugin: { type: 'attribute', name: plugin.name },\r\n element: { id: el.id, tag: el.tagName },\r\n expression: { rawKey, key, value },\r\n }),\r\n key,\r\n value,\r\n loadedPluginNames: {\r\n actions: new Set(actionPlugins.keys()),\r\n attributes: new Set(attributePlugins.keys()),\r\n },\r\n rx: undefined,\r\n } as AttributeContext\r\n\r\n const keyReq =\r\n (plugin.requirement &&\r\n (typeof plugin.requirement === 'string'\r\n ? plugin.requirement\r\n : plugin.requirement.key)) ||\r\n 'allowed'\r\n const valueReq =\r\n (plugin.requirement &&\r\n (typeof plugin.requirement === 'string'\r\n ? plugin.requirement\r\n : plugin.requirement.value)) ||\r\n 'allowed'\r\n\r\n const keyProvided = key !== undefined && key !== null && key !== ''\r\n const valueProvided =\r\n value !== undefined && value !== null && value !== ''\r\n\r\n if (keyProvided) {\r\n if (keyReq === 'denied') {\r\n throw ctx.error('KeyNotAllowed')\r\n }\r\n } else if (keyReq === 'must') {\r\n throw ctx.error('KeyRequired')\r\n }\r\n\r\n if (valueProvided) {\r\n if (valueReq === 'denied') {\r\n throw ctx.error('ValueNotAllowed')\r\n }\r\n } else if (valueReq === 'must') {\r\n throw ctx.error('ValueRequired')\r\n }\r\n\r\n if (keyReq === 'exclusive' || valueReq === 'exclusive') {\r\n if (keyProvided && valueProvided) {\r\n throw ctx.error('KeyAndValueProvided')\r\n }\r\n if (!keyProvided && !valueProvided) {\r\n throw ctx.error('KeyOrValueRequired')\r\n }\r\n }\r\n\r\n const cleanups = new Map void>()\r\n if (valueProvided) {\r\n let cachedRx: GenRxFn\r\n ctx.rx = (...args: any[]) => {\r\n if (!cachedRx) {\r\n cachedRx = genRx(value, {\r\n returnsValue: plugin.returnsValue,\r\n argNames: plugin.argNames,\r\n cleanups,\r\n })\r\n }\r\n return cachedRx(el, ...args)\r\n }\r\n }\r\n\r\n const cleanup = plugin.apply(ctx)\r\n if (cleanup) {\r\n cleanups.set('attribute', cleanup)\r\n }\r\n\r\n let elCleanups = removals.get(el)\r\n if (elCleanups) {\r\n const attrCleanups = elCleanups.get(rawKey)\r\n if (attrCleanups) {\r\n for (const oldCleanup of attrCleanups.values()) {\r\n oldCleanup()\r\n }\r\n }\r\n } else {\r\n elCleanups = new Map()\r\n removals.set(el, elCleanups)\r\n }\r\n elCleanups.set(rawKey, cleanups)\r\n }\r\n }\r\n}\r\n\r\ntype GenRxOptions = {\r\n returnsValue?: boolean\r\n argNames?: string[]\r\n cleanups?: Map void>\r\n}\r\n\r\ntype GenRxFn = (el: HTMLOrSVG, ...args: any[]) => T\r\n\r\nconst genRx = (\r\n value: string,\r\n {\r\n returnsValue = false,\r\n argNames = [],\r\n cleanups = new Map(),\r\n }: GenRxOptions = {},\r\n): GenRxFn => {\r\n let expr = ''\r\n if (returnsValue) {\r\n // This regex allows Datastar expressions to support nested\r\n // regex and strings that contain ; without breaking.\r\n //\r\n // Each of these regex defines a block type we want to match\r\n // (importantly we ignore the content within these blocks):\r\n //\r\n // regex \\/(\\\\\\/|[^\\/])*\\/\r\n // double quotes \"(\\\\\"|[^\\\"])*\"\r\n // single quotes '(\\\\'|[^'])*'\r\n // ticks `(\\\\`|[^`])*`\r\n // iife \\(\\s*((function)\\s*\\(\\s*\\)|(\\(\\s*\\))\\s*=>)\\s*(?:\\{[\\s\\S]*?\\}|[^;)\\{]*)\\s*\\)\\s*\\(\\s*\\)\r\n //\r\n // The iife support is (intentionally) limited. It only supports\r\n // function and arrow syntax with no arguments, and no nested IIFEs.\r\n //\r\n // We also want to match the non delimiter part of statements\r\n // note we only support ; statement delimiters:\r\n //\r\n // [^;]\r\n //\r\n const statementRe =\r\n /(\\/(\\\\\\/|[^/])*\\/|\"(\\\\\"|[^\"])*\"|'(\\\\'|[^'])*'|`(\\\\`|[^`])*`|\\(\\s*((function)\\s*\\(\\s*\\)|(\\(\\s*\\))\\s*=>)\\s*(?:\\{[\\s\\S]*?\\}|[^;){]*)\\s*\\)\\s*\\(\\s*\\)|[^;])+/gm\r\n const statements = value.trim().match(statementRe)\r\n if (statements) {\r\n const lastIdx = statements.length - 1\r\n const last = statements[lastIdx].trim()\r\n if (!last.startsWith('return')) {\r\n statements[lastIdx] = `return (${last});`\r\n }\r\n expr = statements.join(';\\n')\r\n }\r\n } else {\r\n expr = value.trim()\r\n }\r\n\r\n // Ignore any escaped values\r\n const escaped = new Map()\r\n const escapeRe = RegExp(`(?:${DSP})(.*?)(?:${DSS})`, 'gm')\r\n let counter = 0\r\n for (const match of expr.matchAll(escapeRe)) {\r\n const k = match[1]\r\n const v = `__escaped${counter++}`\r\n escaped.set(v, k)\r\n expr = expr.replace(DSP + k + DSS, v)\r\n }\r\n\r\n // Replace signal references with bracket notation\r\n // Examples:\r\n // $count -> $['count']\r\n // $count-- -> $['count']--\r\n // $foo.bar -> $['foo']['bar']\r\n // $foo-bar -> $['foo-bar']\r\n // $foo.bar-baz -> $['foo']['bar-baz']\r\n // $foo-$bar -> $['foo']-$['bar']\r\n // $arr[$index] -> $['arr'][$['index']]\r\n // $['foo'] -> $['foo']\r\n // $foo[obj.bar] -> $['foo'][obj.bar]\r\n // $foo['bar.baz'] -> $['foo']['bar.baz']\r\n // $123 -> $['123']\r\n // $foo.0.name -> $['foo']['0']['name']\r\n\r\n expr = expr\r\n // $['x'] -> $x (normalize existing bracket notation)\r\n .replace(/\\$\\['([a-zA-Z_$\\d][\\w$]*)'\\]/g, '$$$1')\r\n // $x -> $['x'] (including dots and hyphens)\r\n .replace(/\\$([a-zA-Z_\\d]\\w*(?:[.-]\\w+)*)/g, (_, signalName) =>\r\n signalName\r\n .split('.')\r\n .reduce((acc: string, part: string) => `${acc}['${part}']`, '$'),\r\n )\r\n\r\n expr = expr.replaceAll(/@([A-Za-z_$][\\w$]*)\\(/g, '__action(\"$1\",evt,')\r\n\r\n // Replace any escaped values\r\n for (const [k, v] of escaped) {\r\n expr = expr.replace(k, v)\r\n }\r\n\r\n try {\r\n const fn = Function('el', '$', '__action', 'evt', ...argNames, expr)\r\n return (el: HTMLOrSVG, ...args: any[]) => {\r\n const action = (name: string, evt: Event | undefined, ...args: any[]) => {\r\n const err = error.bind(0, {\r\n plugin: { type: 'action', name },\r\n element: { id: el.id, tag: el.tagName },\r\n expression: {\r\n fnContent: expr,\r\n value,\r\n },\r\n })\r\n const fn = actions[name]\r\n if (fn) {\r\n return fn(\r\n {\r\n el,\r\n evt,\r\n error: err,\r\n cleanups,\r\n },\r\n ...args,\r\n )\r\n }\r\n throw err('UndefinedAction')\r\n }\r\n try {\r\n return fn(el, root, action, undefined, ...args)\r\n } catch (e: any) {\r\n console.error(e)\r\n throw error(\r\n {\r\n element: { id: el.id, tag: el.tagName },\r\n expression: {\r\n fnContent: expr,\r\n value,\r\n },\r\n error: e.message,\r\n },\r\n 'ExecuteExpression',\r\n )\r\n }\r\n }\r\n } catch (e: any) {\r\n console.error(e)\r\n throw error(\r\n {\r\n expression: {\r\n fnContent: expr,\r\n value,\r\n },\r\n error: e.message,\r\n },\r\n 'GenerateExpression',\r\n )\r\n }\r\n}\r\n"], + "mappings": "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", + "names": ["lol", "DSP", "DSS", "DATASTAR_FETCH_EVENT", "DATASTAR_SIGNAL_PATCH_EVENT", "hasOwn", "isPojo", "obj", "pathToObj", "paths", "result", "path", "value", "keys", "lastKey", "obj", "acc", "key", "currentPatch", "queuedEffects", "batchDepth", "notifyIndex", "queuedEffectsLength", "prevSub", "activeSub", "version", "beginBatch", "endBatch", "flush", "dispatch", "startPeeking", "sub", "stopPeeking", "signal", "initialValue", "signalOper", "computedSymbol", "computed", "getter", "c", "computedOper", "effect", "fn", "e", "link", "effectOper", "run", "update", "updateComputed", "updateSignal", "startTracking", "oldValue", "endTracking", "s", "value", "notify", "flags", "subs", "checkDirty", "dep", "depFlags", "propagate", "currentValue", "subs_", "shallowPropagate", "unlink", "prevDep", "nextDep", "newLink", "dep_", "prevDep_", "nextDep_", "nextSub_", "prevSub_", "toRemove", "next", "stack", "top", "isValidLink", "subSubs", "nextSub", "depsTail_", "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", "snake", "str", "kebab", "aliasify", "name", "url", "error", "ctx", "reason", "metadata", "e", "r", "snake", "q", "c", "actionPlugins", "attributePlugins", "watcherPlugins", "actions", "_", "prop", "removals", "queuedAttributes", "queuedAttributeNames", "observedRoots", "attribute", "plugin", "apply", "action", "DATASTAR_FETCH_EVENT", "evt", "watcher", "cleanupEls", "els", "el", "elCleanups", "attrCleanups", "cleanup", "aliasedIgnore", "aliasify", "aliasedIgnoreAttr", "shouldIgnore", "applyEls", "onlyNew", "key", "applyAttributePlugin", "observe", "mutations", "target", "type", "attributeName", "addedNodes", "removedNodes", "node", "isHTMLOrSVG", "value", "mutationObserver", "parseAttributeKey", "rawKey", "namePart", "rawModifiers", "pluginName", "mods", "rawMod", "label", "mod", "apply", "root", "observeRoot", "isHTMLOrSVG", "applyEls", "mutationObserver", "observedRoots", "applyAttributePlugin", "el", "attrKey", "value", "onlyNew", "rawKey", "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", "_", "signalName", "acc", "part", "fn", "action", "name", "evt", "err", "actions", "e"] } diff --git a/bundles/datastar.js b/bundles/datastar.js index bfb85cca..9b99df35 100644 --- a/bundles/datastar.js +++ b/bundles/datastar.js @@ -1,9 +1,8 @@ -// Datastar v1.0.0-RC.7 -var at=/🖕JS_DS🚀/.source,je=at.slice(0,5),Ge=at.slice(4),q="datastar-fetch",Z="datastar-signal-patch";var C=Object.hasOwn??Object.prototype.hasOwnProperty.call;var U=e=>e!==null&&typeof e=="object"&&(Object.getPrototypeOf(e)===Object.prototype||Object.getPrototypeOf(e)===null),ct=e=>{for(let t in e)if(C(e,t))return!1;return!0},Y=(e,t)=>{for(let n in e){let r=e[n];U(r)||Array.isArray(r)?Y(r,t):e[n]=t(r)}},Me=e=>{let t={};for(let[n,r]of e){let s=n.split("."),o=s.pop(),i=s.reduce((a,c)=>a[c]??={},t);i[o]=r}return t};var xe=[],Be=[],Oe=0,Le=0,We=0,Ue,j,Ne=0,M=()=>{Oe++},x=()=>{--Oe||(ft(),J())},F=e=>{Ue=j,j=e},P=()=>{j=Ue,Ue=void 0},pe=e=>Ut.bind(0,{previousValue:e,t:e,e:1}),Je=Symbol("computed"),ke=e=>{let t=Jt.bind(0,{e:17,getter:e});return t[Je]=1,t},S=e=>{let t={d:e,e:2};j&&ze(t,j),F(t),M();try{t.d()}finally{x(),P()}return gt.bind(0,t)},ft=()=>{for(;Le"getter"in e?dt(e):mt(e,e.t),dt=e=>{F(e),ht(e);try{let t=e.t;return t!==(e.t=e.getter(t))}finally{P(),yt(e)}},mt=(e,t)=>(e.e=1,e.previousValue!==(e.previousValue=t)),Ke=e=>{let t=e.e;if(!(t&64)){e.e=t|64;let n=e.r;n?Ke(n.o):Be[We++]=e}},pt=(e,t)=>{if(t&16||t&32&&bt(e.s,e)){F(e),ht(e),M();try{e.d()}finally{x(),P(),yt(e)}return}t&32&&(e.e=t&-33);let n=e.s;for(;n;){let r=n.c,s=r.e;s&64&&pt(r,r.e=s&-65),n=n.i}},Ut=(e,...t)=>{if(t.length){if(e.t!==(e.t=t[0])){e.e=17;let r=e.r;return r&&(Kt(r),Oe||ft()),!0}return!1}let n=e.t;if(e.e&16&&mt(e,n)){let r=e.r;r&&Pe(r)}return j&&ze(e,j),n},Jt=e=>{let t=e.e;if(t&16||t&32&&bt(e.s,e)){if(dt(e)){let n=e.r;n&&Pe(n)}}else t&32&&(e.e=t&-33);return j&&ze(e,j),e.t},gt=e=>{let t=e.s;for(;t;)t=Fe(t,e);let n=e.r;n&&Fe(n),e.e=0},ze=(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.m=Ne,t.a=r;return}let s=e.p;if(s&&s.m===Ne&&s.o===t)return;let o=t.a=e.p={m:Ne,c:e,o:t,l:n,i:r,u:s};r&&(r.l=o),n?n.i=o:t.s=o,s?s.n=o:e.r=o},Fe=(e,t=e.o)=>{let n=e.c,r=e.l,s=e.i,o=e.n,i=e.u;if(s?s.l=r:t.a=r,r?r.i=s:t.s=s,o?o.u=i:n.p=i,i)i.n=o;else if(!(n.r=o))if("getter"in n){let a=n.s;if(a){n.e=17;do a=Fe(a,n);while(a)}}else"previousValue"in n||gt(n);return s},Kt=e=>{let t=e.n,n;e:for(;;){let r=e.o,s=r.e;if(s&60?s&12?s&4?!(s&48)&&zt(e,r)?(r.e=s|40,s&=1):s=0:r.e=s&-9|32:s=0:r.e=s|32,s&2&&Ke(r),s&1){let o=r.r;if(o){let i=(e=o).n;i&&(n={t,f:n},t=i);continue}}if(e=t){t=e.n;continue}for(;n;)if(e=n.t,n=n.f,e){t=e.n;continue e}break}},ht=e=>{Ne++,e.a=void 0,e.e=e.e&-57|4},yt=e=>{let t=e.a,n=t?t.i:e.s;for(;n;)n=Fe(n,e);e.e&=-5},bt=(e,t)=>{let n,r=0,s=!1;e:for(;;){let o=e.c,i=o.e;if(t.e&16)s=!0;else if((i&17)===17){if(lt(o)){let a=o.r;a.n&&Pe(a),s=!0}}else if((i&33)===33){(e.n||e.u)&&(n={t:e,f:n}),e=o.s,t=o,++r;continue}if(!s){let a=e.i;if(a){e=a;continue}}for(;r--;){let a=t.r,c=a.n;if(c?(e=n.t,n=n.f):e=a,s){if(lt(t)){c&&Pe(a),t=e.o;continue}s=!1}else t.e&=-33;if(t=e.o,e.i){e=e.i;continue e}}return s}},Pe=e=>{do{let t=e.o,n=t.e;(n&48)===32&&(t.e=n|16,n&2&&Ke(t))}while(e=e.n)},zt=(e,t)=>{let n=t.a;for(;n;){if(n===e)return!0;n=n.l}return!1},oe=e=>{let t=X,n=e.split(".");for(let r of n){if(t==null||!C(t,r))return;t=t[r]}return t},Ce=(e,t="")=>{let n=Array.isArray(e);if(n||U(e)){let r=n?[]:{};for(let o in e)r[o]=pe(Ce(e[o],`${t+o}.`));let s=pe(0);return new Proxy(r,{get(o,i){if(!(i==="toJSON"&&!C(r,i)))return n&&i in Array.prototype?(s(),r[i]):typeof i=="symbol"?r[i]:((!C(r,i)||r[i]()==null)&&(r[i]=pe(""),J(t+i,""),s(s()+1)),r[i]())},set(o,i,a){let c=t+i;if(n&&i==="length"){let l=r[i]-a;if(r[i]=a,l>0){let u={};for(let d=a;d{if(e!==void 0&&t!==void 0&&xe.push([e,t]),!Oe&&xe.length){let n=Me(xe);xe.length=0,document.dispatchEvent(new CustomEvent(Z,{detail:n}))}},O=(e,{ifMissing:t}={})=>{M();for(let n in e)e[n]==null?t||delete X[n]:vt(e[n],n,X,"",t);x()},T=(e,t)=>O(Me(e),t),vt=(e,t,n,r,s)=>{if(U(e)){C(n,t)&&(U(n[t])||Array.isArray(n[t]))||(n[t]={});for(let o in e)e[o]==null?s||delete n[t][o]:vt(e[o],o,n[t],`${r+t}.`,s)}else s&&C(n,t)||(n[t]=e)},ut=e=>typeof e=="string"?RegExp(e.replace(/^\/|\/$/g,"")):e,_=({include:e=/.*/,exclude:t=/(?!)/}={},n=X)=>{let r=ut(e),s=ut(t),o=[],i=[[n,""]];for(;i.length;){let[a,c]=i.pop();for(let l in a){let u=c+l;U(a[l])?i.push([a[l],`${u}.`]):r.test(u)&&!s.test(u)&&o.push([u,oe(u)])}}return Me(o)},X=Ce({});var K=e=>e instanceof HTMLElement||e instanceof SVGElement||e instanceof MathMLElement;var ge=e=>e.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();var Et=e=>ge(e).replace(/-/g,"_");var ae=e=>{try{return JSON.parse(e)}catch{return Function(`return (${e})`)()}},St={camel:e=>e.replace(/-[a-z]/g,t=>t[1].toUpperCase()),snake:e=>e.replace(/-/g,"_"),pascal:e=>e[0].toUpperCase()+St.camel(e.slice(1))},L=(e,t,n="camel")=>{for(let r of t.get("case")||[n])e=St[r]?.(e)||e;return e},G=e=>`data-${e}`;var Qt="https://data-star.dev/errors",he=(e,t,n={})=>{Object.assign(n,e);let r=new Error,s=Et(t),o=new URLSearchParams({metadata:JSON.stringify(n)}).toString(),i=JSON.stringify(n,null,2);return r.message=`${t} -More info: ${Qt}/${s}?${o} -Context: ${i}`,r},ye=new Map,Qe=new Map,At=new Map,Rt=new Proxy({},{get:(e,t)=>ye.get(t)?.apply,has:(e,t)=>ye.has(t),ownKeys:()=>Reflect.ownKeys(ye),set:()=>!1,deleteProperty:()=>!1}),be=new Map,He=[],Ze=new Set,Zt=new WeakSet,p=e=>{He.push(e),He.length===1&&setTimeout(()=>{for(let t of He)Ze.add(t.name),Qe.set(t.name,t);He.length=0,nn(),Ze.clear()})},k=e=>{ye.set(e.name,e)};document.addEventListener(q,e=>{let t=At.get(e.detail.type);t&&t.apply({error:he.bind(0,{plugin:{type:"watcher",name:t.name},element:{id:e.target.id,tag:e.target.tagName}})},e.detail.argsRaw)});var ve=e=>{At.set(e.name,e)},Tt=e=>{for(let t of e){let n=be.get(t);if(n&&be.delete(t))for(let r of n.values())for(let s of r.values())s()}},wt=G("ignore"),Yt=`[${wt}]`,Mt=e=>e.hasAttribute(`${wt}__self`)||!!e.closest(Yt),_e=(e,t)=>{for(let n of e)if(!Mt(n))for(let r in n.dataset)xt(n,r.replace(/[A-Z]/g,"-$&").toLowerCase(),n.dataset[r],t)},Xt=e=>{for(let{target:t,type:n,attributeName:r,addedNodes:s,removedNodes:o}of e)if(n==="childList"){for(let i of o)K(i)&&(Tt([i]),Tt(i.querySelectorAll("*")));for(let i of s)K(i)&&(_e([i]),_e(i.querySelectorAll("*")))}else if(n==="attributes"&&r.startsWith("data-")&&K(t)&&!Mt(t)){let i=r.slice(5),a=t.getAttribute(r);if(a===null){let c=be.get(t);if(c){let l=c.get(i);if(l){for(let u of l.values())u();c.delete(i)}}}else xt(t,i,a)}},en=new MutationObserver(Xt),tn=e=>{let[t,...n]=e.split("__"),[r,s]=t.split(/:(.+)/),o=new Map;for(let i of n){let[a,...c]=i.split(".");o.set(a,new Set(c))}return{pluginName:r,key:s,mods:o}};var nn=(e=document.documentElement,t=!0)=>{K(e)&&_e([e],!0),_e(e.querySelectorAll("*"),!0),t&&(en.observe(e,{subtree:!0,childList:!0,attributes:!0}),Zt.add(e))},xt=(e,t,n,r)=>{{let s=t,{pluginName:o,key:i,mods:a}=tn(s),c=Qe.get(o);if((!r||Ze.has(o))&&c){let l={el:e,rawKey:s,mods:a,error:he.bind(0,{plugin:{type:"attribute",name:c.name},element:{id:e.id,tag:e.tagName},expression:{rawKey:s,key:i,value:n}}),key:i,value:n,loadedPluginNames:{actions:new Set(ye.keys()),attributes:new Set(Qe.keys())},rx:void 0},u=c.requirement&&(typeof c.requirement=="string"?c.requirement:c.requirement.key)||"allowed",d=c.requirement&&(typeof c.requirement=="string"?c.requirement:c.requirement.value)||"allowed",h=i!=null&&i!=="",f=n!=null&&n!=="";if(h){if(u==="denied")throw l.error("KeyNotAllowed")}else if(u==="must")throw l.error("KeyRequired");if(f){if(d==="denied")throw l.error("ValueNotAllowed")}else if(d==="must")throw l.error("ValueRequired");if(u==="exclusive"||d==="exclusive"){if(h&&f)throw l.error("KeyAndValueProvided");if(!h&&!f)throw l.error("KeyOrValueRequired")}let m=new Map;if(f){let v;l.rx=(...A)=>(v||(v=rn(n,{returnsValue:c.returnsValue,argNames:c.argNames,cleanups:m})),v(e,...A))}let y=c.apply(l);y&&m.set("attribute",y);let b=be.get(e);if(b){let v=b.get(s);if(v)for(let A of v.values())A()}else b=new Map,be.set(e,b);b.set(s,m)}}},rn=(e,{returnsValue:t=!1,argNames:n=[],cleanups:r=new Map}={})=>{let s="";if(t){let c=/(\/(\\\/|[^/])*\/|"(\\"|[^"])*"|'(\\'|[^'])*'|`(\\`|[^`])*`|\(\s*((function)\s*\(\s*\)|(\(\s*\))\s*=>)\s*(?:\{[\s\S]*?\}|[^;){]*)\s*\)\s*\(\s*\)|[^;])+/gm,l=e.trim().match(c);if(l){let u=l.length-1,d=l[u].trim();d.startsWith("return")||(l[u]=`return (${d});`),s=l.join(`; -`)}}else s=e.trim();let o=new Map,i=RegExp(`(?:${je})(.*?)(?:${Ge})`,"gm"),a=0;for(let c of s.matchAll(i)){let l=c[1],u=`__escaped${a++}`;o.set(u,l),s=s.replace(je+l+Ge,u)}s=s.replace(/\$\['([a-zA-Z_$\d][\w$]*)'\]/g,"$$$1").replace(/\$([a-zA-Z_\d]\w*(?:[.-]\w+)*)/g,(c,l)=>l.split(".").reduce((u,d)=>`${u}['${d}']`,"$")),s=s.replaceAll(/@([A-Za-z_$][\w$]*)\(/g,'__action("$1",evt,');for(let[c,l]of o)s=s.replace(c,l);try{let c=Function("el","$","__action","evt",...n,s);return(l,...u)=>{let d=(h,f,...m)=>{let y=he.bind(0,{plugin:{type:"action",name:h},element:{id:l.id,tag:l.tagName},expression:{fnContent:s,value:e}}),b=Rt[h];if(b)return b({el:l,evt:f,error:y,cleanups:r},...m);throw y("UndefinedAction")};try{return c(l,X,d,void 0,...u)}catch(h){throw console.error(h),he({element:{id:l.id,tag:l.tagName},expression:{fnContent:s,value:e},error:h.message},"ExecuteExpression")}}}catch(c){throw console.error(c),he({expression:{fnContent:s,value:e},error:c.message},"GenerateExpression")}};k({name:"peek",apply(e,t){F();try{return t()}finally{P()}}});k({name:"setAll",apply(e,t,n){F();let r=_(n);Y(r,()=>t),O(r),P()}});k({name:"toggleAll",apply(e,t){F();let n=_(t);Y(n,r=>!r),O(n),P()}});var Ee=(e,t,n=!0)=>k({name:e,apply:async({el:r,evt:s,error:o,cleanups:i},a,{selector:c,headers:l,contentType:u="json",filterSignals:{include:d=/.*/,exclude:h=/(^|\.)_/}={},openWhenHidden:f=n,payload:m,requestCancellation:y="auto",retry:b="auto",retryInterval:v=1e3,retryScaler:A=2,retryMaxWaitMs:I=3e4,retryMaxCount:ne=10}={})=>{let de=y instanceof AbortController?y:new AbortController;y==="auto"&&(i.get(`@${e}`)?.(),i.set(`@${e}`,async()=>{de.abort(),await Promise.resolve()}));let D=null;try{if(!a?.length)throw o("FetchNoUrlProvided",{action:k});let V={Accept:"text/event-stream, text/html, application/json","Datastar-Request":!0};u==="json"&&(V["Content-Type"]="application/json");let Ae=Object.assign({},V,l),re={method:t,headers:Ae,openWhenHidden:f,retry:b,retryInterval:v,retryScaler:A,retryMaxWaitMs:I,retryMaxCount:ne,signal:de.signal,onopen:async g=>{g.status>=400&&ee(sn,r,{status:g.status.toString()})},onmessage:g=>{if(!g.event.startsWith("datastar"))return;let B=g.event,E={};for(let R of g.data.split(` -`)){let w=R.indexOf(" "),W=R.slice(0,w),De=R.slice(w+1);(E[W]||=[]).push(De)}let N=Object.fromEntries(Object.entries(E).map(([R,w])=>[R,w.join(` -`)]));ee(B,r,N)},onerror:g=>{if(Lt(g))throw g("FetchExpectedTextEventStream",{url:a});g&&(console.error(g.message),ee(on,r,{message:g.message}))}},se=new URL(a,document.baseURI),ie=new URLSearchParams(se.search);if(u==="json"){F(),m=m!==void 0?m:_({include:d,exclude:h}),P();let g=JSON.stringify(m);t==="GET"?ie.set("datastar",g):re.body=g}else if(u==="form"){let g=c?document.querySelector(c):r.closest("form");if(!g)throw o("FetchFormNotFound",{action:k,selector:c});if(!g.noValidate&&!g.checkValidity()){g.reportValidity();return}let B=new FormData(g),E=r;if(r===g&&s instanceof SubmitEvent)E=s.submitter;else{let w=W=>W.preventDefault();g.addEventListener("submit",w),D=()=>{g.removeEventListener("submit",w)}}if(E instanceof HTMLButtonElement){let w=E.getAttribute("name");w&&B.append(w,E.value)}let N=g.getAttribute("enctype")==="multipart/form-data";N||(Ae["Content-Type"]="application/x-www-form-urlencoded");let R=new URLSearchParams(B);if(t==="GET")for(let[w,W]of R)ie.append(w,W);else N?re.body=B:re.body=R}else throw o("FetchInvalidContentType",{action:k,contentType:u});ee(Ye,r,{}),se.search=ie.toString();try{await dn(se.toString(),r,re)}catch(g){if(!Lt(g))throw o("FetchFailed",{method:t,url:a,error:g.message})}}finally{ee(Xe,r,{}),D?.(),i.delete(`@${e}`)}}});Ee("get","GET",!1);Ee("patch","PATCH");Ee("post","POST");Ee("put","PUT");Ee("delete","DELETE");var Ye="started",Xe="finished",sn="error",on="retrying",an="retries-failed",ee=(e,t,n)=>document.dispatchEvent(new CustomEvent(q,{detail:{type:e,el:t,argsRaw:n}})),Lt=e=>`${e}`.includes("text/event-stream"),cn=async(e,t)=>{let n=e.getReader(),r=await n.read();for(;!r.done;)t(r.value),r=await n.read()},ln=e=>{let t,n,r,s=!1;return o=>{t?t=fn(t,o):(t=o,n=0,r=-1);let i=t.length,a=0;for(;n{let r=Nt(),s=new TextDecoder;return(o,i)=>{if(!o.length)n?.(r),r=Nt();else if(i>0){let a=s.decode(o.subarray(0,i)),c=i+(o[i+1]===32?2:1),l=s.decode(o.subarray(c));switch(a){case"data":r.data=r.data?`${r.data} -${l}`:l;break;case"event":r.event=l;break;case"id":e(r.id=l);break;case"retry":{let u=+l;Number.isNaN(u)||t(r.retry=u);break}}}}},fn=(e,t)=>{let n=new Uint8Array(e.length+t.length);return n.set(e),n.set(t,e.length),n},Nt=()=>({data:"",event:"",id:"",retry:void 0}),dn=(e,t,{signal:n,headers:r,onopen:s,onmessage:o,onclose:i,onerror:a,openWhenHidden:c,fetch:l,retry:u="auto",retryInterval:d=1e3,retryScaler:h=2,retryMaxWaitMs:f=3e4,retryMaxCount:m=10,responseOverrides:y,...b})=>new Promise((v,A)=>{let I={...r},ne,de=()=>{ne.abort(),document.hidden||g()};c||document.addEventListener("visibilitychange",de);let D,V=()=>{document.removeEventListener("visibilitychange",de),clearTimeout(D),ne.abort()};n?.addEventListener("abort",()=>{V(),v()});let Ae=l||window.fetch,re=s||(()=>{}),se=0,ie=d,g=async()=>{ne=new AbortController;let B=ne.signal;try{let E=await Ae(e,{...b,headers:I,signal:B});await re(E);let N=async($,me,$e,Re,...Wt)=>{let ot={[$e]:await me.text()};for(let Ie of Wt){let qe=me.headers.get(`datastar-${ge(Ie)}`);if(Re){let we=Re[Ie];we&&(qe=typeof we=="string"?we:JSON.stringify(we))}qe&&(ot[Ie]=qe)}ee($,t,ot),V(),v()},R=E.status,w=R===204,W=R>=300&&R<400,De=R>=400&&R<600;if(R!==200){if(i?.(),u!=="never"&&!w&&!W&&(u==="always"||u==="error"&&De)){clearTimeout(D),D=setTimeout(g,d);return}V(),v();return}se=0,d=ie;let Ve=E.headers.get("Content-Type");if(Ve?.includes("text/html"))return await N("datastar-patch-elements",E,"elements",y,"selector","mode","namespace","useViewTransition");if(Ve?.includes("application/json"))return await N("datastar-patch-signals",E,"signals",y,"onlyIfMissing");if(Ve?.includes("text/javascript")){let $=document.createElement("script"),me=E.headers.get("datastar-script-attributes");if(me)for(let[$e,Re]of Object.entries(JSON.parse(me)))$.setAttribute($e,Re);$.textContent=await E.text(),document.head.appendChild($),V();return}if(await cn(E.body,ln(un($=>{$?I["last-event-id"]=$:delete I["last-event-id"]},$=>{ie=d=$},o))),i?.(),u==="always"&&!W){clearTimeout(D),D=setTimeout(g,d);return}V(),v()}catch(E){if(!B.aborted)try{let N=a?.(E)||d;clearTimeout(D),D=setTimeout(g,N),d=Math.min(d*h,f),++se>=m?(ee(an,t,{}),V(),A("Max retries reached.")):console.error(`Datastar failed to reach ${e.toString()} retrying in ${N}ms.`)}catch(N){V(),A(N)}}};g()});p({name:"attr",requirement:{value:"must"},returnsValue:!0,apply({el:e,key:t,rx:n}){let r=(a,c)=>{c===""||c===!0?e.setAttribute(a,""):c===!1||c==null?e.removeAttribute(a):typeof c=="string"?e.setAttribute(a,c):e.setAttribute(a,JSON.stringify(c))},s=t?()=>{o.disconnect();let a=n();r(t,a),o.observe(e,{attributeFilter:[t]})}:()=>{o.disconnect();let a=n(),c=Object.keys(a);for(let l of c)r(l,a[l]);o.observe(e,{attributeFilter:c})},o=new MutationObserver(s),i=S(s);return()=>{o.disconnect(),i()}}});var mn=/^data:(?[^;]+);base64,(?.*)$/,Ct=Symbol("empty"),Ft=G("bind");p({name:"bind",requirement:"exclusive",apply({el:e,key:t,mods:n,value:r,error:s}){let o=t!=null?L(t,n):r,i=(f,m)=>m==="number"?+f.value:f.value,a=f=>{e.value=`${f}`};if(e instanceof HTMLInputElement)switch(e.type){case"range":case"number":i=(f,m)=>m==="string"?f.value:+f.value;break;case"checkbox":i=(f,m)=>f.value!=="on"?m==="boolean"?f.checked:f.checked?f.value:"":m==="string"?f.checked?f.value:"":f.checked,a=f=>{e.checked=typeof f=="string"?f===e.value:f};break;case"radio":e.getAttribute("name")?.length||e.setAttribute("name",o),i=(f,m)=>f.checked?m==="number"?+f.value:f.value:Ct,a=f=>{e.checked=f===(typeof f=="number"?+e.value:e.value)};break;case"file":{let f=()=>{let m=[...e.files||[]],y=[];Promise.all(m.map(b=>new Promise(v=>{let A=new FileReader;A.onload=()=>{if(typeof A.result!="string")throw s("InvalidFileResultType",{resultType:typeof A.result});let I=A.result.match(mn);if(!I?.groups)throw s("InvalidDataUri",{result:A.result});y.push({name:b.name,contents:I.groups.contents,mime:I.groups.mime})},A.onloadend=()=>v(),A.readAsDataURL(b)}))).then(()=>{T([[o,y]])})};return e.addEventListener("change",f),e.addEventListener("input",f),()=>{e.removeEventListener("change",f),e.removeEventListener("input",f)}}}else if(e instanceof HTMLSelectElement){if(e.multiple){let f=new Map;i=m=>[...m.selectedOptions].map(y=>{let b=f.get(y.value);return b==="string"||b==null?y.value:+y.value}),a=m=>{for(let y of e.options)m.includes(y.value)?(f.set(y.value,"string"),y.selected=!0):m.includes(+y.value)?(f.set(y.value,"number"),y.selected=!0):y.selected=!1}}}else e instanceof HTMLTextAreaElement||(i=f=>"value"in f?f.value:f.getAttribute("value"),a=f=>{"value"in e?e.value=f:e.setAttribute("value",f)});let c=oe(o),l=typeof c,u=o;if(Array.isArray(c)&&!(e instanceof HTMLSelectElement&&e.multiple)){let f=t||r,m=document.querySelectorAll(`[${Ft}\\:${CSS.escape(f)}],[${Ft}="${CSS.escape(f)}"]`),y=[],b=0;for(let v of m){if(y.push([`${u}.${b}`,i(v,"none")]),e===v)break;b++}T(y,{ifMissing:!0}),u=`${u}.${b}`}else T([[u,i(e,l)]],{ifMissing:!0});let d=()=>{let f=oe(u);if(f!=null){let m=i(e,typeof f);m!==Ct&&T([[u,m]])}};e.addEventListener("input",d),e.addEventListener("change",d);let h=S(()=>{a(oe(u))});return()=>{h(),e.removeEventListener("input",d),e.removeEventListener("change",d)}}});p({name:"class",requirement:{value:"must"},returnsValue:!0,apply({key:e,el:t,mods:n,rx:r}){e&&=L(e,n,"kebab");let s,o=()=>{i.disconnect(),s=e?{[e]:r()}:r();for(let c in s){let l=c.split(/\s+/).filter(u=>u.length>0);if(s[c])for(let u of l)t.classList.contains(u)||t.classList.add(u);else for(let u of l)t.classList.contains(u)&&t.classList.remove(u)}i.observe(t,{attributeFilter:["class"]})},i=new MutationObserver(o),a=S(o);return()=>{i.disconnect(),a();for(let c in s){let l=c.split(/\s+/).filter(u=>u.length>0);for(let u of l)t.classList.remove(u)}}}});p({name:"computed",requirement:{value:"must"},returnsValue:!0,apply({key:e,mods:t,rx:n,error:r}){if(e)T([[L(e,t),ke(n)]]);else{let s=Object.assign({},n());Y(s,o=>{if(typeof o=="function")return ke(o);throw r("ComputedExpectedFunction")}),O(s)}}});p({name:"effect",requirement:{key:"denied",value:"must"},apply:({rx:e})=>S(e)});p({name:"indicator",requirement:"exclusive",apply({el:e,key:t,mods:n,value:r}){let s=t!=null?L(t,n):r;T([[s,!1]]);let o=i=>{let{type:a,el:c}=i.detail;if(c===e)switch(a){case Ye:T([[s,!0]]);break;case Xe:T([[s,!1]]);break}};return document.addEventListener(q,o),()=>{T([[s,!1]]),document.removeEventListener(q,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},te=(e,t,n=!1)=>e?e.has(t.toLowerCase()):n;var et=(e,t)=>(...n)=>{setTimeout(()=>{e(...n)},t)},Pt=(e,t,n=!0,r=!1,s=!1)=>{let o=null,i=0;return(...a)=>{n&&!i?(e(...a),o=null):o=a,(!i||s)&&(i&&clearTimeout(i),i=setTimeout(()=>{r&&o!==null&&e(...o),o=null,i=0},t))}},ce=(e,t)=>{let n=t.get("delay");if(n){let o=z(n);e=et(e,o)}let r=t.get("debounce");if(r){let o=z(r),i=te(r,"leading",!1),a=!te(r,"notrailing",!1);e=Pt(e,o,i,a,!0)}let s=t.get("throttle");if(s){let o=z(s),i=!te(s,"noleading",!1),a=te(s,"trailing",!1);e=Pt(e,o,i,a)}return e};var tt=!!document.startViewTransition,Q=(e,t)=>{if(t.has("viewtransition")&&tt){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=()=>{M(),e(),x()};n=Q(n,t);let r=0,s=t.get("delay");s&&(r=z(s),r>0&&(n=et(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=ae(t));let o=()=>{i.disconnect(),e.textContent=JSON.stringify(_(s),null,r),i.observe(e,{childList:!0,characterData:!0,subtree:!0})},i=new MutationObserver(o),a=S(o);return()=>{i.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);let o=c=>{c&&(n.has("prevent")&&c.preventDefault(),n.has("stop")&&c.stopPropagation()),M(),r(c),x()};o=Q(o,n),o=ce(o,n);let i={capture:n.has("capture"),passive:n.has("passive"),once:n.has("once")};if(n.has("outside")){s=document;let c=o;o=l=>{e.contains(l?.target)||c(l)}}let a=L(t,n,"kebab");if((a===q||a===Z)&&(s=document),e instanceof HTMLFormElement&&a==="submit"){let c=o;o=l=>{l?.preventDefault(),c(l)}}return s.addEventListener(a,o,i),()=>{s.removeEventListener(a,o)}}});var Ot=(e,t,n)=>Math.max(t,Math.min(n,e));var nt=new WeakSet;p({name:"on-intersect",requirement:{key:"denied",value:"must"},apply({el:e,mods:t,rx:n}){let r=()=>{M(),n(),x()};r=Q(r,t),r=ce(r,t);let s={threshold:0};t.has("full")?s.threshold=1:t.has("half")?s.threshold=.5:t.get("threshold")&&(s.threshold=Ot(Number(t.get("threshold")),0,100)/100);let o=t.has("exit"),i=new IntersectionObserver(a=>{for(let c of a)c.isIntersecting!==o&&(r(),i&&nt.has(e)&&i.disconnect())},s);return i.observe(e),t.has("once")&&nt.add(e),()=>{t.has("once")||nt.delete(e),i&&(i.disconnect(),i=null)}}});p({name:"on-interval",requirement:{key:"denied",value:"must"},apply({mods:e,rx:t}){let n=()=>{M(),t(),x()};n=Q(n,e);let r=1e3,s=e.get("duration");s&&(r=z(s),te(s,"leading",!1)&&n());let o=setInterval(n,r);return()=>{clearInterval(o)}}});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 o=G(`${this.name}-filter`),i=e.getAttribute(o),a={};i&&(a=ae(i));let c=!1,l=ce(u=>{if(c)return;let d=_(a,u.detail);if(!ct(d)){c=!0,M();try{r(d)}finally{x(),c=!1}}},n);return document.addEventListener(Z,l),()=>{document.removeEventListener(Z,l)}}});p({name:"ref",requirement:"exclusive",apply({el:e,key:t,mods:n,value:r}){let s=t!=null?L(t,n):r;T([[s,e]])}});var kt="none",Ht="display";p({name:"show",requirement:{key:"denied",value:"must"},returnsValue:!0,apply({el:e,rx:t}){let n=()=>{r.disconnect(),t()?e.style.display===kt&&e.style.removeProperty(Ht):e.style.setProperty(Ht,kt),r.observe(e,{attributeFilter:["style"]})},r=new MutationObserver(n),s=S(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=L(e,t),T([[e,n?.()]],{ifMissing:r});else{let s=Object.assign({},n?.());O(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,o=(l,u)=>{let d=s.get(l);!u&&u!==0?d!==void 0&&(d?r.setProperty(l,d):r.removeProperty(l)):(d===void 0&&s.set(l,r.getPropertyValue(l)),r.setProperty(l,String(u)))},i=()=>{if(a.disconnect(),e)o(e,n());else{let l=n();for(let[u,d]of s)u in l||(d?r.setProperty(u,d):r.removeProperty(u));for(let u in l)o(ge(u),l[u])}a.observe(t,{attributeFilter:["style"]})},a=new MutationObserver(i),c=S(i);return()=>{a.disconnect(),c();for(let[l,u]of s)u?r.setProperty(l,u):r.removeProperty(l)}}});p({name:"text",requirement:{key:"denied",value:"must"},returnsValue:!0,apply({el:e,rx:t}){let n=()=>{r.disconnect(),e.textContent=`${t()}`,r.observe(e,{childList:!0,characterData:!0,subtree:!0})},r=new MutationObserver(n),s=S(n);return()=>{r.disconnect(),s()}}});var _t=(e,t)=>e.includes(t),pn=["remove","outer","inner","replace","prepend","append","before","after"],gn=["html","svg","mathml"];ve({name:"datastar-patch-elements",apply(e,{selector:t="",mode:n="outer",namespace:r="html",useViewTransition:s="",elements:o=""}){if(!_t(pn,n))throw e.error("PatchElementsInvalidMode",{mode:n});if(!t&&n!=="outer"&&n!=="replace")throw e.error("PatchElementsExpectedSelector");if(!_t(gn,r))throw e.error("PatchElementsInvalidNamespace",{namespace:r});let i={selector:t,mode:n,namespace:r,useViewTransition:s.trim()==="true",elements:o};tt&&s?document.startViewTransition(()=>Dt(e,i)):Dt(e,i)}});var Dt=({error:e},{selector:t,mode:n,namespace:r,elements:s})=>{let o=s.replace(/]*>|>)([\s\S]*?)<\/svg>/gim,""),i=/<\/html>/.test(o),a=/<\/head>/.test(o),c=/<\/body>/.test(o),l=r==="svg"?"svg":r==="mathml"?"math":"",u=l?`<${l}>${s}`:s,d=new DOMParser().parseFromString(i||a||c?s:``,"text/html"),h=document.createDocumentFragment();if(i)h.appendChild(d.documentElement);else if(a&&c)h.appendChild(d.head),h.appendChild(d.body);else if(a)h.appendChild(d.head);else if(c)h.appendChild(d.body);else if(l){let f=d.querySelector("template").content.querySelector(l);for(let m of f.childNodes)h.appendChild(m)}else h=d.querySelector("template").content;if(!t&&(n==="outer"||n==="replace"))for(let f of h.children){let m;if(f instanceof HTMLHtmlElement)m=document.documentElement;else if(f instanceof HTMLBodyElement)m=document.body;else if(f instanceof HTMLHeadElement)m=document.head;else if(m=document.getElementById(f.id),!m){console.warn(e("PatchElementsNoTargetsFound"),{element:{id:f.id}});continue}$t(n,f,[m])}else{let f=document.querySelectorAll(t);if(!f.length){console.warn(e("PatchElementsNoTargetsFound"),{selector:t});return}$t(n,h,f)}},st=new WeakSet;for(let e of document.querySelectorAll("script"))st.add(e);var jt=e=>{let t=e instanceof HTMLScriptElement?[e]:e.querySelectorAll("script");for(let n of t)if(!st.has(n)){let r=document.createElement("script");for(let{name:s,value:o}of n.attributes)r.setAttribute(s,o);r.text=n.text,n.replaceWith(r),st.add(r)}},Vt=(e,t,n)=>{for(let r of e){let s=t.cloneNode(!0);jt(s),r[n](s)}},$t=(e,t,n)=>{switch(e){case"remove":for(let r of n)r.remove();break;case"outer":case"inner":for(let r of n)yn(r,t.cloneNode(!0),e),jt(r);break;case"replace":Vt(n,t,"replaceWith");break;case"prepend":case"append":case"before":case"after":Vt(n,t,e)}},H=new Map,ue=new Set,le=new Map,Se=new Set,fe=document.createElement("div");fe.hidden=!0;var Te=G("ignore-morph"),hn=`[${Te}]`,yn=(e,t,n="outer")=>{if(K(e)&&K(t)&&e.hasAttribute(Te)&&t.hasAttribute(Te)||e.parentElement?.closest(hn))return;let r=document.createElement("div");r.append(t),document.body.insertAdjacentElement("afterend",fe);let s=e.querySelectorAll("[id]");for(let{id:a,tagName:c}of s)le.has(a)?Se.add(a):le.set(a,c);e instanceof Element&&e.id&&(le.has(e.id)?Se.add(e.id):le.set(e.id,e.tagName)),ue.clear();let o=r.querySelectorAll("[id]");for(let{id:a,tagName:c}of o)ue.has(a)?Se.add(a):le.get(a)===c&&ue.add(a);for(let a of Se)ue.delete(a);le.clear(),Se.clear(),H.clear();let i=n==="outer"?e.parentElement:e;qt(i,s),qt(r,o),Gt(i,r,n==="outer"?e:null,e.nextSibling),fe.remove()},Gt=(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 o=bn(s,n,r);if(o){if(o!==n){let i=n;for(;i&&i!==o;){let a=i;i=i.nextSibling,it(a)}}rt(o,s),n=o.nextSibling;continue}}if(s instanceof Element&&ue.has(s.id)){let o=document.getElementById(s.id),i=o;for(;i=i.parentNode;){let a=H.get(i);a&&(a.delete(s.id),a.size||H.delete(i))}Bt(e,o,n),rt(o,s),n=o.nextSibling;continue}if(H.has(s)){let o=s.namespaceURI,i=s.tagName,a=o&&o!=="http://www.w3.org/1999/xhtml"?document.createElementNS(o,i):document.createElement(i);e.insertBefore(a,n),rt(a,s),n=a.nextSibling}else{let o=document.importNode(s,!0);e.insertBefore(o,n),n=o.nextSibling}}for(;n&&n!==r;){let s=n;n=n.nextSibling,it(s)}},bn=(e,t,n)=>{let r=null,s=e.nextSibling,o=0,i=0,a=H.get(e)?.size||0,c=t;for(;c&&c!==n;){if(It(c,e)){let l=!1,u=H.get(c),d=H.get(e);if(d&&u){for(let h of u)if(d.has(h)){l=!0;break}}if(l)return c;if(!r&&!H.has(c)){if(!a)return c;r=c}}if(i+=H.get(c)?.size||0,i>a)break;r===null&&s&&It(c,s)&&(o++,s=s.nextSibling,o>=2&&(r=void 0)),c=c.nextSibling}return r||null},It=(e,t)=>e.nodeType===t.nodeType&&e.tagName===t.tagName&&(!e.id||e.id===t.id),it=e=>{H.has(e)?Bt(fe,e,null):e.parentNode?.removeChild(e)},Bt=it.call.bind(fe.moveBefore??fe.insertBefore),vn=G("preserve-attr"),rt=(e,t)=>{let n=t.nodeType;if(n===1){let r=e,s=t,o=r.hasAttribute("data-scope-children");if(r.hasAttribute(Te)&&s.hasAttribute(Te))return e;r instanceof HTMLInputElement&&s instanceof HTMLInputElement&&s.type!=="file"?s.getAttribute("value")!==r.getAttribute("value")&&(r.value=s.getAttribute("value")??""):r instanceof HTMLTextAreaElement&&s instanceof HTMLTextAreaElement&&(s.value!==r.value&&(r.value=s.value),r.firstChild&&r.firstChild.nodeValue!==s.value&&(r.firstChild.nodeValue=s.value));let i=(t.getAttribute(vn)??"").split(" ");for(let{name:a,value:c}of s.attributes)r.getAttribute(a)!==c&&!i.includes(a)&&r.setAttribute(a,c);for(let a=r.attributes.length-1;a>=0;a--){let{name:c}=r.attributes[a];!s.hasAttribute(c)&&!i.includes(c)&&r.removeAttribute(c)}o&&!r.hasAttribute("data-scope-children")&&r.setAttribute("data-scope-children",""),r.isEqualNode(s)||Gt(r,s),o&&r.dispatchEvent(new CustomEvent("datastar:scope-children",{bubbles:!1}))}return(n===8||n===3)&&e.nodeValue!==t.nodeValue&&(e.nodeValue=t.nodeValue),e},qt=(e,t)=>{for(let n of t)if(ue.has(n.id)){let r=n;for(;r&&r!==e;){let s=H.get(r);s||(s=new Set,H.set(r,s)),s.add(n.id),r=r.parentElement}}};ve({name:"datastar-patch-signals",apply({error:e},{signals:t,onlyIfMissing:n}){if(t){let r=n?.trim()==="true";O(ae(t),{ifMissing:r})}else throw e("PatchSignalsExpectedSignals")}});export{k as action,Rt as actions,p as attribute,M as beginBatch,ke as computed,S as effect,x as endBatch,_ as filtered,oe as getPath,O as mergePatch,T as mergePaths,X as root,pe as signal,F as startPeeking,P as stopPeeking,ve as watcher}; +var ut=/🖕JS_DS🚀/.source,Ge=ut.slice(0,5),je=ut.slice(4),j="datastar-fetch",ee="datastar-signal-patch";var C=Object.hasOwn??Object.prototype.hasOwnProperty.call;var K=e=>e!==null&&typeof e=="object"&&(Object.getPrototypeOf(e)===Object.prototype||Object.getPrototypeOf(e)===null),ft=e=>{for(let t in e)if(C(e,t))return!1;return!0},te=(e,t)=>{for(let n in e){let s=e[n];K(s)||Array.isArray(s)?te(s,t):e[n]=t(s)}},Re=e=>{let t={};for(let[n,s]of e){let r=n.split("."),i=r.pop(),a=r.reduce((o,c)=>o[c]??={},t);a[i]=s}return t};var xe=[],Be=[],Pe=0,Me=0,We=0,Ue,B,Le=0,M=()=>{Pe++},L=()=>{--Pe||(pt(),Q())},P=e=>{Ue=B,B=e},O=()=>{B=Ue,Ue=void 0},pe=e=>zt.bind(0,{previousValue:e,value_:e,flags_:1}),Je=Symbol("computed"),Oe=e=>{let t=Kt.bind(0,{flags_:17,getter:e});return t[Je]=1,t},T=e=>{let t={fn_:e,flags_:2};B&&Ke(t,B),P(t),M();try{t.fn_()}finally{L(),O()}return bt.bind(0,t)},pt=()=>{for(;Me"getter"in e?gt(e):ht(e,e.value_),gt=e=>{P(e),vt(e);try{let t=e.value_;return t!==(e.value_=e.getter(t))}finally{O(),St(e)}},ht=(e,t)=>(e.flags_=1,e.previousValue!==(e.previousValue=t)),ze=e=>{let t=e.flags_;if(!(t&64)){e.flags_=t|64;let n=e.subs_;n?ze(n.sub_):Be[We++]=e}},yt=(e,t)=>{if(t&16||t&32&&Et(e.deps_,e)){P(e),vt(e),M();try{e.fn_()}finally{L(),O(),St(e)}return}t&32&&(e.flags_=t&-33);let n=e.deps_;for(;n;){let s=n.dep_,r=s.flags_;r&64&&yt(s,s.flags_=r&-65),n=n.nextDep_}},zt=(e,...t)=>{if(t.length){if(e.value_!==(e.value_=t[0])){e.flags_=17;let s=e.subs_;return s&&(Qt(s),Pe||pt()),!0}return!1}let n=e.value_;if(e.flags_&16&&ht(e,n)){let s=e.subs_;s&&Ce(s)}return B&&Ke(e,B),n},Kt=e=>{let t=e.flags_;if(t&16||t&32&&Et(e.deps_,e)){if(gt(e)){let n=e.subs_;n&&Ce(n)}}else t&32&&(e.flags_=t&-33);return B&&Ke(e,B),e.value_},bt=e=>{let t=e.deps_;for(;t;)t=Fe(t,e);let n=e.subs_;n&&Fe(n),e.flags_=0},Ke=(e,t)=>{let n=t.depsTail_;if(n&&n.dep_===e)return;let s=n?n.nextDep_:t.deps_;if(s&&s.dep_===e){s.version_=Le,t.depsTail_=s;return}let r=e.subsTail_;if(r&&r.version_===Le&&r.sub_===t)return;let i=t.depsTail_=e.subsTail_={version_:Le,dep_:e,sub_:t,prevDep_:n,nextDep_:s,prevSub_:r};s&&(s.prevDep_=i),n?n.nextDep_=i:t.deps_=i,r?r.nextSub_=i:e.subs_=i},Fe=(e,t=e.sub_)=>{let n=e.dep_,s=e.prevDep_,r=e.nextDep_,i=e.nextSub_,a=e.prevSub_;if(r?r.prevDep_=s:t.depsTail_=s,s?s.nextDep_=r:t.deps_=r,i?i.prevSub_=a:n.subsTail_=a,a)a.nextSub_=i;else if(!(n.subs_=i))if("getter"in n){let o=n.deps_;if(o){n.flags_=17;do o=Fe(o,n);while(o)}}else"previousValue"in n||bt(n);return r},Qt=e=>{let t=e.nextSub_,n;e:for(;;){let s=e.sub_,r=s.flags_;if(r&60?r&12?r&4?!(r&48)&&Zt(e,s)?(s.flags_=r|40,r&=1):r=0:s.flags_=r&-9|32:r=0:s.flags_=r|32,r&2&&ze(s),r&1){let i=s.subs_;if(i){let a=(e=i).nextSub_;a&&(n={value_:t,prev_:n},t=a);continue}}if(e=t){t=e.nextSub_;continue}for(;n;)if(e=n.value_,n=n.prev_,e){t=e.nextSub_;continue e}break}},vt=e=>{Le++,e.depsTail_=void 0,e.flags_=e.flags_&-57|4},St=e=>{let t=e.depsTail_,n=t?t.nextDep_:e.deps_;for(;n;)n=Fe(n,e);e.flags_&=-5},Et=(e,t)=>{let n,s=0,r=!1;e:for(;;){let i=e.dep_,a=i.flags_;if(t.flags_&16)r=!0;else if((a&17)===17){if(dt(i)){let o=i.subs_;o.nextSub_&&Ce(o),r=!0}}else if((a&33)===33){(e.nextSub_||e.prevSub_)&&(n={value_:e,prev_:n}),e=i.deps_,t=i,++s;continue}if(!r){let o=e.nextDep_;if(o){e=o;continue}}for(;s--;){let o=t.subs_,c=o.nextSub_;if(c?(e=n.value_,n=n.prev_):e=o,r){if(dt(t)){c&&Ce(o),t=e.sub_;continue}r=!1}else t.flags_&=-33;if(t=e.sub_,e.nextDep_){e=e.nextDep_;continue e}}return r}},Ce=e=>{do{let t=e.sub_,n=t.flags_;(n&48)===32&&(t.flags_=n|16,n&2&&ze(t))}while(e=e.nextSub_)},Zt=(e,t)=>{let n=t.depsTail_;for(;n;){if(n===e)return!0;n=n.prevDep_}return!1},oe=e=>{let t=ne,n=e.split(".");for(let s of n){if(t==null||!C(t,s))return;t=t[s]}return t},Ne=(e,t="")=>{let n=Array.isArray(e);if(n||K(e)){let s=n?[]:{};for(let i in e)s[i]=pe(Ne(e[i],`${t+i}.`));let r=pe(0);return new Proxy(s,{get(i,a){if(!(a==="toJSON"&&!C(s,a)))return n&&a in Array.prototype?(r(),s[a]):typeof a=="symbol"?s[a]:((!C(s,a)||s[a]()==null)&&(s[a]=pe(""),Q(t+a,""),r(r()+1)),s[a]())},set(i,a,o){let c=t+a;if(n&&a==="length"){let l=s[a]-o;if(s[a]=o,l>0){let u={};for(let d=o;d{if(e!==void 0&&t!==void 0&&xe.push([e,t]),!Pe&&xe.length){let n=Re(xe);xe.length=0,document.dispatchEvent(new CustomEvent(ee,{detail:n}))}},k=(e,{ifMissing:t}={})=>{M();for(let n in e)e[n]==null?t||delete ne[n]:Tt(e[n],n,ne,"",t);L()},A=(e,t)=>k(Re(e),t),Tt=(e,t,n,s,r)=>{if(K(e)){C(n,t)&&(K(n[t])||Array.isArray(n[t]))||(n[t]={});for(let i in e)e[i]==null?r||delete n[t][i]:Tt(e[i],i,n[t],`${s+t}.`,r)}else r&&C(n,t)||(n[t]=e)},mt=e=>typeof e=="string"?RegExp(e.replace(/^\/|\/$/g,"")):e,V=({include:e=/.*/,exclude:t=/(?!)/}={},n=ne)=>{let s=mt(e),r=mt(t),i=[],a=[[n,""]];for(;a.length;){let[o,c]=a.pop();for(let l in o){let u=c+l;K(o[l])?a.push([o[l],`${u}.`]):s.test(u)&&!r.test(u)&&i.push([u,oe(u)])}}return Re(i)},ne=Ne({});var Z=e=>e instanceof HTMLElement||e instanceof SVGElement||e instanceof MathMLElement;var ge=e=>e.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();var At=e=>ge(e).replace(/-/g,"_");var ce=e=>{try{return JSON.parse(e)}catch{return Function(`return (${e})`)()}},wt={camel:e=>e.replace(/-[a-z]/g,t=>t[1].toUpperCase()),snake:e=>e.replace(/-/g,"_"),pascal:e=>e[0].toUpperCase()+wt.camel(e.slice(1))},N=(e,t,n="camel")=>{for(let s of t.get("case")||[n])e=wt[s]?.(e)||e;return e},W=e=>ALIAS?`data-${ALIAS}-${e}`:`data-${e}`;var Yt="https://data-star.dev/errors",he=(e,t,n={})=>{Object.assign(n,e);let s=new Error,r=At(t),i=new URLSearchParams({metadata:JSON.stringify(n)}).toString(),a=JSON.stringify(n,null,2);return s.message=`${t} +More info: ${Yt}/${r}?${i} +Context: ${a}`,s},ye=new Map,Qe=new Map,Rt=new Map,xt=new Proxy({},{get:(e,t)=>ye.get(t)?.apply,has:(e,t)=>ye.has(t),ownKeys:()=>Reflect.ownKeys(ye),set:()=>!1,deleteProperty:()=>!1}),be=new Map,ke=[],Ze=new Set,Xt=new WeakSet,y=e=>{ke.push(e),ke.length===1&&setTimeout(()=>{for(let t of ke)Ze.add(t.name),Qe.set(t.name,t);ke.length=0,rn(),Ze.clear()})},D=e=>{ye.set(e.name,e)};document.addEventListener(j,(e=>{let t=Rt.get(e.detail.type);t&&t.apply({error:he.bind(0,{plugin:{type:"watcher",name:t.name},element:{id:e.target.id,tag:e.target.tagName}})},e.detail.argsRaw)}));var ve=e=>{Rt.set(e.name,e)},_t=e=>{for(let t of e){let n=be.get(t);if(n&&be.delete(t))for(let s of n.values())for(let r of s.values())r()}},Mt=W("ignore"),en=`[${Mt}]`,Lt=e=>e.hasAttribute(`${Mt}__self`)||!!e.closest(en),De=(e,t)=>{for(let n of e)if(!Lt(n))for(let s in n.dataset)Nt(n,s.replace(/[A-Z]/g,"-$&").toLowerCase(),n.dataset[s],t)},tn=e=>{for(let{target:t,type:n,attributeName:s,addedNodes:r,removedNodes:i}of e)if(n==="childList"){for(let a of i)Z(a)&&(_t([a]),_t(a.querySelectorAll("*")));for(let a of r)Z(a)&&(De([a]),De(a.querySelectorAll("*")))}else if(n==="attributes"&&s.startsWith("data-")&&Z(t)&&!Lt(t)){let a=s.slice(5),o=t.getAttribute(s);if(o===null){let c=be.get(t);if(c){let l=c.get(a);if(l){for(let u of l.values())u();c.delete(a)}}}else Nt(t,a,o)}},nn=new MutationObserver(tn),sn=e=>{let[t,...n]=e.split("__"),[s,r]=t.split(/:(.+)/),i=new Map;for(let a of n){let[o,...c]=a.split(".");i.set(o,new Set(c))}return{pluginName:s,key:r,mods:i}};var rn=(e=document.documentElement,t=!0)=>{Z(e)&&De([e],!0),De(e.querySelectorAll("*"),!0),t&&(nn.observe(e,{subtree:!0,childList:!0,attributes:!0}),Xt.add(e))},Nt=(e,t,n,s)=>{if(!ALIAS||t.startsWith(`${ALIAS}-`)){let r=ALIAS?t.slice(ALIAS.length+1):t,{pluginName:i,key:a,mods:o}=sn(r),c=Qe.get(i);if((!s||Ze.has(i))&&c){let l={el:e,rawKey:r,mods:o,error:he.bind(0,{plugin:{type:"attribute",name:c.name},element:{id:e.id,tag:e.tagName},expression:{rawKey:r,key:a,value:n}}),key:a,value:n,loadedPluginNames:{actions:new Set(ye.keys()),attributes:new Set(Qe.keys())},rx:void 0},u=c.requirement&&(typeof c.requirement=="string"?c.requirement:c.requirement.key)||"allowed",d=c.requirement&&(typeof c.requirement=="string"?c.requirement:c.requirement.value)||"allowed",g=a!=null&&a!=="",f=n!=null&&n!=="";if(g){if(u==="denied")throw l.error("KeyNotAllowed")}else if(u==="must")throw l.error("KeyRequired");if(f){if(d==="denied")throw l.error("ValueNotAllowed")}else if(d==="must")throw l.error("ValueRequired");if(u==="exclusive"||d==="exclusive"){if(g&&f)throw l.error("KeyAndValueProvided");if(!g&&!f)throw l.error("KeyOrValueRequired")}let m=new Map;if(f){let v;l.rx=(...S)=>(v||(v=an(n,{returnsValue:c.returnsValue,argNames:c.argNames,cleanups:m})),v(e,...S))}let p=c.apply(l);p&&m.set("attribute",p);let h=be.get(e);if(h){let v=h.get(r);if(v)for(let S of v.values())S()}else h=new Map,be.set(e,h);h.set(r,m)}}},an=(e,{returnsValue:t=!1,argNames:n=[],cleanups:s=new Map}={})=>{let r="";if(t){let c=/(\/(\\\/|[^/])*\/|"(\\"|[^"])*"|'(\\'|[^'])*'|`(\\`|[^`])*`|\(\s*((function)\s*\(\s*\)|(\(\s*\))\s*=>)\s*(?:\{[\s\S]*?\}|[^;){]*)\s*\)\s*\(\s*\)|[^;])+/gm,l=e.trim().match(c);if(l){let u=l.length-1,d=l[u].trim();d.startsWith("return")||(l[u]=`return (${d});`),r=l.join(`; +`)}}else r=e.trim();let i=new Map,a=RegExp(`(?:${Ge})(.*?)(?:${je})`,"gm"),o=0;for(let c of r.matchAll(a)){let l=c[1],u=`__escaped${o++}`;i.set(u,l),r=r.replace(Ge+l+je,u)}r=r.replace(/\$\['([a-zA-Z_$\d][\w$]*)'\]/g,"$$$1").replace(/\$([a-zA-Z_\d]\w*(?:[.-]\w+)*)/g,(c,l)=>l.split(".").reduce((u,d)=>`${u}['${d}']`,"$")),r=r.replaceAll(/@([A-Za-z_$][\w$]*)\(/g,'__action("$1",evt,');for(let[c,l]of i)r=r.replace(c,l);try{let c=Function("el","$","__action","evt",...n,r);return(l,...u)=>{let d=(g,f,...m)=>{let p=he.bind(0,{plugin:{type:"action",name:g},element:{id:l.id,tag:l.tagName},expression:{fnContent:r,value:e}}),h=xt[g];if(h)return h({el:l,evt:f,error:p,cleanups:s},...m);throw p("UndefinedAction")};try{return c(l,ne,d,void 0,...u)}catch(g){throw console.error(g),he({element:{id:l.id,tag:l.tagName},expression:{fnContent:r,value:e},error:g.message},"ExecuteExpression")}}}catch(c){throw console.error(c),he({expression:{fnContent:r,value:e},error:c.message},"GenerateExpression")}};D({name:"peek",apply(e,t){P();try{return t()}finally{O()}}});D({name:"setAll",apply(e,t,n){P();let s=V(n);te(s,()=>t),k(s),O()}});D({name:"toggleAll",apply(e,t){P();let n=V(t);te(n,s=>!s),k(n),O()}});var Se=(e,t,n=!0)=>D({name:e,apply:async({el:s,evt:r,error:i,cleanups:a},o,{selector:c,headers:l,contentType:u="json",filterSignals:{include:d=/.*/,exclude:g=/(^|\.)_/}={},openWhenHidden:f=n,payload:m,requestCancellation:p="auto",retry:h="auto",retryInterval:v=1e3,retryScaler:S=2,retryMaxWaitMs:w=3e4,retryMaxCount:G=10}={})=>{let U=p instanceof AbortController?p:new AbortController;p==="auto"&&(a.get(`@${e}`)?.(),a.set(`@${e}`,async()=>{U.abort(),await Promise.resolve()}));let F=null;try{if(!o?.length)throw i("FetchNoUrlProvided",{action:D});let R={Accept:"text/event-stream, text/html, application/json","Datastar-Request":!0};u==="json"&&(R["Content-Type"]="application/json");let Ae=Object.assign({},R,l),re={method:t,headers:Ae,openWhenHidden:f,retry:h,retryInterval:v,retryScaler:S,retryMaxWaitMs:w,retryMaxCount:G,signal:U.signal,onopen:async b=>{b.status>=400&&I(on,s,{status:b.status.toString()})},onmessage:b=>{if(!b.event.startsWith("datastar"))return;let J=b.event,E={};for(let _ of b.data.split(` +`)){let x=_.indexOf(" "),z=_.slice(0,x),He=_.slice(x+1);(E[z]||=[]).push(He)}let H=Object.fromEntries(Object.entries(E).map(([_,x])=>[_,x.join(` +`)]));I(J,s,H)},onerror:b=>{if(Ft(b))throw b("FetchExpectedTextEventStream",{url:o});b&&(console.error(b.message),I(cn,s,{message:b.message}))}},ie=new URL(o,document.baseURI),ae=new URLSearchParams(ie.search);if(u==="json"){P(),m=m!==void 0?m:V({include:d,exclude:g}),O();let b=JSON.stringify(m);t==="GET"?ae.set("datastar",b):re.body=b}else if(u==="form"){let b=c?document.querySelector(c):s.closest("form");if(!b)throw i("FetchFormNotFound",{action:D,selector:c});if(!b.noValidate&&!b.checkValidity()){b.reportValidity();return}let J=new FormData(b),E=s;if(s===b&&r instanceof SubmitEvent)E=r.submitter;else{let x=z=>z.preventDefault();b.addEventListener("submit",x),F=()=>{b.removeEventListener("submit",x)}}if(E instanceof HTMLButtonElement){let x=E.getAttribute("name");x&&J.append(x,E.value)}let H=b.getAttribute("enctype")==="multipart/form-data";H||(Ae["Content-Type"]="application/x-www-form-urlencoded");let _=new URLSearchParams(J);if(t==="GET")for(let[x,z]of _)ae.append(x,z);else H?re.body=J:re.body=_}else throw i("FetchInvalidContentType",{action:D,contentType:u});I(Ye,s,{}),ie.search=ae.toString();try{await gn(ie.toString(),s,re)}catch(b){if(!Ft(b))throw i("FetchFailed",{method:t,url:o,error:b.message})}}finally{I(Xe,s,{}),F?.(),a.delete(`@${e}`)}}});Se("get","GET",!1);Se("patch","PATCH");Se("post","POST");Se("put","PUT");Se("delete","DELETE");var Ye="started",Xe="finished",on="error",cn="retrying",ln="retries-failed",I=(e,t,n)=>document.dispatchEvent(new CustomEvent(j,{detail:{type:e,el:t,argsRaw:n}})),Ft=e=>`${e}`.includes("text/event-stream"),un=async(e,t)=>{let n=e.getReader(),s=await n.read();for(;!s.done;)t(s.value),s=await n.read()},fn=e=>{let t,n,s,r=!1;return i=>{t?t=mn(t,i):(t=i,n=0,s=-1);let a=t.length,o=0;for(;n{let s=Ct(),r=new TextDecoder;return(i,a)=>{if(!i.length)n?.(s),s=Ct();else if(a>0){let o=r.decode(i.subarray(0,a)),c=a+(i[a+1]===32?2:1),l=r.decode(i.subarray(c));switch(o){case"data":s.data=s.data?`${s.data} +${l}`:l;break;case"event":s.event=l;break;case"id":e(s.id=l);break;case"retry":{let u=+l;Number.isNaN(u)||t(s.retry=u);break}}}}},mn=(e,t)=>{let n=new Uint8Array(e.length+t.length);return n.set(e),n.set(t,e.length),n},Ct=()=>({data:"",event:"",id:"",retry:void 0}),pn=async(e,t,n,s,r)=>{let i=e.body?.getReader();if(!i){s(),r();return}let a=new TextDecoder,o="",c=!1;try{for(;;){let{done:l,value:u}=await i.read();if(l)break;o+=a.decode(u,{stream:!0});let d=/