From e1d6f9fa4bff7da4e7df33517f13f0882da36b29 Mon Sep 17 00:00:00 2001 From: MichaelWest22 Date: Mon, 12 Jan 2026 01:23:15 +1300 Subject: [PATCH 1/6] Improve morph algo --- MORPH_IMPROVEMENTS.md | 90 ++++++++++ library/src/plugins/watchers/patchElements.ts | 157 ++++++++++++------ 2 files changed, 197 insertions(+), 50 deletions(-) create mode 100644 MORPH_IMPROVEMENTS.md diff --git a/MORPH_IMPROVEMENTS.md b/MORPH_IMPROVEMENTS.md new file mode 100644 index 00000000..b180f581 --- /dev/null +++ b/MORPH_IMPROVEMENTS.md @@ -0,0 +1,90 @@ +# 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 Functions:** +- `isMatch()` - Uses `isEqualNode()` for deep equality check, falls back to matching on identifying attributes (name, href, src) +- `matchesUpcomingSibling()` - Checks if a node matches any upcoming siblings within a limit + +**Benefits:** +- Deep equality checking via `isEqualNode()` catches identical nodes +- Attribute-based matching (name, href, src) identifies semantically equivalent elements +- 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/attribute 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 or attribute match (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 `isMatch()` function first uses `isEqualNode()` which performs a deep comparison of nodes including their attributes, children, and content. This catches exact duplicates before falling back to attribute-based heuristics. + +## 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/library/src/plugins/watchers/patchElements.ts b/library/src/plugins/watchers/patchElements.ts index fc4bb82c..1f7b614c 100644 --- a/library/src/plugins/watchers/patchElements.ts +++ b/library/src/plugins/watchers/patchElements.ts @@ -225,6 +225,8 @@ const oldIdTagNameMap = new Map() const duplicateIds = new Set() const ctxPantry = document.createElement('div') ctxPantry.hidden = true +let ctxFutureMatches = new WeakSet() +let ctxActiveElementAndParents: Element[] = [] const aliasedIgnoreMorph = aliasify('ignore-morph') const aliasedIgnoreMorphAttr = `[${aliasedIgnoreMorph}]` @@ -286,6 +288,15 @@ const morph = ( populateIdMapWithTree(parent, oldIdElements) populateIdMapWithTree(normalizedElt, newIdElements) + ctxFutureMatches = new WeakSet() + ctxActiveElementAndParents = [] + let elt = document.activeElement + while (elt !== oldElt) { + if (!elt) break + ctxActiveElementAndParents.push(elt) + elt = elt.parentElement + } + morphChildren( parent, normalizedElt, @@ -323,15 +334,15 @@ const morphChildren = ( if (insertionPoint && insertionPoint !== endPoint) { const bestMatch = findBestMatch(newChild, insertionPoint, endPoint) if (bestMatch) { - // if the node to morph is not at the insertion point then remove/move up to it + // if the node to morph is not at the insertion point then move nodes before it to the end if (bestMatch !== insertionPoint) { - let cursor: Node | null = insertionPoint - // Remove nodes between the start and end nodes - while (cursor && cursor !== bestMatch) { - const tempNode = cursor - cursor = cursor.nextSibling - removeNode(tempNode) - } + moveNodesBetweenToEnd( + oldParent, + insertionPoint, + bestMatch, + endPoint, + newChild, + ) } morphNode(bestMatch, newChild) insertionPoint = bestMatch.nextSibling @@ -395,27 +406,61 @@ const morphChildren = ( } } -// Scans forward from the startPoint to the endPoint looking for a match for the node. -// It looks for an id set match first, then a soft match. -// We abort soft matching if we find two future soft matches, to reduce churn. +const isMatch = (oldNode: Node, newNode: Node): boolean => { + if (oldNode.isEqualNode(newNode)) return true + if (oldNode instanceof Element && newNode instanceof Element) { + const attrs = ['name', 'href', 'src'] + for (const attr of attrs) { + const v1 = oldNode.getAttribute(attr) + const v2 = newNode.getAttribute(attr) + if (v1 && v1 === v2) return true + } + } + return false +} + +const matchesUpcomingSibling = ( + oldNode: Node, + startNode: Node, + limit = 5, +): boolean => { + if (ctxFutureMatches.has(oldNode)) return true + for ( + let sibling = startNode.nextSibling, i = 0; + sibling && i < limit; + sibling = sibling.nextSibling, i++ + ) { + if (isMatch(oldNode, sibling)) { + ctxFutureMatches.add(oldNode) + return true + } + } + return false +} + +// Scans forward from startPoint to endPoint looking for the best match for node. +// Priority: id set match > exact/attribute match > tag match const findBestMatch = ( node: Node, startPoint: Node | null, endPoint: Node | null, ): Node | null => { - let bestMatch: Node | null | undefined = null - let nextSibling = node.nextSibling - let siblingSoftMatchCount = 0 + // non-element nodes: only check first position, don't scan siblings + if (node.nodeType !== 1) { + return startPoint?.nodeType === node.nodeType ? startPoint : null + } + + let softMatch: Node | null = null let displaceMatchCount = 0 // Max ID matches we are willing to displace in our search const nodeMatchCount = ctxIdMap.get(node)?.size || 0 + let scanLimit = 10 let cursor = startPoint while (cursor && cursor !== endPoint) { // soft matching is a prerequisite for id set matching if (isSoftMatch(cursor, node)) { - let isIdSetMatch = false const oldSet = ctxIdMap.get(cursor) const newSet = ctxIdMap.get(node) @@ -426,54 +471,45 @@ const findBestMatch = ( // But the newNode content we call this on has not been // merged yet and we don't allow duplicate IDs so it is simple if (newSet.has(id)) { - isIdSetMatch = true - break + return cursor // found an id set match, we're done! } } } - if (isIdSetMatch) { - return cursor // found an id set match, we're done! - } - // we haven’t yet saved a soft match fallback // the current soft match will hard match something else in the future, leave it - if (!bestMatch && !ctxIdMap.has(cursor)) { - // optimization: if node can't id set match, we can just return the soft match immediately - if (!nodeMatchCount) { + // only consider nodes without id children (avoid moving nodes with state) + if (!ctxIdMap.has(cursor)) { + // exact or attribute match within scan window + if (scanLimit > 0 && isMatch(cursor, node)) { return cursor } - // save this as the fallback if we get through the loop without finding a hard match - bestMatch = cursor + // save first tag-only match as fallback + if (!softMatch) { + softMatch = cursor + } } } - // check for IDs we may be displaced when matching + // stop if we've displaced more IDs than the node contains displaceMatchCount += ctxIdMap.get(cursor)?.size || 0 - if (displaceMatchCount > nodeMatchCount) { - // if we are going to displace more IDs than the node contains then - // we do not have a good candidate for an ID match, so return - break - } + if (displaceMatchCount > nodeMatchCount) break - if (bestMatch === null && nextSibling && isSoftMatch(cursor, nextSibling)) { - // The next new node has a soft match with this node, so - // increment the count of future soft matches - siblingSoftMatchCount++ - nextSibling = nextSibling.nextSibling - - // If there are two future soft matches, block soft matching for this node to allow - // future siblings to soft match. This is to reduce churn in the DOM when an element - // is prepended. - if (siblingSoftMatchCount >= 2) { - bestMatch = undefined - } - } + // stop if cursor contains active element to avoid losing focus + if (ctxActiveElementAndParents.includes(cursor as Element)) break + + // stop scanning after limit if node has no ID children to match + if (--scanLimit < 1 && !nodeMatchCount) break cursor = cursor.nextSibling } - return bestMatch || null + // if softMatch will be used by an upcoming sibling, insert current node instead + if (softMatch && matchesUpcomingSibling(softMatch, node)) { + return null + } + + return softMatch } // ok to cast: if one is not element, `id` and `tagName` will be null and we'll just compare that. @@ -492,10 +528,31 @@ const isSoftMatch = (oldNode: Node, newNode: Node): boolean => const removeNode = (node: Node): void => { // are we going to id set match this later? ctxIdMap.has(node) - ? // skip callbacks and move to pantry - moveBefore(ctxPantry, node, null) - : // remove for realsies - node.parentNode?.removeChild(node) + ? moveBefore(ctxPantry, node, null) + : node.parentNode?.removeChild(node) +} + +const moveNodesBetweenToEnd = ( + oldParent: Element | ShadowRoot, + startInclusive: Node, + endExclusive: Node, + originalEndPoint: Node | null, + currentNewChild: Node, +): void => { + let cursor: Node | null = startInclusive + while (cursor && cursor !== endExclusive) { + const tempNode = cursor + cursor = cursor.nextSibling + if ( + tempNode instanceof Element && + (ctxIdMap.has(tempNode) || + matchesUpcomingSibling(tempNode, currentNewChild, 5)) + ) { + moveBefore(oldParent, tempNode, originalEndPoint) + } else { + removeNode(tempNode) + } + } } // Moves an element before another element within the same parent. From 34d765d598be356ac6f1c032a1fa256b7c5d716f Mon Sep 17 00:00:00 2001 From: MichaelWest22 Date: Mon, 12 Jan 2026 23:43:16 +1300 Subject: [PATCH 2/6] remove attribute name,href,src matching to improve perf and reduce code size --- MORPH_IMPROVEMENTS.md | 15 ++++++++------- library/src/plugins/watchers/patchElements.ts | 19 +++---------------- 2 files changed, 11 insertions(+), 23 deletions(-) diff --git a/MORPH_IMPROVEMENTS.md b/MORPH_IMPROVEMENTS.md index b180f581..ae745c68 100644 --- a/MORPH_IMPROVEMENTS.md +++ b/MORPH_IMPROVEMENTS.md @@ -8,13 +8,14 @@ This document describes the improvements ported from my test version of Idiomorp ### 1. Enhanced Node Matching -**New Functions:** -- `isMatch()` - Uses `isEqualNode()` for deep equality check, falls back to matching on identifying attributes (name, href, src) -- `matchesUpcomingSibling()` - Checks if a node matches any upcoming siblings within a limit +**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 -- Attribute-based matching (name, href, src) identifies semantically equivalent elements - Prevents premature matching when better matches exist later in the DOM - Reduces unnecessary DOM operations @@ -23,13 +24,13 @@ This document describes the improvements ported from my test version of Idiomorp **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/attribute matching within scan window before falling back to tag-only matches +- 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 or attribute match (within scan window) +2. Exact match via `isEqualNode()` (within scan window) 3. Tag-only match (fallback) **Benefits:** @@ -83,7 +84,7 @@ The algorithm now scans up to 10 nodes ahead when looking for matches. This bala 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 `isMatch()` function first uses `isEqualNode()` which performs a deep comparison of nodes including their attributes, children, and content. This catches exact duplicates before falling back to attribute-based heuristics. +The algorithm uses `isEqualNode()` which performs a deep comparison of nodes including their attributes, children, and content. This catches exact duplicates efficiently. ## Source diff --git a/library/src/plugins/watchers/patchElements.ts b/library/src/plugins/watchers/patchElements.ts index 1f7b614c..9d98ef02 100644 --- a/library/src/plugins/watchers/patchElements.ts +++ b/library/src/plugins/watchers/patchElements.ts @@ -406,19 +406,6 @@ const morphChildren = ( } } -const isMatch = (oldNode: Node, newNode: Node): boolean => { - if (oldNode.isEqualNode(newNode)) return true - if (oldNode instanceof Element && newNode instanceof Element) { - const attrs = ['name', 'href', 'src'] - for (const attr of attrs) { - const v1 = oldNode.getAttribute(attr) - const v2 = newNode.getAttribute(attr) - if (v1 && v1 === v2) return true - } - } - return false -} - const matchesUpcomingSibling = ( oldNode: Node, startNode: Node, @@ -430,7 +417,7 @@ const matchesUpcomingSibling = ( sibling && i < limit; sibling = sibling.nextSibling, i++ ) { - if (isMatch(oldNode, sibling)) { + if (oldNode.isEqualNode(sibling)) { ctxFutureMatches.add(oldNode) return true } @@ -480,8 +467,8 @@ const findBestMatch = ( // the current soft match will hard match something else in the future, leave it // only consider nodes without id children (avoid moving nodes with state) if (!ctxIdMap.has(cursor)) { - // exact or attribute match within scan window - if (scanLimit > 0 && isMatch(cursor, node)) { + // exact match within scan window + if (scanLimit > 0 && cursor.isEqualNode(node)) { return cursor } // save first tag-only match as fallback From b5d1f20c5ec829b7a703587aad1aba7fbd6852e2 Mon Sep 17 00:00:00 2001 From: MichaelWest22 Date: Fri, 30 Jan 2026 02:38:02 +1300 Subject: [PATCH 3/6] handle empty id --- library/src/plugins/watchers/patchElements.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/src/plugins/watchers/patchElements.ts b/library/src/plugins/watchers/patchElements.ts index 9d98ef02..6b8b102b 100644 --- a/library/src/plugins/watchers/patchElements.ts +++ b/library/src/plugins/watchers/patchElements.ts @@ -254,7 +254,7 @@ const morph = ( for (const { id, tagName } of oldIdElements) { if (oldIdTagNameMap.has(id)) { duplicateIds.add(id) - } else { + } else if (id) { oldIdTagNameMap.set(id, tagName) } } From 11501135fed9343819f6a4570e998d69dfbf76f7 Mon Sep 17 00:00:00 2001 From: MichaelWest22 Date: Fri, 30 Jan 2026 02:47:30 +1300 Subject: [PATCH 4/6] bundle builds as well --- bundles/datastar-core.js | 9 ++++----- bundles/datastar-core.js.map | 6 +++--- bundles/datastar.js | 15 +++++++-------- bundles/datastar.js.map | 6 +++--- 4 files changed, 17 insertions(+), 19 deletions(-) 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..dc3002bd 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,je=ut.slice(0,5),Ge=ut.slice(4),q="datastar-fetch",Z="datastar-signal-patch";var F=Object.hasOwn??Object.prototype.hasOwnProperty.call;var U=e=>e!==null&&typeof e=="object"&&(Object.getPrototypeOf(e)===Object.prototype||Object.getPrototypeOf(e)===null),ft=e=>{for(let t in e)if(F(e,t))return!1;return!0},Y=(e,t)=>{for(let n in e){let s=e[n];U(s)||Array.isArray(s)?Y(s,t):e[n]=t(s)}},we=e=>{let t={};for(let[n,s]of e){let r=n.split("."),i=r.pop(),o=r.reduce((a,c)=>a[c]??={},t);o[i]=s}return t};var xe=[],Be=[],Pe=0,Me=0,We=0,Ue,j,Le=0,w=()=>{Pe++},x=()=>{--Pe||(mt(),J())},C=e=>{Ue=j,j=e},P=()=>{j=Ue,Ue=void 0},me=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},S=e=>{let t={fn_:e,flags_:2};j&&Ke(t,j),C(t),w();try{t.fn_()}finally{x(),P()}return yt.bind(0,t)},mt=()=>{for(;Me"getter"in e?gt(e):ht(e,e.value_),gt=e=>{C(e),vt(e);try{let t=e.value_;return t!==(e.value_=e.getter(t))}finally{P(),Et(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}},bt=(e,t)=>{if(t&16||t&32&&St(e.deps_,e)){C(e),vt(e),w();try{e.fn_()}finally{x(),P(),Et(e)}return}t&32&&(e.flags_=t&-33);let n=e.deps_;for(;n;){let s=n.dep_,r=s.flags_;r&64&&bt(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||mt()),!0}return!1}let n=e.value_;if(e.flags_&16&&ht(e,n)){let s=e.subs_;s&&Ce(s)}return j&&Ke(e,j),n},Kt=e=>{let t=e.flags_;if(t&16||t&32&&St(e.deps_,e)){if(gt(e)){let n=e.subs_;n&&Ce(n)}}else t&32&&(e.flags_=t&-33);return j&&Ke(e,j),e.value_},yt=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_,o=e.prevSub_;if(r?r.prevDep_=s:t.depsTail_=s,s?s.nextDep_=r:t.deps_=r,i?i.prevSub_=o:n.subsTail_=o,o)o.nextSub_=i;else if(!(n.subs_=i))if("getter"in n){let a=n.deps_;if(a){n.flags_=17;do a=Fe(a,n);while(a)}}else"previousValue"in n||yt(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 o=(e=i).nextSub_;o&&(n={value_:t,prev_:n},t=o);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},Et=e=>{let t=e.depsTail_,n=t?t.nextDep_:e.deps_;for(;n;)n=Fe(n,e);e.flags_&=-5},St=(e,t)=>{let n,s=0,r=!1;e:for(;;){let i=e.dep_,o=i.flags_;if(t.flags_&16)r=!0;else if((o&17)===17){if(dt(i)){let a=i.subs_;a.nextSub_&&Ce(a),r=!0}}else if((o&33)===33){(e.nextSub_||e.prevSub_)&&(n={value_:e,prev_:n}),e=i.deps_,t=i,++s;continue}if(!r){let a=e.nextDep_;if(a){e=a;continue}}for(;s--;){let a=t.subs_,c=a.nextSub_;if(c?(e=n.value_,n=n.prev_):e=a,r){if(dt(t)){c&&Ce(a),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=X,n=e.split(".");for(let s of n){if(t==null||!F(t,s))return;t=t[s]}return t},Ne=(e,t="")=>{let n=Array.isArray(e);if(n||U(e)){let s=n?[]:{};for(let i in e)s[i]=me(Ne(e[i],`${t+i}.`));let r=me(0);return new Proxy(s,{get(i,o){if(!(o==="toJSON"&&!F(s,o)))return n&&o in Array.prototype?(r(),s[o]):typeof o=="symbol"?s[o]:((!F(s,o)||s[o]()==null)&&(s[o]=me(""),J(t+o,""),r(r()+1)),s[o]())},set(i,o,a){let c=t+o;if(n&&o==="length"){let l=s[o]-a;if(s[o]=a,l>0){let u={};for(let d=a;d{if(e!==void 0&&t!==void 0&&xe.push([e,t]),!Pe&&xe.length){let n=we(xe);xe.length=0,document.dispatchEvent(new CustomEvent(Z,{detail:n}))}},O=(e,{ifMissing:t}={})=>{w();for(let n in e)e[n]==null?t||delete X[n]:Tt(e[n],n,X,"",t);x()},T=(e,t)=>O(we(e),t),Tt=(e,t,n,s,r)=>{if(U(e)){F(n,t)&&(U(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&&F(n,t)||(n[t]=e)},pt=e=>typeof e=="string"?RegExp(e.replace(/^\/|\/$/g,"")):e,D=({include:e=/.*/,exclude:t=/(?!)/}={},n=X)=>{let s=pt(e),r=pt(t),i=[],o=[[n,""]];for(;o.length;){let[a,c]=o.pop();for(let l in a){let u=c+l;U(a[l])?o.push([a[l],`${u}.`]):s.test(u)&&!r.test(u)&&i.push([u,oe(u)])}}return we(i)},X=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 _t=e=>ge(e).replace(/-/g,"_");var ae=e=>{try{return JSON.parse(e)}catch{return Function(`return (${e})`)()}},At={camel:e=>e.replace(/-[a-z]/g,t=>t[1].toUpperCase()),snake:e=>e.replace(/-/g,"_"),pascal:e=>e[0].toUpperCase()+At.camel(e.slice(1))},M=(e,t,n="camel")=>{for(let s of t.get("case")||[n])e=At[s]?.(e)||e;return e},G=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=_t(t),i=new URLSearchParams({metadata:JSON.stringify(n)}).toString(),o=JSON.stringify(n,null,2);return s.message=`${t} +More info: ${Yt}/${r}?${i} +Context: ${o}`,s},be=new Map,Qe=new Map,wt=new Map,xt=new Proxy({},{get:(e,t)=>be.get(t)?.apply,has:(e,t)=>be.has(t),ownKeys:()=>Reflect.ownKeys(be),set:()=>!1,deleteProperty:()=>!1}),ye=new Map,ke=[],Ze=new Set,Xt=new WeakSet,m=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()})},k=e=>{be.set(e.name,e)};document.addEventListener(q,(e=>{let t=wt.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=>{wt.set(e.name,e)},Rt=e=>{for(let t of e){let n=ye.get(t);if(n&&ye.delete(t))for(let s of n.values())for(let r of s.values())r()}},Mt=G("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 o of i)z(o)&&(Rt([o]),Rt(o.querySelectorAll("*")));for(let o of r)z(o)&&(De([o]),De(o.querySelectorAll("*")))}else if(n==="attributes"&&s.startsWith("data-")&&z(t)&&!Lt(t)){let o=s.slice(5),a=t.getAttribute(s);if(a===null){let c=ye.get(t);if(c){let l=c.get(o);if(l){for(let u of l.values())u();c.delete(o)}}}else Nt(t,o,a)}},nn=new MutationObserver(tn),sn=e=>{let[t,...n]=e.split("__"),[s,r]=t.split(/:(.+)/),i=new Map;for(let o of n){let[a,...c]=o.split(".");i.set(a,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:o,mods:a}=sn(r),c=Qe.get(i);if((!s||Ze.has(i))&&c){let l={el:e,rawKey:r,mods:a,error:he.bind(0,{plugin:{type:"attribute",name:c.name},element:{id:e.id,tag:e.tagName},expression:{rawKey:r,key:o,value:n}}),key:o,value:n,loadedPluginNames:{actions:new Set(be.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",b=o!=null&&o!=="",f=n!=null&&n!=="";if(b){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(b&&f)throw l.error("KeyAndValueProvided");if(!b&&!f)throw l.error("KeyOrValueRequired")}let p=new Map;if(f){let v;l.rx=(..._)=>(v||(v=on(n,{returnsValue:c.returnsValue,argNames:c.argNames,cleanups:p})),v(e,..._))}let h=c.apply(l);h&&p.set("attribute",h);let y=ye.get(e);if(y){let v=y.get(r);if(v)for(let _ of v.values())_()}else y=new Map,ye.set(e,y);y.set(r,p)}}},on=(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,o=RegExp(`(?:${je})(.*?)(?:${Ge})`,"gm"),a=0;for(let c of r.matchAll(o)){let l=c[1],u=`__escaped${a++}`;i.set(u,l),r=r.replace(je+l+Ge,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=(b,f,...p)=>{let h=he.bind(0,{plugin:{type:"action",name:b},element:{id:l.id,tag:l.tagName},expression:{fnContent:r,value:e}}),y=xt[b];if(y)return y({el:l,evt:f,error:h,cleanups:s},...p);throw h("UndefinedAction")};try{return c(l,X,d,void 0,...u)}catch(b){throw console.error(b),he({element:{id:l.id,tag:l.tagName},expression:{fnContent:r,value:e},error:b.message},"ExecuteExpression")}}}catch(c){throw console.error(c),he({expression:{fnContent:r,value:e},error:c.message},"GenerateExpression")}};k({name:"peek",apply(e,t){C();try{return t()}finally{P()}}});k({name:"setAll",apply(e,t,n){C();let s=D(n);Y(s,()=>t),O(s),P()}});k({name:"toggleAll",apply(e,t){C();let n=D(t);Y(n,s=>!s),O(n),P()}});var Ee=(e,t,n=!0)=>k({name:e,apply:async({el:s,evt:r,error:i,cleanups:o},a,{selector:c,headers:l,contentType:u="json",filterSignals:{include:d=/.*/,exclude:b=/(^|\.)_/}={},openWhenHidden:f=n,payload:p,requestCancellation:h="auto",retry:y="auto",retryInterval:v=1e3,retryScaler:_=2,retryMaxWaitMs:I=3e4,retryMaxCount:ne=10}={})=>{let de=h instanceof AbortController?h:new AbortController;h==="auto"&&(o.get(`@${e}`)?.(),o.set(`@${e}`,async()=>{de.abort(),await Promise.resolve()}));let H=null;try{if(!a?.length)throw i("FetchNoUrlProvided",{action:k});let V={Accept:"text/event-stream, text/html, application/json","Datastar-Request":!0};u==="json"&&(V["Content-Type"]="application/json");let _e=Object.assign({},V,l),se={method:t,headers:_e,openWhenHidden:f,retry:y,retryInterval:v,retryScaler:_,retryMaxWaitMs:I,retryMaxCount:ne,signal:de.signal,onopen:async g=>{g.status>=400&&ee(an,s,{status:g.status.toString()})},onmessage:g=>{if(!g.event.startsWith("datastar"))return;let B=g.event,E={};for(let A of g.data.split(` +`)){let R=A.indexOf(" "),W=A.slice(0,R),He=A.slice(R+1);(E[W]||=[]).push(He)}let N=Object.fromEntries(Object.entries(E).map(([A,R])=>[A,R.join(` +`)]));ee(B,s,N)},onerror:g=>{if(Ft(g))throw g("FetchExpectedTextEventStream",{url:a});g&&(console.error(g.message),ee(cn,s,{message:g.message}))}},re=new URL(a,document.baseURI),ie=new URLSearchParams(re.search);if(u==="json"){C(),p=p!==void 0?p:D({include:d,exclude:b}),P();let g=JSON.stringify(p);t==="GET"?ie.set("datastar",g):se.body=g}else if(u==="form"){let g=c?document.querySelector(c):s.closest("form");if(!g)throw i("FetchFormNotFound",{action:k,selector:c});if(!g.noValidate&&!g.checkValidity()){g.reportValidity();return}let B=new FormData(g),E=s;if(s===g&&r instanceof SubmitEvent)E=r.submitter;else{let R=W=>W.preventDefault();g.addEventListener("submit",R),H=()=>{g.removeEventListener("submit",R)}}if(E instanceof HTMLButtonElement){let R=E.getAttribute("name");R&&B.append(R,E.value)}let N=g.getAttribute("enctype")==="multipart/form-data";N||(_e["Content-Type"]="application/x-www-form-urlencoded");let A=new URLSearchParams(B);if(t==="GET")for(let[R,W]of A)ie.append(R,W);else N?se.body=B:se.body=A}else throw i("FetchInvalidContentType",{action:k,contentType:u});ee(Ye,s,{}),re.search=ie.toString();try{await mn(re.toString(),s,se)}catch(g){if(!Ft(g))throw i("FetchFailed",{method:t,url:a,error:g.message})}}finally{ee(Xe,s,{}),H?.(),o.delete(`@${e}`)}}});Ee("get","GET",!1);Ee("patch","PATCH");Ee("post","POST");Ee("put","PUT");Ee("delete","DELETE");var Ye="started",Xe="finished",an="error",cn="retrying",ln="retries-failed",ee=(e,t,n)=>document.dispatchEvent(new CustomEvent(q,{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=pn(t,i):(t=i,n=0,s=-1);let o=t.length,a=0;for(;n{let s=Ct(),r=new TextDecoder;return(i,o)=>{if(!i.length)n?.(s),s=Ct();else if(o>0){let a=r.decode(i.subarray(0,o)),c=o+(i[o+1]===32?2:1),l=r.decode(i.subarray(c));switch(a){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}}}}},pn=(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}),mn=(e,t,{signal:n,headers:s,onopen:r,onmessage:i,onclose:o,onerror:a,openWhenHidden:c,fetch:l,retry:u="auto",retryInterval:d=1e3,retryScaler:b=2,retryMaxWaitMs:f=3e4,retryMaxCount:p=10,responseOverrides:h,...y})=>new Promise((v,_)=>{let I={...s},ne,de=()=>{ne.abort(),document.hidden||g()};c||document.addEventListener("visibilitychange",de);let H,V=()=>{document.removeEventListener("visibilitychange",de),clearTimeout(H),ne.abort()};n?.addEventListener("abort",()=>{V(),v()});let _e=l||window.fetch,se=r||(()=>{}),re=0,ie=d,g=async()=>{ne=new AbortController;let B=ne.signal;try{let E=await _e(e,{...y,headers:I,signal:B});await se(E);let N=async($,pe,$e,Ae,...Jt)=>{let lt={[$e]:await pe.text()};for(let Ie of Jt){let qe=pe.headers.get(`datastar-${ge(Ie)}`);if(Ae){let Re=Ae[Ie];Re&&(qe=typeof Re=="string"?Re:JSON.stringify(Re))}qe&&(lt[Ie]=qe)}ee($,t,lt),V(),v()},A=E.status,R=A===204,W=A>=300&&A<400,He=A>=400&&A<600;if(A!==200){if(o?.(),u!=="never"&&!R&&!W&&(u==="always"||u==="error"&&He)){clearTimeout(H),H=setTimeout(g,d);return}V(),v();return}re=0,d=ie;let Ve=E.headers.get("Content-Type");if(Ve?.includes("text/html"))return await N("datastar-patch-elements",E,"elements",h,"selector","mode","namespace","useViewTransition","namespace");if(Ve?.includes("application/json"))return await N("datastar-patch-signals",E,"signals",h,"onlyIfMissing");if(Ve?.includes("text/javascript")){let $=document.createElement("script"),pe=E.headers.get("datastar-script-attributes");if(pe)for(let[$e,Ae]of Object.entries(JSON.parse(pe)))$.setAttribute($e,Ae);$.textContent=await E.text(),document.head.appendChild($),V();return}if(await un(E.body,fn(dn($=>{$?I["last-event-id"]=$:delete I["last-event-id"]},$=>{ie=d=$},i))),o?.(),u==="always"&&!W){clearTimeout(H),H=setTimeout(g,d);return}V(),v()}catch(E){if(!B.aborted)try{let N=a?.(E)||d;clearTimeout(H),H=setTimeout(g,N),d=Math.min(d*b,f),++re>=p?(ee(ln,t,{}),V(),_("Max retries reached.")):console.error(`Datastar failed to reach ${e.toString()} retrying in ${N}ms.`)}catch(N){V(),_(N)}}};g()});m({name:"attr",requirement:{value:"must"},returnsValue:!0,apply({el:e,key:t,rx:n}){let s=(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))},r=t?()=>{i.disconnect();let a=n();s(t,a),i.observe(e,{attributeFilter:[t]})}:()=>{i.disconnect();let a=n(),c=Object.keys(a);for(let l of c)s(l,a[l]);i.observe(e,{attributeFilter:c})},i=new MutationObserver(r),o=S(r);return()=>{i.disconnect(),o()}}});var gn=/^data:(?[^;]+);base64,(?.*)$/,Pt=Symbol("empty"),Ot=G("bind");m({name:"bind",requirement:"exclusive",apply({el:e,key:t,mods:n,value:s,error:r}){let i=t!=null?M(t,n):s,o=(f,p)=>p==="number"?+f.value:f.value,a=f=>{e.value=`${f}`};if(e instanceof HTMLInputElement)switch(e.type){case"range":case"number":o=(f,p)=>p==="string"?f.value:+f.value;break;case"checkbox":o=(f,p)=>f.value!=="on"?p==="boolean"?f.checked:f.checked?f.value:"":p==="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",i),o=(f,p)=>f.checked?p==="number"?+f.value:f.value:Pt,a=f=>{e.checked=f===(typeof f=="number"?+e.value:e.value)};break;case"file":{let f=()=>{let p=[...e.files||[]],h=[];Promise.all(p.map(y=>new Promise(v=>{let _=new FileReader;_.onload=()=>{if(typeof _.result!="string")throw r("InvalidFileResultType",{resultType:typeof _.result});let I=_.result.match(gn);if(!I?.groups)throw r("InvalidDataUri",{result:_.result});h.push({name:y.name,contents:I.groups.contents,mime:I.groups.mime})},_.onloadend=()=>v(),_.readAsDataURL(y)}))).then(()=>{T([[i,h]])})};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;o=p=>[...p.selectedOptions].map(h=>{let y=f.get(h.value);return y==="string"||y==null?h.value:+h.value}),a=p=>{for(let h of e.options)p.includes(h.value)?(f.set(h.value,"string"),h.selected=!0):p.includes(+h.value)?(f.set(h.value,"number"),h.selected=!0):h.selected=!1}}}else e instanceof HTMLTextAreaElement||(o=f=>"value"in f?f.value:f.getAttribute("value"),a=f=>{"value"in e?e.value=f:e.setAttribute("value",f)});let c=oe(i),l=typeof c,u=i;if(Array.isArray(c)&&!(e instanceof HTMLSelectElement&&e.multiple)){let f=t||s,p=document.querySelectorAll(`[${Ot}\\:${CSS.escape(f)}],[${Ot}="${CSS.escape(f)}"]`),h=[],y=0;for(let v of p){if(h.push([`${u}.${y}`,o(v,"none")]),e===v)break;y++}T(h,{ifMissing:!0}),u=`${u}.${y}`}else T([[u,o(e,l)]],{ifMissing:!0});let d=()=>{let f=oe(u);if(f!=null){let p=o(e,typeof f);p!==Pt&&T([[u,p]])}};e.addEventListener("input",d),e.addEventListener("change",d);let b=S(()=>{a(oe(u))});return()=>{b(),e.removeEventListener("input",d),e.removeEventListener("change",d)}}});m({name:"class",requirement:{value:"must"},returnsValue:!0,apply({key:e,el:t,mods:n,rx:s}){e&&=M(e,n,"kebab");let r,i=()=>{o.disconnect(),r=e?{[e]:s()}:s();for(let c in r){let l=c.split(/\s+/).filter(u=>u.length>0);if(r[c])for(let u of l)t.classList.contains(u)||t.classList.add(u);else for(let u of l)t.classList.contains(u)&&t.classList.remove(u)}o.observe(t,{attributeFilter:["class"]})},o=new MutationObserver(i),a=S(i);return()=>{o.disconnect(),a();for(let c in r){let l=c.split(/\s+/).filter(u=>u.length>0);for(let u of l)t.classList.remove(u)}}}});m({name:"computed",requirement:{value:"must"},returnsValue:!0,apply({key:e,mods:t,rx:n,error:s}){if(e)T([[M(e,t),Oe(n)]]);else{let r=Object.assign({},n());Y(r,i=>{if(typeof i=="function")return Oe(i);throw s("ComputedExpectedFunction")}),O(r)}}});m({name:"effect",requirement:{key:"denied",value:"must"},apply:({rx:e})=>S(e)});m({name:"indicator",requirement:"exclusive",apply({el:e,key:t,mods:n,value:s}){let r=t!=null?M(t,n):s;T([[r,!1]]);let i=(o=>{let{type:a,el:c}=o.detail;if(c===e)switch(a){case Ye:T([[r,!0]]);break;case Xe:T([[r,!1]]);break}});return document.addEventListener(q,i),()=>{T([[r,!1]]),document.removeEventListener(q,i)}}});var K=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)},kt=(e,t,n=!0,s=!1,r=!1)=>{let i=null,o=0;return(...a)=>{n&&!o?(e(...a),i=null):i=a,(!o||r)&&(o&&clearTimeout(o),o=setTimeout(()=>{s&&i!==null&&e(...i),i=null,o=0},t))}},ce=(e,t)=>{let n=t.get("delay");if(n){let i=K(n);e=et(e,i)}let s=t.get("debounce");if(s){let i=K(s),o=te(s,"leading",!1),a=!te(s,"notrailing",!1);e=kt(e,i,o,a,!0)}let r=t.get("throttle");if(r){let i=K(r),o=!te(r,"noleading",!1),a=te(r,"trailing",!1);e=kt(e,i,o,a)}return e};var tt=!!document.startViewTransition,Q=(e,t)=>{if(t.has("viewtransition")&&tt){let n=e;e=(...s)=>document.startViewTransition(()=>n(...s))}return e};m({name:"init",requirement:{key:"denied",value:"must"},apply({rx:e,mods:t}){let n=()=>{w(),e(),x()};n=Q(n,t);let s=0,r=t.get("delay");r&&(s=K(r),s>0&&(n=et(n,s))),n()}});m({name:"json-signals",requirement:{key:"denied"},apply({el:e,value:t,mods:n}){let s=n.has("terse")?0:2,r={};t&&(r=ae(t));let i=()=>{o.disconnect(),e.textContent=JSON.stringify(D(r),null,s),o.observe(e,{childList:!0,characterData:!0,subtree:!0})},o=new MutationObserver(i),a=S(i);return()=>{o.disconnect(),a()}}});m({name:"on",requirement:"must",argNames:["evt"],apply({el:e,key:t,mods:n,rx:s}){let r=e;n.has("window")&&(r=window);let i=c=>{c&&(n.has("prevent")&&c.preventDefault(),n.has("stop")&&c.stopPropagation()),w(),s(c),x()};i=Q(i,n),i=ce(i,n);let o={capture:n.has("capture"),passive:n.has("passive"),once:n.has("once")};if(n.has("outside")){r=document;let c=i;i=l=>{e.contains(l?.target)||c(l)}}let a=M(t,n,"kebab");if((a===q||a===Z)&&(r=document),e instanceof HTMLFormElement&&a==="submit"){let c=i;i=l=>{l?.preventDefault(),c(l)}}return r.addEventListener(a,i,o),()=>{r.removeEventListener(a,i)}}});var Dt=(e,t,n)=>Math.max(t,Math.min(n,e));var nt=new WeakSet;m({name:"on-intersect",requirement:{key:"denied",value:"must"},apply({el:e,mods:t,rx:n}){let s=()=>{w(),n(),x()};s=Q(s,t),s=ce(s,t);let r={threshold:0};t.has("full")?r.threshold=1:t.has("half")?r.threshold=.5:t.get("threshold")&&(r.threshold=Dt(Number(t.get("threshold")),0,100)/100);let i=t.has("exit"),o=new IntersectionObserver(a=>{for(let c of a)c.isIntersecting!==i&&(s(),o&&nt.has(e)&&o.disconnect())},r);return o.observe(e),t.has("once")&&nt.add(e),()=>{t.has("once")||nt.delete(e),o&&(o.disconnect(),o=null)}}});m({name:"on-interval",requirement:{key:"denied",value:"must"},apply({mods:e,rx:t}){let n=()=>{w(),t(),x()};n=Q(n,e);let s=1e3,r=e.get("duration");r&&(s=K(r),te(r,"leading",!1)&&n());let i=setInterval(n,s);return()=>{clearInterval(i)}}});m({name:"on-signal-patch",requirement:{value:"must"},argNames:["patch"],returnsValue:!0,apply({el:e,key:t,mods:n,rx:s,error:r}){if(t&&t!=="filter")throw r("KeyNotAllowed");let i=G(`${this.name}-filter`),o=e.getAttribute(i),a={};o&&(a=ae(o));let c=!1,l=ce(u=>{if(c)return;let d=D(a,u.detail);if(!ft(d)){c=!0,w();try{s(d)}finally{x(),c=!1}}},n);return document.addEventListener(Z,l),()=>{document.removeEventListener(Z,l)}}});m({name:"ref",requirement:"exclusive",apply({el:e,key:t,mods:n,value:s}){let r=t!=null?M(t,n):s;T([[r,e]])}});var Ht="none",Vt="display";m({name:"show",requirement:{key:"denied",value:"must"},returnsValue:!0,apply({el:e,rx:t}){let n=()=>{s.disconnect(),t()?e.style.display===Ht&&e.style.removeProperty(Vt):e.style.setProperty(Vt,Ht),s.observe(e,{attributeFilter:["style"]})},s=new MutationObserver(n),r=S(n);return()=>{s.disconnect(),r()}}});m({name:"signals",returnsValue:!0,apply({key:e,mods:t,rx:n}){let s=t.has("ifmissing");if(e)e=M(e,t),T([[e,n?.()]],{ifMissing:s});else{let r=Object.assign({},n?.());O(r,{ifMissing:s})}}});m({name:"style",requirement:{value:"must"},returnsValue:!0,apply({key:e,el:t,rx:n}){let{style:s}=t,r=new Map,i=(l,u)=>{let d=r.get(l);!u&&u!==0?d!==void 0&&(d?s.setProperty(l,d):s.removeProperty(l)):(d===void 0&&r.set(l,s.getPropertyValue(l)),s.setProperty(l,String(u)))},o=()=>{if(a.disconnect(),e)i(e,n());else{let l=n();for(let[u,d]of r)u in l||(d?s.setProperty(u,d):s.removeProperty(u));for(let u in l)i(ge(u),l[u])}a.observe(t,{attributeFilter:["style"]})},a=new MutationObserver(o),c=S(o);return()=>{a.disconnect(),c();for(let[l,u]of r)u?s.setProperty(l,u):s.removeProperty(l)}}});m({name:"text",requirement:{key:"denied",value:"must"},returnsValue:!0,apply({el:e,rx:t}){let n=()=>{s.disconnect(),e.textContent=`${t()}`,s.observe(e,{childList:!0,characterData:!0,subtree:!0})},s=new MutationObserver(n),r=S(n);return()=>{s.disconnect(),r()}}});var $t=(e,t)=>e.includes(t),hn=["remove","outer","inner","replace","prepend","append","before","after"],bn=["html","svg","mathml"];ve({name:"datastar-patch-elements",apply(e,{selector:t="",mode:n="outer",namespace:s="html",useViewTransition:r="",elements:i=""}){if(!$t(hn,n))throw e.error("PatchElementsInvalidMode",{mode:n});if(!t&&n!=="outer"&&n!=="replace")throw e.error("PatchElementsExpectedSelector");if(!$t(bn,s))throw e.error("PatchElementsInvalidNamespace",{namespace:s});let o={selector:t,mode:n,namespace:s,useViewTransition:r.trim()==="true",elements:i};tt&&r?document.startViewTransition(()=>It(e,o)):It(e,o)}});var It=({error:e},{selector:t,mode:n,namespace:s,elements:r})=>{let i=r.replace(/]*>|>)([\s\S]*?)<\/svg>/gim,""),o=/<\/html>/.test(i),a=/<\/head>/.test(i),c=/<\/body>/.test(i),l=s==="svg"?"svg":s==="mathml"?"math":"",u=l?`<${l}>${r}`:r,d=new DOMParser().parseFromString(o||a||c?r:``,"text/html"),b=document.createDocumentFragment();if(o)b.appendChild(d.documentElement);else if(a&&c)b.appendChild(d.head),b.appendChild(d.body);else if(a)b.appendChild(d.head);else if(c)b.appendChild(d.body);else if(l){let f=d.querySelector("template").content.querySelector(l);for(let p of f.childNodes)b.appendChild(p)}else b=d.querySelector("template").content;if(!t&&(n==="outer"||n==="replace"))for(let f of b.children){let p;if(f instanceof HTMLHtmlElement)p=document.documentElement;else if(f instanceof HTMLBodyElement)p=document.body;else if(f instanceof HTMLHeadElement)p=document.head;else if(p=document.getElementById(f.id),!p){console.warn(e("PatchElementsNoTargetsFound"),{element:{id:f.id}});continue}jt(n,f,[p])}else{let f=document.querySelectorAll(t);if(!f.length){console.warn(e("PatchElementsNoTargetsFound"),{selector:t});return}jt(n,b,f)}},rt=new WeakSet;for(let e of document.querySelectorAll("script"))rt.add(e);var Bt=e=>{let t=e instanceof HTMLScriptElement?[e]:e.querySelectorAll("script");for(let n of t)if(!rt.has(n)){let s=document.createElement("script");for(let{name:r,value:i}of n.attributes)s.setAttribute(r,i);s.text=n.text,n.replaceWith(s),rt.add(s)}},qt=(e,t,n)=>{for(let s of e){let r=t.cloneNode(!0);Bt(r),s[n](r)}},jt=(e,t,n)=>{switch(e){case"remove":for(let s of n)s.remove();break;case"outer":case"inner":for(let s of n)vn(s,t.cloneNode(!0),e),Bt(s);break;case"replace":qt(n,t,"replaceWith");break;case"prepend":case"append":case"before":case"after":qt(n,t,e)}},L=new Map,ue=new Set,le=new Map,Se=new Set,fe=document.createElement("div");fe.hidden=!0;var it=new WeakSet,ot=[],Te=G("ignore-morph"),yn=`[${Te}]`,vn=(e,t,n="outer")=>{if(z(e)&&z(t)&&e.hasAttribute(Te)&&t.hasAttribute(Te)||e.parentElement?.closest(yn))return;let s=document.createElement("div");s.append(t),document.body.insertAdjacentElement("afterend",fe);let r=e.querySelectorAll("[id]");for(let{id:c,tagName:l}of r)le.has(c)?Se.add(c):c&&le.set(c,l);e instanceof Element&&e.id&&(le.has(e.id)?Se.add(e.id):le.set(e.id,e.tagName)),ue.clear();let i=s.querySelectorAll("[id]");for(let{id:c,tagName:l}of i)ue.has(c)?Se.add(c):le.get(c)===l&&ue.add(c);for(let c of Se)ue.delete(c);le.clear(),Se.clear(),L.clear();let o=n==="outer"?e.parentElement:e;Gt(o,r),Gt(s,i),it=new WeakSet,ot=[];let a=document.activeElement;for(;a!==e&&a;)ot.push(a),a=a.parentElement;Wt(o,s,n==="outer"?e:null,e.nextSibling),fe.remove()},Wt=(e,t,n=null,s=null)=>{e instanceof HTMLTemplateElement&&t instanceof HTMLTemplateElement&&(e=e.content,t=t.content),n??=e.firstChild;for(let r of t.childNodes){if(n&&n!==s){let i=En(r,n,s);if(i){i!==n&&Tn(e,n,i,s,r),st(i,r),n=i.nextSibling;continue}}if(r instanceof Element&&ue.has(r.id)){let i=document.getElementById(r.id),o=i;for(;o=o.parentNode;){let a=L.get(o);a&&(a.delete(r.id),a.size||L.delete(o))}ct(e,i,n),st(i,r),n=i.nextSibling;continue}if(L.has(r)){let i=r.namespaceURI,o=r.tagName,a=i&&i!=="http://www.w3.org/1999/xhtml"?document.createElementNS(i,o):document.createElement(o);e.insertBefore(a,n),st(a,r),n=a.nextSibling}else{let i=document.importNode(r,!0);e.insertBefore(i,n),n=i.nextSibling}}for(;n&&n!==s;){let r=n;n=n.nextSibling,at(r)}},Ut=(e,t,n=5)=>{if(it.has(e))return!0;for(let s=t.nextSibling,r=0;s&&r{if(e.nodeType!==1)return t?.nodeType===e.nodeType?t:null;let s=null,r=0,i=L.get(e)?.size||0,o=10,a=t;for(;a&&a!==n;){if(Sn(a,e)){let c=L.get(a),l=L.get(e);if(l&&c){for(let u of c)if(l.has(u))return a}if(!L.has(a)){if(o>0&&a.isEqualNode(e))return a;s||(s=a)}}if(r+=L.get(a)?.size||0,r>i||ot.includes(a)||--o<1&&!i)break;a=a.nextSibling}return s&&Ut(s,e)?null:s},Sn=(e,t)=>e.nodeType===t.nodeType&&e.tagName===t.tagName&&(!e.id||e.id===t.id),at=e=>{L.has(e)?ct(fe,e,null):e.parentNode?.removeChild(e)},Tn=(e,t,n,s,r)=>{let i=t;for(;i&&i!==n;){let o=i;i=i.nextSibling,o instanceof Element&&(L.has(o)||Ut(o,r,5))?ct(e,o,s):at(o)}},ct=at.call.bind(fe.moveBefore??fe.insertBefore),_n=G("preserve-attr"),st=(e,t)=>{let n=t.nodeType;if(n===1){let s=e,r=t,i=s.hasAttribute("data-scope-children");if(s.hasAttribute(Te)&&r.hasAttribute(Te))return e;s instanceof HTMLInputElement&&r instanceof HTMLInputElement&&r.type!=="file"?r.getAttribute("value")!==s.getAttribute("value")&&(s.value=r.getAttribute("value")??""):s instanceof HTMLTextAreaElement&&r instanceof HTMLTextAreaElement&&(r.value!==s.value&&(s.value=r.value),s.firstChild&&s.firstChild.nodeValue!==r.value&&(s.firstChild.nodeValue=r.value));let o=(t.getAttribute(_n)??"").split(" ");for(let{name:a,value:c}of r.attributes)s.getAttribute(a)!==c&&!o.includes(a)&&s.setAttribute(a,c);for(let a=s.attributes.length-1;a>=0;a--){let{name:c}=s.attributes[a];!r.hasAttribute(c)&&!o.includes(c)&&s.removeAttribute(c)}i&&!s.hasAttribute("data-scope-children")&&s.setAttribute("data-scope-children",""),s.isEqualNode(r)||Wt(s,r),i&&s.dispatchEvent(new CustomEvent("datastar:scope-children",{bubbles:!1}))}return(n===8||n===3)&&e.nodeValue!==t.nodeValue&&(e.nodeValue=t.nodeValue),e},Gt=(e,t)=>{for(let n of t)if(ue.has(n.id)){let s=n;for(;s&&s!==e;){let r=L.get(s);r||(r=new Set,L.set(s,r)),r.add(n.id),s=s.parentElement}}};ve({name:"datastar-patch-signals",apply({error:e},{signals:t,onlyIfMissing:n}){if(t){let s=n?.trim()==="true";O(ae(t),{ifMissing:s})}else throw e("PatchSignalsExpectedSignals")}});export{k as action,xt as actions,m as attribute,w as beginBatch,Oe as computed,S as effect,x as endBatch,D as filtered,oe as getPath,O as mergePatch,T as mergePaths,X as root,me as signal,C as startPeeking,P as stopPeeking,ve as watcher}; //# sourceMappingURL=datastar.js.map diff --git a/bundles/datastar.js.map b/bundles/datastar.js.map index 09386be4..8ec5e0af 100644 --- a/bundles/datastar.js.map +++ b/bundles/datastar.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../library/src/engine/consts.ts", "../library/src/utils/polyfills.ts", "../library/src/utils/paths.ts", "../library/src/engine/signals.ts", "../library/src/utils/dom.ts", "../library/src/utils/text.ts", "../library/src/engine/engine.ts", "../library/src/plugins/actions/peek.ts", "../library/src/plugins/actions/setAll.ts", "../library/src/plugins/actions/toggleAll.ts", "../library/src/plugins/actions/fetch.ts", "../library/src/plugins/attributes/attr.ts", "../library/src/plugins/attributes/bind.ts", "../library/src/plugins/attributes/class.ts", "../library/src/plugins/attributes/computed.ts", "../library/src/plugins/attributes/effect.ts", "../library/src/plugins/attributes/indicator.ts", "../library/src/utils/tags.ts", "../library/src/utils/timing.ts", "../library/src/utils/view-transitions.ts", "../library/src/plugins/attributes/init.ts", "../library/src/plugins/attributes/jsonSignals.ts", "../library/src/plugins/attributes/on.ts", "../library/src/utils/math.ts", "../library/src/plugins/attributes/onIntersect.ts", "../library/src/plugins/attributes/onInterval.ts", "../library/src/plugins/attributes/onSignalPatch.ts", "../library/src/plugins/attributes/ref.ts", "../library/src/plugins/attributes/show.ts", "../library/src/plugins/attributes/signals.ts", "../library/src/plugins/attributes/style.ts", "../library/src/plugins/attributes/text.ts", "../library/src/plugins/watchers/patchElements.ts", "../library/src/plugins/watchers/patchSignals.ts"], - "sourcesContent": ["const lol = /\uD83D\uDD95JS_DS\uD83D\uDE80/.source\nexport const DSP = lol.slice(0, 5)\nexport const DSS = lol.slice(4)\nexport const DATASTAR_FETCH_EVENT = 'datastar-fetch'\nexport const DATASTAR_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", "// Icon: ion:eye\n// Slug: Access signals without subscribing to changes.\n// Description: Allows accessing signals without subscribing to their changes in expressions.\n\nimport { action } from '@engine'\nimport { startPeeking, stopPeeking } from '@engine/signals'\n\naction({\n name: 'peek',\n apply(_, fn: () => any) {\n startPeeking()\n try {\n return fn()\n } finally {\n stopPeeking()\n }\n },\n})\n", "// Icon: ion:checkmark-round\n// Slug: Sets the value of all matching signals.\n// Description: Sets the value of all matching signals (or all signals if no filter is used) to the expression provided in the first argument.\n\nimport { action } from '@engine'\nimport {\n filtered,\n mergePatch,\n startPeeking,\n stopPeeking,\n} from '@engine/signals'\nimport type { SignalFilterOptions } from '@engine/types'\nimport { updateLeaves } from '@utils/paths'\n\naction({\n name: 'setAll',\n apply(_, value: any, filter: SignalFilterOptions) {\n // peek because in an effect you would be subscribing to signals and then setting them which\n // would cause an infinite loop and why would you want to infinite loop on purpose\n startPeeking()\n const masked = filtered(filter)\n updateLeaves(masked, () => value)\n mergePatch(masked)\n stopPeeking()\n },\n})\n", "// Icon: material-symbols:toggle-off\n// Slug: Toggles the value of all matching signals.\n// Description: Toggles the boolean value of all matching signals (or all signals if no filter is used).\n\nimport { action } from '@engine'\nimport {\n filtered,\n mergePatch,\n startPeeking,\n stopPeeking,\n} from '@engine/signals'\nimport type { SignalFilterOptions } from '@engine/types'\nimport { updateLeaves } from '@utils/paths'\n\naction({\n name: 'toggleAll',\n apply(_, filter: SignalFilterOptions) {\n // peek because in an effect you would be subscribing to signals and then setting them which\n // would cause an infinite loop and why would you want to infinite loop on purpose\n startPeeking()\n const masked = filtered(filter)\n updateLeaves(masked, (oldValue: any) => !oldValue)\n mergePatch(masked)\n stopPeeking()\n },\n})\n", "// Icon: ion:eye\n// Slug: Access signals without subscribing to changes.\n// Description: Allows accessing signals without subscribing to their changes in expressions.\n\nimport { action } from '@engine'\nimport { DATASTAR_FETCH_EVENT } from '@engine/consts'\nimport { filtered, startPeeking, stopPeeking } from '@engine/signals'\nimport type {\n DatastarFetchEvent,\n HTMLOrSVG,\n SignalFilterOptions,\n} from '@engine/types'\nimport { kebab } from '@utils/text'\n\nconst createHttpMethod = (\n name: string,\n method: string,\n openWhenHiddenDefault: boolean = true,\n): void =>\n action({\n name,\n apply: async (\n { el, evt, error, cleanups },\n url: string,\n {\n selector,\n headers: userHeaders,\n contentType = 'json',\n filterSignals: { include = /.*/, exclude = /(^|\\.)_/ } = {},\n openWhenHidden = openWhenHiddenDefault,\n payload,\n requestCancellation = 'auto',\n retry = 'auto',\n retryInterval = 1_000,\n retryScaler = 2,\n retryMaxWaitMs = 30_000,\n retryMaxCount = 10,\n }: FetchArgs = {},\n ) => {\n const controller =\n requestCancellation instanceof AbortController\n ? requestCancellation\n : new AbortController()\n if (requestCancellation === 'auto') {\n cleanups.get(`@${name}`)?.()\n cleanups.set(`@${name}`, async () => {\n controller.abort()\n // wait one tick for FINISHED to fire\n await Promise.resolve()\n })\n }\n\n let cleanupFn = null\n\n try {\n if (!url?.length) {\n throw error('FetchNoUrlProvided', { action })\n }\n\n const initialHeaders: Record = {\n Accept: 'text/event-stream, text/html, application/json',\n 'Datastar-Request': true,\n }\n if (contentType === 'json') {\n initialHeaders['Content-Type'] = 'application/json'\n }\n const headers = Object.assign({}, initialHeaders, userHeaders)\n\n // We ignore the content-type header if using form data\n // if missing the boundary will be set automatically\n\n const req: FetchEventSourceInit = {\n method,\n headers,\n openWhenHidden,\n retry,\n retryInterval,\n retryScaler,\n retryMaxWaitMs,\n retryMaxCount,\n signal: controller.signal,\n onopen: async (response: Response) => {\n if (response.status >= 400)\n dispatchFetch(ERROR, el, { status: response.status.toString() })\n },\n onmessage: (evt) => {\n if (!evt.event.startsWith('datastar')) return\n const type = evt.event\n const argsRawLines: Record = {}\n\n for (const line of evt.data.split('\\n')) {\n const i = line.indexOf(' ')\n const k = line.slice(0, i)\n const v = line.slice(i + 1)\n ;(argsRawLines[k] ||= []).push(v)\n }\n\n const argsRaw = Object.fromEntries(\n Object.entries(argsRawLines).map(([k, v]) => [k, v.join('\\n')]),\n )\n\n dispatchFetch(type, el, argsRaw)\n },\n onerror: (error) => {\n if (isWrongContent(error)) {\n // don't retry if the content-type is wrong\n throw error('FetchExpectedTextEventStream', { url })\n }\n // do nothing and it will retry\n if (error) {\n console.error(error.message)\n dispatchFetch(RETRYING, el, { message: error.message })\n }\n },\n }\n\n const urlInstance = new URL(url, document.baseURI)\n const queryParams = new URLSearchParams(urlInstance.search)\n\n if (contentType === 'json') {\n startPeeking()\n payload =\n payload !== undefined ? payload : filtered({ include, exclude })\n stopPeeking()\n const body = JSON.stringify(payload)\n if (method === 'GET') {\n queryParams.set('datastar', body)\n } else {\n req.body = body\n }\n } else if (contentType === 'form') {\n const formEl = (\n selector ? document.querySelector(selector) : el.closest('form')\n ) as HTMLFormElement\n if (!formEl) {\n throw error('FetchFormNotFound', { action, selector })\n }\n\n // Validate the form\n if (!formEl.noValidate && !formEl.checkValidity()) {\n formEl.reportValidity()\n return\n }\n\n // Collect the form data\n const formData = new FormData(formEl)\n let submitter = el as HTMLElement | null\n\n if (el === formEl && evt instanceof SubmitEvent) {\n // Get the submitter from the event\n submitter = evt.submitter\n } else {\n // Prevent the form being submitted\n const preventDefault = (evt: Event) => evt.preventDefault()\n formEl.addEventListener('submit', preventDefault)\n cleanupFn = () => {\n formEl.removeEventListener('submit', preventDefault)\n }\n }\n\n // Append the value of the form submitter if it is a button with a name\n if (submitter instanceof HTMLButtonElement) {\n const name = submitter.getAttribute('name')\n if (name) formData.append(name, submitter.value)\n }\n\n const multipart =\n formEl.getAttribute('enctype') === 'multipart/form-data'\n // Leave the `Content-Type` header empty for multipart encoding so the browser can set it automatically with the correct boundary\n if (!multipart) {\n headers['Content-Type'] = 'application/x-www-form-urlencoded'\n }\n\n const formParams = new URLSearchParams(formData as any)\n if (method === 'GET') {\n for (const [key, value] of formParams) {\n queryParams.append(key, value)\n }\n } else if (multipart) {\n req.body = formData\n } else {\n req.body = formParams\n }\n } else {\n throw error('FetchInvalidContentType', { action, contentType })\n }\n\n dispatchFetch(STARTED, el, {})\n urlInstance.search = queryParams.toString()\n\n try {\n await fetchEventSource(urlInstance.toString(), el, req)\n } catch (e: any) {\n if (!isWrongContent(e)) {\n throw error('FetchFailed', { method, url, error: e.message })\n }\n // exit gracefully and do nothing if the content-type is wrong\n // this can happen if the client is sending a request\n // where no response is expected, and they haven\u2019t\n // set the content-type to text/event-stream\n }\n } finally {\n dispatchFetch(FINISHED, el, {})\n cleanupFn?.()\n cleanups.delete(`@${name}`)\n }\n },\n })\n\ncreateHttpMethod('get', 'GET', false)\ncreateHttpMethod('patch', 'PATCH')\ncreateHttpMethod('post', 'POST')\ncreateHttpMethod('put', 'PUT')\ncreateHttpMethod('delete', 'DELETE')\n\nexport const STARTED = 'started'\nexport const FINISHED = 'finished'\nexport const ERROR = 'error'\nexport const RETRYING = 'retrying'\nexport const RETRIES_FAILED = 'retries-failed'\n\nconst dispatchFetch = (\n type: string,\n el: HTMLOrSVG,\n argsRaw: Record,\n) =>\n document.dispatchEvent(\n new CustomEvent(DATASTAR_FETCH_EVENT, {\n detail: { type, el, argsRaw },\n }),\n )\n\nconst isWrongContent = (err: any) => `${err}`.includes('text/event-stream')\n\ntype ResponseOverrides =\n | {\n selector?: string\n mode?: string\n namespace?: string\n useViewTransition?: boolean\n }\n | {\n onlyIfMissing?: boolean\n }\n\nexport type FetchArgs = {\n selector?: string\n headers?: Record\n contentType?: 'json' | 'form'\n filterSignals?: SignalFilterOptions\n openWhenHidden?: boolean\n payload?: any\n requestCancellation?: 'auto' | 'disabled' | AbortController\n responseOverrides?: ResponseOverrides\n retry?: 'auto' | 'error' | 'always' | 'never'\n retryInterval?: number\n retryScaler?: number\n retryMaxWaitMs?: number\n retryMaxCount?: number\n}\n\n// Below originally from https://github.com/Azure/fetch-event-source/blob/main/LICENSE\n\n/**\n * Represents a message sent in an event stream\n * https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#Event_stream_format\n */\n\ninterface EventSourceMessage {\n id: string\n event: string\n data: string\n retry?: number\n}\n\n/**\n * Converts a ReadableStream into a callback pattern.\n * @param stream The input ReadableStream.\n * @param onChunk A function that will be called on each new byte chunk in the stream.\n * @returns {Promise} A promise that will be resolved when the stream closes.\n */\nconst getBytes = async (\n stream: ReadableStream,\n onChunk: (arr: Uint8Array) => void,\n): Promise => {\n const reader = stream.getReader()\n let result = await reader.read()\n while (!result.done) {\n onChunk(result.value)\n result = await reader.read()\n }\n}\n\nconst getLines = (onLine: (line: Uint8Array, fieldLength: number) => void) => {\n let buffer: Uint8Array | undefined\n let position: number // current read position\n let fieldLength: number // length of the `field` portion of the line\n let discardTrailingNewline = false\n\n // return a function that can process each incoming byte chunk:\n return (arr: Uint8Array) => {\n if (!buffer) {\n buffer = arr\n position = 0\n fieldLength = -1\n } else {\n // we're still parsing the old line. Append the new bytes into buffer:\n buffer = concat(buffer, arr)\n }\n\n const bufLength = buffer.length\n let lineStart = 0 // index where the current line starts\n while (position < bufLength) {\n if (discardTrailingNewline) {\n if (buffer[position] === 10) lineStart = ++position // skip to next char\n discardTrailingNewline = false\n }\n\n // start looking forward till the end of line:\n let lineEnd = -1 // index of the \\r or \\n char\n for (; position < bufLength && lineEnd === -1; ++position) {\n switch (buffer[position]) {\n case 58: // :\n if (fieldLength === -1) {\n // first colon in line\n fieldLength = position - lineStart\n }\n break\n // @ts-expect-error:7029 \\r case below should fallthrough to \\n:\n // biome-ignore lint/suspicious/noFallthroughSwitchClause: intentional fallthrough for CR to LF\n case 13: // \\r\n discardTrailingNewline = true\n case 10: // \\n\n lineEnd = position\n break\n }\n }\n\n if (lineEnd === -1) break // Wait for the next arr and then continue parsing\n\n // we've reached the line end, send it out:\n onLine(buffer.subarray(lineStart, lineEnd), fieldLength)\n lineStart = position // we're now on the next line\n fieldLength = -1\n }\n\n if (lineStart === bufLength)\n buffer = undefined // we've finished reading it\n else if (lineStart) {\n // Create a new view into buffer beginning at lineStart so we don't\n // need to copy over the previous lines when we get the new arr:\n buffer = buffer.subarray(lineStart)\n position -= lineStart\n }\n }\n}\n\nconst getMessages = (\n onId: (id: string) => void,\n onRetry: (retry: number) => void,\n onMessage?: (msg: EventSourceMessage) => void,\n): ((line: Uint8Array, fieldLength: number) => void) => {\n let message = newMessage()\n const decoder = new TextDecoder()\n\n // return a function that can process each incoming line buffer:\n return (line, fieldLength) => {\n if (!line.length) {\n // empty line denotes end of message. Trigger the callback and start a new message:\n onMessage?.(message)\n message = newMessage()\n } else if (fieldLength > 0) {\n // exclude comments and lines with no values\n // line is of format \":\" or \": \"\n // https://html.spec.whatwg.org/multipage/server-sent-events.html#event-stream-interpretation\n const field = decoder.decode(line.subarray(0, fieldLength))\n const valueOffset = fieldLength + (line[fieldLength + 1] === 32 ? 2 : 1)\n const value = decoder.decode(line.subarray(valueOffset))\n\n switch (field) {\n case 'data':\n message.data = message.data ? `${message.data}\\n${value}` : value\n break\n case 'event':\n message.event = value\n break\n case 'id':\n onId((message.id = value))\n break\n case 'retry': {\n const retry = +value\n if (!Number.isNaN(retry)) {\n // per spec, ignore non-integers\n onRetry((message.retry = retry))\n }\n break\n }\n }\n }\n }\n}\n\nconst concat = (a: Uint8Array, b: Uint8Array) => {\n const res = new Uint8Array(a.length + b.length)\n res.set(a)\n res.set(b, a.length)\n return res\n}\n\nconst newMessage = (): EventSourceMessage => ({\n // data, event, and id must be initialized to empty strings:\n // https://html.spec.whatwg.org/multipage/server-sent-events.html#event-stream-interpretation\n // retry should be initialized to undefined so we return a consistent shape\n // to the js engine all the time: https://mathiasbynens.be/notes/shapes-ics#takeaways\n data: '',\n event: '',\n id: '',\n retry: undefined,\n})\n\ntype FetchEventSourceInit = RequestInit & {\n headers?: Record\n onopen?: (response: Response) => Promise\n onmessage?: (ev: EventSourceMessage) => void\n onclose?: () => void\n onerror?: (err: any) => number | null | undefined | void\n openWhenHidden?: boolean\n fetch?: typeof fetch\n retry?: 'auto' | 'error' | 'always' | 'never'\n retryInterval?: number\n retryScaler?: number\n retryMaxWaitMs?: number\n retryMaxCount?: number\n responseOverrides?: ResponseOverrides\n}\n\nconst fetchEventSource = (\n input: RequestInfo,\n el: HTMLOrSVG,\n {\n signal: inputSignal,\n headers: inputHeaders,\n onopen: inputOnOpen,\n onmessage,\n onclose,\n onerror,\n openWhenHidden,\n fetch: inputFetch,\n retry = 'auto',\n retryInterval = 1_000,\n retryScaler = 2,\n retryMaxWaitMs = 30_000,\n retryMaxCount = 10,\n responseOverrides,\n ...rest\n }: FetchEventSourceInit,\n): Promise => {\n return new Promise((resolve, reject) => {\n // make a copy of the input headers since we may modify it below:\n const headers: Record = {\n ...inputHeaders,\n }\n\n let curRequestController: AbortController\n const onVisibilityChange = () => {\n curRequestController.abort() // close existing request on every visibility change\n if (!document.hidden) create() // page is now visible again, recreate request.\n }\n\n if (!openWhenHidden) {\n document.addEventListener('visibilitychange', onVisibilityChange)\n }\n\n let retryTimer: ReturnType | undefined\n const dispose = () => {\n document.removeEventListener('visibilitychange', onVisibilityChange)\n clearTimeout(retryTimer)\n curRequestController.abort()\n }\n\n // if the incoming signal aborts, dispose resources and resolve:\n inputSignal?.addEventListener('abort', () => {\n dispose()\n resolve() // don't waste time constructing/logging errors\n })\n\n const fetch = inputFetch || window.fetch\n const onopen = inputOnOpen || (() => {})\n\n let retries = 0\n let baseRetryInterval = retryInterval\n const create = async () => {\n curRequestController = new AbortController()\n const curRequestSignal = curRequestController.signal\n try {\n const response = await fetch(input, {\n ...rest,\n headers,\n signal: curRequestSignal,\n })\n\n await onopen(response)\n\n const dispatchNonSSE = async (\n dispatchType: string,\n response: Response,\n name: string,\n responseOverrides?: ResponseOverrides,\n ...argNames: string[]\n ) => {\n const argsRaw: Record = {\n [name]: await response.text(),\n }\n for (const n of argNames) {\n let v = response.headers.get(`datastar-${kebab(n)}`)\n if (responseOverrides) {\n const o = (responseOverrides as any)[n]\n if (o) v = typeof o === 'string' ? o : JSON.stringify(o)\n }\n if (v) argsRaw[n] = v\n }\n\n dispatchFetch(dispatchType, el, argsRaw)\n dispose()\n resolve()\n }\n\n const status = response.status\n const isNoContentStatus = status === 204\n const isRedirectStatus = status >= 300 && status < 400\n const isErrorStatus = status >= 400 && status < 600\n\n if (status !== 200) {\n onclose?.()\n if (\n retry !== 'never' &&\n !isNoContentStatus &&\n !isRedirectStatus &&\n (retry === 'always' || (retry === 'error' && isErrorStatus))\n ) {\n clearTimeout(retryTimer)\n retryTimer = setTimeout(create, retryInterval)\n return\n }\n dispose()\n resolve()\n return\n }\n\n // on successful connection, reset the retry logic\n retries = 0\n retryInterval = baseRetryInterval\n\n const ct = response.headers.get('Content-Type')\n if (ct?.includes('text/html')) {\n return await dispatchNonSSE(\n 'datastar-patch-elements',\n response,\n 'elements',\n responseOverrides,\n 'selector',\n 'mode',\n 'namespace',\n 'useViewTransition',\n )\n }\n\n if (ct?.includes('application/json')) {\n return await dispatchNonSSE(\n 'datastar-patch-signals',\n response,\n 'signals',\n responseOverrides,\n 'onlyIfMissing',\n )\n }\n\n if (ct?.includes('text/javascript')) {\n const script = document.createElement('script')\n const scriptAttributesHeader = response.headers.get(\n 'datastar-script-attributes',\n )\n\n if (scriptAttributesHeader) {\n for (const [name, value] of Object.entries(\n JSON.parse(scriptAttributesHeader),\n )) {\n script.setAttribute(name, value as string)\n }\n }\n script.textContent = await response.text()\n document.head.appendChild(script)\n dispose()\n return\n }\n\n await getBytes(\n response.body!,\n getLines(\n getMessages(\n (id) => {\n if (id) {\n // signals the id and send it back on the next retry:\n headers['last-event-id'] = id\n } else {\n // don't send the last-event-id header anymore:\n delete headers['last-event-id']\n }\n },\n (retry) => {\n baseRetryInterval = retryInterval = retry\n },\n onmessage,\n ),\n ),\n )\n\n onclose?.()\n\n if (retry === 'always' && !isRedirectStatus) {\n clearTimeout(retryTimer)\n retryTimer = setTimeout(create, retryInterval)\n return\n }\n\n dispose()\n resolve()\n } catch (err) {\n if (!curRequestSignal.aborted) {\n // if we haven\u2019t aborted the request ourselves:\n try {\n // check if we need to retry:\n const interval: any = onerror?.(err) || retryInterval\n clearTimeout(retryTimer)\n retryTimer = setTimeout(create, interval)\n retryInterval = Math.min(\n retryInterval * retryScaler,\n retryMaxWaitMs,\n ) // exponential backoff\n if (++retries >= retryMaxCount) {\n dispatchFetch(RETRIES_FAILED, el, {})\n // we should not retry anymore:\n dispose()\n reject('Max retries reached.') // Max retries reached, check your server or network connection\n } else {\n console.error(\n `Datastar failed to reach ${input.toString()} retrying in ${interval}ms.`,\n )\n }\n } catch (innerErr) {\n // we should not retry anymore:\n dispose()\n reject(innerErr)\n }\n }\n }\n }\n\n create()\n })\n}\n", "// Icon: material-symbols:edit-attributes-outline\n// Slug: Syncs the value of an attribute with an expression.\n// Description: Sets the value of any HTML attribute to an expression, and keeps it in sync.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\n\nattribute({\n name: 'attr',\n requirement: { value: 'must' },\n returnsValue: true,\n apply({ el, key, rx }) {\n const syncAttr = (key: string, val: any) => {\n if (val === '' || val === true) {\n el.setAttribute(key, '')\n } else if (val === false || val == null) {\n el.removeAttribute(key)\n } else if (typeof val === 'string') {\n el.setAttribute(key, val)\n } else {\n el.setAttribute(key, JSON.stringify(val))\n }\n }\n\n const update = key\n ? () => {\n observer.disconnect()\n const val = rx() as string\n syncAttr(key, val)\n observer.observe(el, {\n attributeFilter: [key],\n })\n }\n : () => {\n observer.disconnect()\n const obj = rx() as Record\n const attributeFilter = Object.keys(obj)\n for (const key of attributeFilter) {\n syncAttr(key, obj[key])\n }\n observer.observe(el, {\n attributeFilter,\n })\n }\n\n const observer = new MutationObserver(update)\n const cleanup = effect(update)\n\n return () => {\n observer.disconnect()\n cleanup()\n }\n },\n})\n", "// Icon: akar-icons:link-chain\n// Slug: Creates a signal with two-way data binding.\n// Description: Creates a signal (if one doesn\u2019t already exist) and sets up two-way data binding between it and an element\u2019s value.\n\nimport { attribute } from '@engine'\nimport { effect, getPath, mergePaths } from '@engine/signals'\nimport type { Paths } from '@engine/types'\nimport { aliasify, modifyCasing } from '@utils/text'\n\ntype SignalFile = {\n name: string\n contents: string\n mime: string\n}\n\nconst dataURIRegex = /^data:(?[^;]+);base64,(?.*)$/\nconst empty = Symbol('empty')\n\nconst aliasedBind = aliasify('bind')\n\nattribute({\n name: 'bind',\n requirement: 'exclusive',\n apply({ el, key, mods, value, error }) {\n const signalName = key != null ? modifyCasing(key, mods) : value\n\n let get = (el: any, type: string) =>\n type === 'number' ? +el.value : el.value\n\n let set = (value: any) => {\n ;(el as HTMLInputElement).value = `${value}`\n }\n\n if (el instanceof HTMLInputElement) {\n switch (el.type) {\n case 'range':\n case 'number':\n get = (el: any, type: string) =>\n type === 'string' ? el.value : +el.value\n break\n\n case 'checkbox':\n get = (el: HTMLInputElement, type: string) => {\n if (el.value !== 'on') {\n if (type === 'boolean') {\n return el.checked\n } else {\n return el.checked ? el.value : ''\n }\n } else {\n if (type === 'string') {\n return el.checked ? el.value : ''\n } else {\n return el.checked\n }\n }\n }\n set = (value: string | boolean) => {\n el.checked = typeof value === 'string' ? value === el.value : value\n }\n break\n\n case 'radio':\n // Set up radio button name attribute if not present\n if (!el.getAttribute('name')?.length) {\n el.setAttribute('name', signalName)\n }\n\n get = (el: HTMLInputElement, type: string) =>\n el.checked ? (type === 'number' ? +el.value : el.value) : empty\n set = (value: string | number) => {\n el.checked =\n value === (typeof value === 'number' ? +el.value : el.value)\n }\n break\n case 'file': {\n const syncSignal = () => {\n const files = [...(el.files || [])]\n const signalFiles: SignalFile[] = []\n Promise.all(\n files.map(\n (f) =>\n new Promise((resolve) => {\n const reader = new FileReader()\n reader.onload = () => {\n if (typeof reader.result !== 'string') {\n throw error('InvalidFileResultType', {\n resultType: typeof reader.result,\n })\n }\n const match = reader.result.match(dataURIRegex)\n if (!match?.groups) {\n throw error('InvalidDataUri', {\n result: reader.result,\n })\n }\n signalFiles.push({\n name: f.name,\n contents: match.groups.contents,\n mime: match.groups.mime,\n })\n }\n reader.onloadend = () => resolve()\n reader.readAsDataURL(f)\n }),\n ),\n ).then(() => {\n mergePaths([[signalName, signalFiles]])\n })\n }\n\n el.addEventListener('change', syncSignal)\n el.addEventListener('input', syncSignal)\n\n return () => {\n el.removeEventListener('change', syncSignal)\n el.removeEventListener('input', syncSignal)\n }\n }\n }\n } else if (el instanceof HTMLSelectElement) {\n if (el.multiple) {\n const typeMap = new Map()\n get = (el: HTMLSelectElement) =>\n [...el.selectedOptions].map((option) => {\n const type = typeMap.get(option.value)\n return type === 'string' || type == null\n ? option.value\n : +option.value\n })\n\n set = (value: (string | number)[]) => {\n for (const option of el.options) {\n if (value.includes(option.value)) {\n typeMap.set(option.value, 'string')\n option.selected = true\n } else if (value.includes(+option.value)) {\n typeMap.set(option.value, 'number')\n option.selected = true\n } else {\n option.selected = false\n }\n }\n }\n }\n } else if (el instanceof HTMLTextAreaElement) {\n // default case\n } else {\n // web component\n get = (el: Element) =>\n 'value' in el ? el.value : el.getAttribute('value')\n set = (value: any) => {\n if ('value' in el) {\n el.value = value\n } else {\n el.setAttribute('value', value)\n }\n }\n }\n\n const initialValue = getPath(signalName)\n const type = typeof initialValue\n\n let path = signalName\n if (\n Array.isArray(initialValue) &&\n !(el instanceof HTMLSelectElement && el.multiple)\n ) {\n const signalNameKebab = key ? key : value!\n const inputs = document.querySelectorAll(\n `[${aliasedBind}\\\\:${CSS.escape(signalNameKebab)}],[${aliasedBind}=\"${CSS.escape(signalNameKebab)}\"]`,\n ) as NodeListOf\n\n const paths: Paths = []\n let i = 0\n for (const input of inputs) {\n paths.push([`${path}.${i}`, get(input, 'none')])\n\n if (el === input) {\n break\n }\n i++\n }\n mergePaths(paths, { ifMissing: true })\n path = `${path}.${i}`\n } else {\n mergePaths([[path, get(el, type)]], {\n ifMissing: true,\n })\n }\n\n const syncSignal = () => {\n const signalValue = getPath(path)\n if (signalValue != null) {\n const value = get(el, typeof signalValue)\n if (value !== empty) {\n mergePaths([[path, value]])\n }\n }\n }\n\n el.addEventListener('input', syncSignal)\n el.addEventListener('change', syncSignal)\n const cleanup = effect(() => {\n set(getPath(path))\n })\n\n return () => {\n cleanup()\n el.removeEventListener('input', syncSignal)\n el.removeEventListener('change', syncSignal)\n }\n },\n})\n", "// Icon: ic:baseline-format-paint\n// Slug: Adds or removes a class based on an expression.\n// Description: Adds or removes a class to or from an element based on an expression.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\nimport { modifyCasing } from '@utils/text'\n\nattribute({\n name: 'class',\n requirement: {\n value: 'must',\n },\n returnsValue: true,\n apply({ key, el, mods, rx }) {\n key &&= modifyCasing(key, mods, 'kebab')\n\n let classes: Record\n const callback = () => {\n observer.disconnect()\n\n classes = key\n ? { [key]: rx() as boolean }\n : (rx() as Record)\n\n for (const k in classes) {\n const classNames = k.split(/\\s+/).filter((cn) => cn.length > 0)\n if (classes[k]) {\n for (const name of classNames) {\n if (!el.classList.contains(name)) {\n el.classList.add(name)\n }\n }\n } else {\n for (const name of classNames) {\n if (el.classList.contains(name)) {\n el.classList.remove(name)\n }\n }\n }\n }\n\n observer.observe(el, { attributeFilter: ['class'] })\n }\n\n const observer = new MutationObserver(callback)\n const cleanup = effect(callback)\n\n return () => {\n observer.disconnect()\n cleanup()\n\n for (const k in classes) {\n const classNames = k.split(/\\s+/).filter((cn) => cn.length > 0)\n for (const name of classNames) {\n el.classList.remove(name)\n }\n }\n }\n },\n})\n", "// Icon: streamline-ultimate:wifi-signal-2\n// Slug: Creates a computed signal.\n// Description: Creates a signal that is computed based on an expression.\n\nimport { attribute } from '@engine'\nimport { computed, mergePaths, mergePatch } from '@engine/signals'\nimport { modifyCasing } from '@utils/text'\nimport { updateLeaves } from '@utils/paths'\n\nattribute({\n name: 'computed',\n requirement: {\n value: 'must',\n },\n returnsValue: true,\n apply({ key, mods, rx, error }) {\n if (key) {\n mergePaths([[modifyCasing(key, mods), computed(rx)]])\n } else {\n const patch = Object.assign({}, rx() as Record any>)\n updateLeaves(patch, (old) => {\n if (typeof old === 'function') {\n return computed(old)\n } else {\n throw error('ComputedExpectedFunction')\n }\n })\n mergePatch(patch)\n }\n },\n})\n", "// Icon: oui:security-signal\n// Slug: Executes an expression when signals change.\n// Description: Executes an expression on page load and whenever any signals in the expression change.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\n\nattribute({\n name: 'effect',\n requirement: {\n key: 'denied',\n value: 'must',\n },\n apply: ({ rx }) => effect(rx),\n})\n", "// Icon: streamline:signal-loading-remix\n// Slug: Creates an indicator for whether an SSE request is in flight.\n// Description: Creates a signal and sets its value to `true` while an SSE request request is in flight, otherwise `false`.\n\nimport { attribute } from '@engine'\nimport { DATASTAR_FETCH_EVENT } from '@engine/consts'\nimport { mergePaths } from '@engine/signals'\nimport type { DatastarFetchEvent } from '@engine/types'\nimport { FINISHED, STARTED } from '@plugins/actions/fetch'\nimport { modifyCasing } from '@utils/text'\n\nattribute({\n name: 'indicator',\n requirement: 'exclusive',\n apply({ el, key, mods, value }) {\n const signalName = key != null ? modifyCasing(key, mods) : value\n\n mergePaths([[signalName, false]])\n\n const watcher = ((event: CustomEvent) => {\n const { type, el: elt } = event.detail\n if (elt !== el) {\n return\n }\n switch (type) {\n case STARTED:\n mergePaths([[signalName, true]])\n break\n case FINISHED:\n mergePaths([[signalName, false]])\n break\n }\n }) as EventListener\n document.addEventListener(DATASTAR_FETCH_EVENT, watcher)\n return () => {\n mergePaths([[signalName, false]])\n document.removeEventListener(DATASTAR_FETCH_EVENT, watcher)\n }\n },\n})\n", "export const tagToMs = (args: Set) => {\n if (!args || args.size <= 0) return 0\n for (const arg of args) {\n if (arg.endsWith('ms')) {\n return +arg.replace('ms', '')\n }\n if (arg.endsWith('s')) {\n return +arg.replace('s', '') * 1000\n }\n try {\n return Number.parseFloat(arg)\n } catch (_) {}\n }\n return 0\n}\n\nexport const tagHas = (\n tags: Set,\n tag: string,\n defaultValue = false,\n) => {\n if (!tags) return defaultValue\n return tags.has(tag.toLowerCase())\n}\n\nexport const tagFirst = (tags?: Set, defaultValue = ''): string => {\n if (tags && tags.size > 0) {\n for (const tag of tags) {\n return tag\n }\n }\n return defaultValue\n}\n", "import type { EventCallbackHandler, Modifiers } from '@engine/types'\nimport { tagHas, tagToMs } from '@utils/tags'\n\nexport const delay = (\n callback: EventCallbackHandler,\n wait: number,\n): EventCallbackHandler => {\n return (...args: any[]) => {\n setTimeout(() => {\n callback(...args)\n }, wait)\n }\n}\n\nexport const throttle = (\n callback: EventCallbackHandler,\n wait: number,\n leading = true,\n trailing = false,\n debounce = false,\n): EventCallbackHandler => {\n let lastArgs: Parameters | null = null\n let timer = 0\n\n return (...args: any[]) => {\n if (leading && !timer) {\n callback(...args)\n lastArgs = null\n } else {\n lastArgs = args\n }\n if (!timer || debounce) {\n if (timer) {\n clearTimeout(timer)\n }\n timer = setTimeout(() => {\n if (trailing && lastArgs !== null) {\n callback(...lastArgs)\n }\n lastArgs = null\n timer = 0\n }, wait)\n }\n }\n}\n\nexport const modifyTiming = (\n callback: EventCallbackHandler,\n mods: Modifiers,\n): EventCallbackHandler => {\n const delayArgs = mods.get('delay')\n if (delayArgs) {\n const wait = tagToMs(delayArgs)\n callback = delay(callback, wait)\n }\n\n const debounceArgs = mods.get('debounce')\n if (debounceArgs) {\n const wait = tagToMs(debounceArgs)\n const leading = tagHas(debounceArgs, 'leading', false)\n const trailing = !tagHas(debounceArgs, 'notrailing', false)\n callback = throttle(callback, wait, leading, trailing, true)\n }\n\n const throttleArgs = mods.get('throttle')\n if (throttleArgs) {\n const wait = tagToMs(throttleArgs)\n const leading = !tagHas(throttleArgs, 'noleading', false)\n const trailing = tagHas(throttleArgs, 'trailing', false)\n callback = throttle(callback, wait, leading, trailing)\n }\n\n return callback\n}\n", "import type { EventCallbackHandler, Modifiers } from '@engine/types'\n\nexport const supportsViewTransitions = !!document.startViewTransition\n\nexport const modifyViewTransition = (\n callback: EventCallbackHandler,\n mods: Modifiers,\n): EventCallbackHandler => {\n if (mods.has('viewtransition') && supportsViewTransitions) {\n const cb = callback // I hate javascript\n callback = (...args: any[]) =>\n document.startViewTransition(() => cb(...args))\n }\n\n return callback\n}\n", "// Icon: material-symbols:timer-play-outline\n// Slug: Runs an expression when loaded into the DOM.\n// Description: Runs an expression when the element is loaded into the DOM.\n\nimport { attribute } from '@engine'\nimport { beginBatch, endBatch } from '@engine/signals'\nimport { tagToMs } from '@utils/tags'\nimport { delay } from '@utils/timing'\nimport { modifyViewTransition } from '@utils/view-transitions'\n\nattribute({\n name: 'init',\n requirement: {\n key: 'denied',\n value: 'must',\n },\n apply({ rx, mods }) {\n let callback = () => {\n beginBatch()\n rx()\n endBatch()\n }\n callback = modifyViewTransition(callback, mods)\n let wait = 0\n const delayArgs = mods.get('delay')\n if (delayArgs) {\n wait = tagToMs(delayArgs)\n if (wait > 0) {\n callback = delay(callback, wait)\n }\n }\n callback()\n },\n})\n", "// Icon: si:json-fill\n// Slug: Outputs a JSON stringified version of signals.\n// Description: Sets the text content of an element to a reactive JSON stringified version of signals.\n\nimport { attribute } from '@engine'\nimport { effect, filtered } from '@engine/signals'\nimport type { SignalFilterOptions } from '@engine/types'\nimport { jsStrToObject } from '@utils/text'\n\nattribute({\n name: 'json-signals',\n requirement: {\n key: 'denied',\n },\n apply({ el, value, mods }) {\n const spaces = mods.has('terse') ? 0 : 2\n let filters: SignalFilterOptions = {}\n if (value) {\n filters = jsStrToObject(value)\n }\n\n const callback = () => {\n observer.disconnect()\n el.textContent = JSON.stringify(filtered(filters), null, spaces)\n observer.observe(el, {\n childList: true,\n characterData: true,\n subtree: true,\n })\n }\n const observer = new MutationObserver(callback)\n const cleanup = effect(callback)\n\n return () => {\n observer.disconnect()\n cleanup()\n }\n },\n})\n", "// Icon: material-symbols:mail\n// Slug: Attaches an event listener to an element.\n// Description: Attaches an event listener to an element, executing an expression whenever the event is triggered.\n\nimport { attribute } from '@engine'\nimport {\n DATASTAR_FETCH_EVENT,\n DATASTAR_SIGNAL_PATCH_EVENT,\n} from '@engine/consts'\nimport { beginBatch, endBatch } from '@engine/signals'\nimport { modifyCasing } from '@utils/text'\nimport { modifyTiming } from '@utils/timing'\nimport { modifyViewTransition } from '@utils/view-transitions'\n\nattribute({\n name: 'on',\n requirement: 'must',\n argNames: ['evt'],\n apply({ el, key, mods, rx }) {\n let target: Element | Window | Document = el\n if (mods.has('window')) target = window\n let callback = (evt?: Event) => {\n if (evt) {\n if (mods.has('prevent')) {\n evt.preventDefault()\n }\n if (mods.has('stop')) {\n evt.stopPropagation()\n }\n }\n beginBatch()\n rx(evt)\n endBatch()\n }\n callback = modifyViewTransition(callback, mods)\n callback = modifyTiming(callback, mods)\n const evtListOpts: AddEventListenerOptions = {\n capture: mods.has('capture'),\n passive: mods.has('passive'),\n once: mods.has('once'),\n }\n if (mods.has('outside')) {\n target = document\n const cb = callback\n callback = (evt?: Event) => {\n if (!el.contains(evt?.target as HTMLElement)) {\n cb(evt)\n }\n }\n }\n const eventName = modifyCasing(key, mods, 'kebab')\n // Listen for Datastar events on the document\n if (\n eventName === DATASTAR_FETCH_EVENT ||\n eventName === DATASTAR_SIGNAL_PATCH_EVENT\n ) {\n target = document\n }\n // Prevent default on form submit events\n if (el instanceof HTMLFormElement && eventName === 'submit') {\n const cb = callback\n callback = (evt?: Event) => {\n evt?.preventDefault()\n cb(evt)\n }\n }\n target.addEventListener(eventName, callback, evtListOpts)\n return () => {\n target.removeEventListener(eventName, callback)\n }\n },\n})\n", "export const clamp = (value: number, min: number, max: number): number => {\n return Math.max(min, Math.min(max, value))\n}\n\nexport const lerp = (\n min: number,\n max: number,\n t: number,\n clamped = true,\n): number => {\n const v = min + (max - min) * t\n return clamped ? clamp(v, min, max) : v\n}\n\nexport const inverseLerp = (\n min: number,\n max: number,\n value: number,\n clamped = true,\n): number => {\n if (value < min) return 0\n if (value > max) return 1\n const v = (value - min) / (max - min)\n return clamped ? clamp(v, min, max) : v\n}\n\nexport const fit = (\n value: number,\n inMin: number,\n inMax: number,\n outMin: number,\n outMax: number,\n clamped = true,\n rounded = false,\n): number => {\n const t = inverseLerp(inMin, inMax, value, clamped)\n const fitted = lerp(outMin, outMax, t, clamped)\n return rounded ? Math.round(fitted) : fitted\n}\n", "// Icon: mdi-light:vector-intersection\n// Slug: Runs an expression on intersection.\n// Description: Runs an expression when the element intersects with the viewport.\n\nimport { attribute } from '@engine'\nimport { beginBatch, endBatch } from '@engine/signals'\nimport type { HTMLOrSVG } from '@engine/types'\nimport { clamp } from '@utils/math'\nimport { modifyTiming } from '@utils/timing'\nimport { modifyViewTransition } from '@utils/view-transitions'\n\nconst once = new WeakSet()\n\nattribute({\n name: 'on-intersect',\n requirement: {\n key: 'denied',\n value: 'must',\n },\n apply({ el, mods, rx }) {\n let callback = () => {\n beginBatch()\n rx()\n endBatch()\n }\n callback = modifyViewTransition(callback, mods)\n callback = modifyTiming(callback, mods)\n const options = { threshold: 0 }\n if (mods.has('full')) {\n options.threshold = 1\n } else if (mods.has('half')) {\n options.threshold = 0.5\n } else if (mods.get('threshold')) {\n options.threshold = clamp(Number(mods.get('threshold')), 0, 100) / 100\n }\n const exit = mods.has('exit')\n let observer: IntersectionObserver | null = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting !== exit) {\n callback()\n if (observer && once.has(el)) {\n observer.disconnect()\n }\n }\n }\n },\n options,\n )\n observer.observe(el)\n if (mods.has('once')) {\n once.add(el)\n }\n return () => {\n if (!mods.has('once')) {\n once.delete(el)\n }\n if (observer) {\n observer.disconnect()\n observer = null\n }\n }\n },\n})\n", "// Icon: material-symbols:timer-outline\n// Slug: Runs an expression at a regular interval.\n// Description: Runs an expression at a regular interval.\n\nimport { attribute } from '@engine'\nimport { beginBatch, endBatch } from '@engine/signals'\nimport { tagHas, tagToMs } from '@utils/tags'\nimport { modifyViewTransition } from '@utils/view-transitions'\n\nattribute({\n name: 'on-interval',\n requirement: {\n key: 'denied',\n value: 'must',\n },\n apply({ mods, rx }) {\n let callback = () => {\n beginBatch()\n rx()\n endBatch()\n }\n callback = modifyViewTransition(callback, mods)\n let duration = 1000\n const durationArgs = mods.get('duration')\n if (durationArgs) {\n duration = tagToMs(durationArgs)\n const leading = tagHas(durationArgs, 'leading', false)\n if (leading) {\n callback()\n }\n }\n const intervalId = setInterval(callback, duration)\n return () => {\n clearInterval(intervalId)\n }\n },\n})\n", "// Icon: material-symbols:change-circle-outline\n// Slug: Runs an expression when signals are patched.\n// Description: Runs an expression whenever one or more signals are patched.\n\nimport { attribute } from '@engine'\nimport { DATASTAR_SIGNAL_PATCH_EVENT } from '@engine/consts'\nimport { beginBatch, endBatch, filtered } from '@engine/signals'\nimport type { JSONPatch, SignalFilterOptions } from '@engine/types'\nimport { isEmpty } from '@utils/paths'\nimport { aliasify, jsStrToObject } from '@utils/text'\nimport { modifyTiming } from '@utils/timing'\n\nattribute({\n name: 'on-signal-patch',\n requirement: {\n value: 'must',\n },\n argNames: ['patch'],\n returnsValue: true,\n apply({ el, key, mods, rx, error }) {\n if (!!key && key !== 'filter') {\n throw error('KeyNotAllowed')\n }\n\n const filterAttr = aliasify(`${this.name}-filter`)\n const filtersRaw = el.getAttribute(filterAttr)\n let filters: SignalFilterOptions = {}\n if (filtersRaw) {\n filters = jsStrToObject(filtersRaw)\n }\n\n let running = false\n\n const callback: EventListener = modifyTiming(\n (evt: CustomEvent) => {\n if (running) return\n const watched = filtered(filters, evt.detail)\n if (!isEmpty(watched)) {\n running = true\n beginBatch()\n try {\n rx(watched)\n } finally {\n endBatch()\n running = false\n }\n }\n },\n mods,\n )\n\n document.addEventListener(DATASTAR_SIGNAL_PATCH_EVENT, callback)\n return () => {\n document.removeEventListener(DATASTAR_SIGNAL_PATCH_EVENT, callback)\n }\n },\n})\n", "// Icon: mdi:cursor-pointer\n// Slug: Creates a reference to an element.\n// Description: Creates a new signal that is a reference to the element on which the data attribute is placed.\n\nimport { attribute } from '@engine'\nimport { mergePaths } from '@engine/signals'\nimport { modifyCasing } from '@utils/text'\n\nattribute({\n name: 'ref',\n requirement: 'exclusive',\n apply({ el, key, mods, value }) {\n const signalName = key != null ? modifyCasing(key, mods) : value\n mergePaths([[signalName, el]])\n },\n})\n", "// Icon: streamline:interface-edit-view-eye-eyeball-open-view\n// Slug: Shows or hides an element.\n// Description: Shows or hides an element based on whether an expression evaluates to `true` or `false`.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\n\nconst NONE = 'none'\nconst DISPLAY = 'display'\n\nattribute({\n name: 'show',\n requirement: {\n key: 'denied',\n value: 'must',\n },\n returnsValue: true,\n apply({ el, rx }) {\n const update = () => {\n observer.disconnect()\n const shouldShow = rx()\n if (shouldShow) {\n if (el.style.display === NONE) el.style.removeProperty(DISPLAY)\n } else {\n el.style.setProperty(DISPLAY, NONE)\n }\n observer.observe(el, { attributeFilter: ['style'] })\n }\n const observer = new MutationObserver(update)\n const cleanup = effect(update)\n\n return () => {\n observer.disconnect()\n cleanup()\n }\n },\n})\n", "// Icon: streamline:wifi-signal-full-remix\n// Slug: Patches signals into the existing signals.\n// Description: Patches (adds, updates or removes) one or more signals into the existing signals.\n\nimport { attribute } from '@engine'\nimport { mergePatch, mergePaths } from '@engine/signals'\nimport { modifyCasing } from '@utils/text'\n\nattribute({\n name: 'signals',\n returnsValue: true,\n apply({ key, mods, rx }) {\n const ifMissing = mods.has('ifmissing')\n\n if (key) {\n key = modifyCasing(key, mods)\n mergePaths([[key, rx?.()]], { ifMissing })\n } else {\n const patch = Object.assign({}, rx?.() as Record)\n mergePatch(patch, { ifMissing })\n }\n },\n})\n", "// Icon: material-symbols:format-paint-outline\n// Slug: Sets inline styles on an element based on an expression.\n// Description: Sets CSS styles on an element using either key-based or object syntax, and keeps them in sync with reactive signals.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\nimport { kebab } from '@utils/text'\n\nattribute({\n name: 'style',\n requirement: {\n value: 'must',\n },\n returnsValue: true,\n apply({ key, el, rx }) {\n const { style } = el\n const initialStyles = new Map()\n\n const apply = (prop: string, value: any) => {\n const initial = initialStyles.get(prop)\n if (!value && value !== 0) {\n initial !== undefined &&\n (initial\n ? style.setProperty(prop, initial)\n : style.removeProperty(prop))\n } else {\n initial === undefined &&\n initialStyles.set(prop, style.getPropertyValue(prop))\n style.setProperty(prop, String(value))\n }\n }\n\n const update = () => {\n observer.disconnect()\n\n if (key) {\n apply(key, rx())\n } else {\n const styles = rx() as Record\n\n for (const [prop, initial] of initialStyles) {\n prop in styles ||\n (initial\n ? style.setProperty(prop, initial)\n : style.removeProperty(prop))\n }\n\n for (const prop in styles) {\n apply(kebab(prop), styles[prop])\n }\n }\n\n observer.observe(el, { attributeFilter: ['style'] })\n }\n\n const observer = new MutationObserver(update)\n const cleanup = effect(update)\n\n return () => {\n observer.disconnect()\n cleanup()\n for (const [prop, initial] of initialStyles) {\n initial ? style.setProperty(prop, initial) : style.removeProperty(prop)\n }\n }\n },\n})\n", "// Icon: icon-park-outline:text\n// Slug: Binds the text content of an element.\n// Description: Binds the text content of an element to an expression.\n\nimport { attribute } from '@engine'\nimport { effect } from '@engine/signals'\n\nattribute({\n name: 'text',\n requirement: {\n key: 'denied',\n value: 'must',\n },\n returnsValue: true,\n apply({ el, rx }) {\n const update = () => {\n observer.disconnect()\n el.textContent = `${rx()}`\n observer.observe(el, {\n childList: true,\n characterData: true,\n subtree: true,\n })\n }\n\n const observer = new MutationObserver(update)\n const cleanup = effect(update)\n\n return () => {\n observer.disconnect()\n cleanup()\n }\n },\n})\n", "// Icon: material-symbols:cloud-download\n// Slug: Patches elements into the DOM.\n// Description: Patches elements into the DOM.\n\nimport { watcher } from '@engine'\nimport type { WatcherContext } from '@engine/types'\nimport { isHTMLOrSVG } from '@utils/dom'\nimport { aliasify } from '@utils/text'\nimport { supportsViewTransitions } from '@utils/view-transitions'\n\nconst isValidType = (\n arr: T,\n value: string,\n): value is T[number] => (arr as readonly string[]).includes(value)\n\nconst PATCH_MODES = [\n 'remove',\n 'outer',\n 'inner',\n 'replace',\n 'prepend',\n 'append',\n 'before',\n 'after',\n] as const\ntype PatchElementsMode = (typeof PATCH_MODES)[number]\n\nconst NAMESPACES = ['html', 'svg', 'mathml'] as const\ntype Namespace = (typeof NAMESPACES)[number]\n\ntype PatchElementsArgs = {\n selector: string\n mode: PatchElementsMode\n namespace: Namespace\n useViewTransition: boolean\n elements: string\n}\n\nwatcher({\n name: 'datastar-patch-elements',\n apply(\n ctx,\n {\n selector = '',\n mode = 'outer',\n namespace = 'html',\n useViewTransition = '',\n elements = '',\n },\n ) {\n if (!isValidType(PATCH_MODES, mode)) {\n throw ctx.error('PatchElementsInvalidMode', { mode })\n }\n\n if (!selector && mode !== 'outer' && mode !== 'replace') {\n throw ctx.error('PatchElementsExpectedSelector')\n }\n\n if (!isValidType(NAMESPACES, namespace)) {\n throw ctx.error('PatchElementsInvalidNamespace', { namespace })\n }\n\n const args2: PatchElementsArgs = {\n selector,\n mode,\n namespace,\n useViewTransition: useViewTransition.trim() === 'true',\n elements,\n }\n\n if (supportsViewTransitions && useViewTransition) {\n document.startViewTransition(() => onPatchElements(ctx, args2))\n } else {\n onPatchElements(ctx, args2)\n }\n },\n})\n\nconst onPatchElements = (\n { error }: WatcherContext,\n { selector, mode, namespace, elements }: PatchElementsArgs,\n) => {\n const elementsWithSvgsRemoved = elements.replace(\n /]*>|>)([\\s\\S]*?)<\\/svg>/gim,\n '',\n )\n const hasHtml = /<\\/html>/.test(elementsWithSvgsRemoved)\n const hasHead = /<\\/head>/.test(elementsWithSvgsRemoved)\n const hasBody = /<\\/body>/.test(elementsWithSvgsRemoved)\n\n const wrapperTag =\n namespace === 'svg' ? 'svg' : namespace === 'mathml' ? 'math' : ''\n const wrappedEls = wrapperTag\n ? `<${wrapperTag}>${elements}`\n : elements\n\n const newDocument = new DOMParser().parseFromString(\n hasHtml || hasHead || hasBody\n ? elements\n : ``,\n 'text/html',\n )\n\n let newContent = document.createDocumentFragment()\n if (hasHtml) {\n newContent.appendChild(newDocument.documentElement)\n } else if (hasHead && hasBody) {\n newContent.appendChild(newDocument.head)\n newContent.appendChild(newDocument.body)\n } else if (hasHead) {\n newContent.appendChild(newDocument.head)\n } else if (hasBody) {\n newContent.appendChild(newDocument.body)\n } else if (wrapperTag) {\n const wrapperEl = newDocument\n .querySelector('template')!\n .content.querySelector(wrapperTag)!\n for (const child of wrapperEl.childNodes) {\n newContent.appendChild(child)\n }\n } else {\n newContent = newDocument.querySelector('template')!.content\n }\n\n if (!selector && (mode === 'outer' || mode === 'replace')) {\n for (const child of newContent.children) {\n let target: Element\n if (child instanceof HTMLHtmlElement) {\n target = document.documentElement\n } else if (child instanceof HTMLBodyElement) {\n target = document.body\n } else if (child instanceof HTMLHeadElement) {\n target = document.head\n } else {\n target = document.getElementById(child.id)!\n if (!target) {\n console.warn(error('PatchElementsNoTargetsFound'), {\n element: { id: child.id },\n })\n continue\n }\n }\n\n applyToTargets(mode as PatchElementsMode, child, [target])\n }\n } else {\n const targets = document.querySelectorAll(selector)\n if (!targets.length) {\n console.warn(error('PatchElementsNoTargetsFound'), { selector })\n return\n }\n\n applyToTargets(mode as PatchElementsMode, newContent, targets)\n }\n}\n\nconst scripts = new WeakSet()\nfor (const script of document.querySelectorAll('script')) {\n scripts.add(script)\n}\n\nconst execute = (target: Element): void => {\n const elScripts =\n target instanceof HTMLScriptElement\n ? [target]\n : target.querySelectorAll('script')\n for (const old of elScripts) {\n if (!scripts.has(old)) {\n const script = document.createElement('script')\n for (const { name, value } of old.attributes) {\n script.setAttribute(name, value)\n }\n script.text = old.text\n old.replaceWith(script)\n scripts.add(script)\n }\n }\n}\n\nconst applyPatchMode = (\n targets: Iterable,\n element: DocumentFragment | Element,\n action: string,\n) => {\n for (const target of targets) {\n const cloned = element.cloneNode(true) as Element\n execute(cloned)\n // @ts-expect-error\n target[action](cloned)\n }\n}\n\nconst applyToTargets = (\n mode: PatchElementsMode,\n element: DocumentFragment | Element,\n targets: Iterable,\n) => {\n switch (mode) {\n case 'remove':\n for (const target of targets) {\n target.remove()\n }\n break\n case 'outer':\n case 'inner':\n for (const target of targets) {\n morph(target, element.cloneNode(true) as Element, mode)\n execute(target)\n }\n break\n case 'replace':\n applyPatchMode(targets, element, 'replaceWith')\n break\n case 'prepend':\n case 'append':\n case 'before':\n case 'after':\n applyPatchMode(targets, element, mode)\n }\n}\n\nconst ctxIdMap = new Map>()\nconst ctxPersistentIds = new Set()\nconst oldIdTagNameMap = new Map()\nconst duplicateIds = new Set()\nconst ctxPantry = document.createElement('div')\nctxPantry.hidden = true\n\nconst aliasedIgnoreMorph = aliasify('ignore-morph')\nconst aliasedIgnoreMorphAttr = `[${aliasedIgnoreMorph}]`\nconst morph = (\n oldElt: Element | ShadowRoot,\n newContent: DocumentFragment | Element,\n mode: 'outer' | 'inner' = 'outer',\n): void => {\n if (\n (isHTMLOrSVG(oldElt) &&\n isHTMLOrSVG(newContent) &&\n oldElt.hasAttribute(aliasedIgnoreMorph) &&\n newContent.hasAttribute(aliasedIgnoreMorph)) ||\n oldElt.parentElement?.closest(aliasedIgnoreMorphAttr)\n ) {\n return\n }\n\n const normalizedElt = document.createElement('div')\n normalizedElt.append(newContent)\n document.body.insertAdjacentElement('afterend', ctxPantry)\n\n // Computes the set of IDs that persist between the two contents excluding duplicates\n const oldIdElements = oldElt.querySelectorAll('[id]')\n for (const { id, tagName } of oldIdElements) {\n if (oldIdTagNameMap.has(id)) {\n duplicateIds.add(id)\n } else {\n oldIdTagNameMap.set(id, tagName)\n }\n }\n if (oldElt instanceof Element && oldElt.id) {\n if (oldIdTagNameMap.has(oldElt.id)) {\n duplicateIds.add(oldElt.id)\n } else {\n oldIdTagNameMap.set(oldElt.id, oldElt.tagName)\n }\n }\n\n ctxPersistentIds.clear()\n const newIdElements = normalizedElt.querySelectorAll('[id]')\n for (const { id, tagName } of newIdElements) {\n if (ctxPersistentIds.has(id)) {\n duplicateIds.add(id)\n } else if (oldIdTagNameMap.get(id) === tagName) {\n ctxPersistentIds.add(id)\n }\n }\n\n for (const id of duplicateIds) {\n ctxPersistentIds.delete(id)\n }\n\n oldIdTagNameMap.clear()\n duplicateIds.clear()\n ctxIdMap.clear()\n\n const parent = mode === 'outer' ? oldElt.parentElement! : oldElt\n populateIdMapWithTree(parent, oldIdElements)\n populateIdMapWithTree(normalizedElt, newIdElements)\n\n morphChildren(\n parent,\n normalizedElt,\n mode === 'outer' ? oldElt : null,\n oldElt.nextSibling,\n )\n\n ctxPantry.remove()\n}\n\n// This is the core algorithm for matching up children.\n// The idea is to use ID sets to try to match up nodes as faithfully as possible.\n// We greedily match, which allows us to keep the algorithm fast,\n// but by using ID sets, we are able to better match up with content deeper in the DOM.\nconst morphChildren = (\n oldParent: Element | ShadowRoot, // the old content that we are merging the new content into\n newParent: Element, // the parent element of the new content\n insertionPoint: Node | null = null, // the point in the DOM we start morphing at (defaults to first child)\n endPoint: Node | null = null, // the point in the DOM we stop morphing at (defaults to after last child)\n): void => {\n // normalize\n if (\n oldParent instanceof HTMLTemplateElement &&\n newParent instanceof HTMLTemplateElement\n ) {\n // we can pretend the DocumentElement is an Element\n oldParent = oldParent.content as unknown as Element\n newParent = newParent.content as unknown as Element\n }\n insertionPoint ??= oldParent.firstChild\n\n // run through all the new content\n for (const newChild of newParent.childNodes) {\n // once we reach the end of the old parent content skip to the end and insert the rest\n if (insertionPoint && insertionPoint !== endPoint) {\n const bestMatch = findBestMatch(newChild, insertionPoint, endPoint)\n if (bestMatch) {\n // if the node to morph is not at the insertion point then remove/move up to it\n if (bestMatch !== insertionPoint) {\n let cursor: Node | null = insertionPoint\n // Remove nodes between the start and end nodes\n while (cursor && cursor !== bestMatch) {\n const tempNode = cursor\n cursor = cursor.nextSibling\n removeNode(tempNode)\n }\n }\n morphNode(bestMatch, newChild)\n insertionPoint = bestMatch.nextSibling\n continue\n }\n }\n\n // if the matching node is elsewhere in the original content\n if (newChild instanceof Element && ctxPersistentIds.has(newChild.id)) {\n // move it and all its children here and morph, will always be found\n // Search for an element by ID within the document and pantry, and move it using moveBefore.\n const movedChild = document.getElementById(newChild.id) as Element\n\n // Removes an element from its ancestors' ID maps.\n // This is needed when an element is moved from the \"future\" via `moveBeforeId`.\n // Otherwise, its erstwhile ancestors could be mistakenly moved to the pantry rather than being deleted,\n // preventing their removal hooks from being called.\n let current = movedChild\n while ((current = current.parentNode as Element)) {\n const idSet = ctxIdMap.get(current)\n if (idSet) {\n idSet.delete(newChild.id)\n if (!idSet.size) {\n ctxIdMap.delete(current)\n }\n }\n }\n\n moveBefore(oldParent, movedChild, insertionPoint)\n morphNode(movedChild, newChild)\n insertionPoint = movedChild.nextSibling\n continue\n }\n\n // This performs the action of inserting a new node while handling situations where the node contains\n // elements with persistent IDs and possible state info we can still preserve by moving in and then morphing\n if (ctxIdMap.has(newChild)) {\n // node has children with IDs with possible state so create a dummy elt of same type and apply full morph algorithm\n const namespaceURI = (newChild as Element).namespaceURI\n const tagName = (newChild as Element).tagName\n const newEmptyChild =\n namespaceURI && namespaceURI !== 'http://www.w3.org/1999/xhtml'\n ? document.createElementNS(namespaceURI, tagName)\n : document.createElement(tagName)\n oldParent.insertBefore(newEmptyChild, insertionPoint)\n morphNode(newEmptyChild, newChild)\n insertionPoint = newEmptyChild.nextSibling\n } else {\n // optimization: no id state to preserve so we can just insert a clone of the newChild and its descendants\n const newClonedChild = document.importNode(newChild, true) // importNode to not mutate newParent\n oldParent.insertBefore(newClonedChild, insertionPoint)\n insertionPoint = newClonedChild.nextSibling\n }\n }\n\n // remove any remaining old nodes that didn't match up with new content\n while (insertionPoint && insertionPoint !== endPoint) {\n const tempNode = insertionPoint\n insertionPoint = insertionPoint.nextSibling\n removeNode(tempNode)\n }\n}\n\n// Scans forward from the startPoint to the endPoint looking for a match for the node.\n// It looks for an id set match first, then a soft match.\n// We abort soft matching if we find two future soft matches, to reduce churn.\nconst findBestMatch = (\n node: Node,\n startPoint: Node | null,\n endPoint: Node | null,\n): Node | null => {\n let bestMatch: Node | null | undefined = null\n let nextSibling = node.nextSibling\n let siblingSoftMatchCount = 0\n let displaceMatchCount = 0\n\n // Max ID matches we are willing to displace in our search\n const nodeMatchCount = ctxIdMap.get(node)?.size || 0\n\n let cursor = startPoint\n while (cursor && cursor !== endPoint) {\n // soft matching is a prerequisite for id set matching\n if (isSoftMatch(cursor, node)) {\n let isIdSetMatch = false\n const oldSet = ctxIdMap.get(cursor)\n const newSet = ctxIdMap.get(node)\n\n if (newSet && oldSet) {\n for (const id of oldSet) {\n // a potential match is an id in the new and old nodes that\n // has not already been merged into the DOM\n // But the newNode content we call this on has not been\n // merged yet and we don't allow duplicate IDs so it is simple\n if (newSet.has(id)) {\n isIdSetMatch = true\n break\n }\n }\n }\n\n if (isIdSetMatch) {\n return cursor // found an id set match, we're done!\n }\n\n // we haven\u2019t yet saved a soft match fallback\n // the current soft match will hard match something else in the future, leave it\n if (!bestMatch && !ctxIdMap.has(cursor)) {\n // optimization: if node can't id set match, we can just return the soft match immediately\n if (!nodeMatchCount) {\n return cursor\n }\n // save this as the fallback if we get through the loop without finding a hard match\n bestMatch = cursor\n }\n }\n\n // check for IDs we may be displaced when matching\n displaceMatchCount += ctxIdMap.get(cursor)?.size || 0\n if (displaceMatchCount > nodeMatchCount) {\n // if we are going to displace more IDs than the node contains then\n // we do not have a good candidate for an ID match, so return\n break\n }\n\n if (bestMatch === null && nextSibling && isSoftMatch(cursor, nextSibling)) {\n // The next new node has a soft match with this node, so\n // increment the count of future soft matches\n siblingSoftMatchCount++\n nextSibling = nextSibling.nextSibling\n\n // If there are two future soft matches, block soft matching for this node to allow\n // future siblings to soft match. This is to reduce churn in the DOM when an element\n // is prepended.\n if (siblingSoftMatchCount >= 2) {\n bestMatch = undefined\n }\n }\n\n cursor = cursor.nextSibling\n }\n\n return bestMatch || null\n}\n\n// ok to cast: if one is not element, `id` and `tagName` will be null and we'll just compare that.\nconst isSoftMatch = (oldNode: Node, newNode: Node): boolean =>\n oldNode.nodeType === newNode.nodeType &&\n (oldNode as Element).tagName === (newNode as Element).tagName &&\n // If oldElt has an `id` with possible state and it doesn\u2019t match newElt.id then avoid morphing.\n // We'll still match an anonymous node with an IDed newElt, though, because if it got this far,\n // its not persistent, and new nodes can't have any hidden state.\n (!(oldNode as Element).id ||\n (oldNode as Element).id === (newNode as Element).id)\n\n// Gets rid of an unwanted DOM node; strategy depends on nature of its reuse:\n// - Persistent nodes will be moved to the pantry for later reuse\n// - Other nodes will have their hooks called, and then are removed\nconst removeNode = (node: Node): void => {\n // are we going to id set match this later?\n ctxIdMap.has(node)\n ? // skip callbacks and move to pantry\n moveBefore(ctxPantry, node, null)\n : // remove for realsies\n node.parentNode?.removeChild(node)\n}\n\n// Moves an element before another element within the same parent.\n// Uses the proposed `moveBefore` API if available (and working), otherwise falls back to `insertBefore`.\n// This is essentially a forward-compat wrapper.\nconst moveBefore: (parentNode: Node, node: Node, after: Node | null) => void =\n // @ts-expect-error\n removeNode.call.bind(ctxPantry.moveBefore ?? ctxPantry.insertBefore)\n\nconst aliasedPreserveAttr = aliasify('preserve-attr')\n\n// syncs the oldNode to the newNode, copying over all attributes and\n// inner element state from the newNode to the oldNode\nconst morphNode = (\n oldNode: Node, // root node to merge content into\n newNode: Node, // new content to merge\n): Node => {\n const type = newNode.nodeType\n\n // if is an element type, sync the attributes from the\n // new node into the new node\n if (type === 1 /* element type */) {\n const oldElt = oldNode as Element\n const newElt = newNode as Element\n const shouldScopeChildren = oldElt.hasAttribute('data-scope-children')\n if (\n oldElt.hasAttribute(aliasedIgnoreMorph) &&\n newElt.hasAttribute(aliasedIgnoreMorph)\n ) {\n return oldNode\n }\n\n // many bothans died to bring us this information:\n // https://github.com/patrick-steele-idem/morphdom/blob/master/src/specialElHandlers.js\n // https://github.com/choojs/nanomorph/blob/master/lib/morph.js#L113\n if (\n oldElt instanceof HTMLInputElement &&\n newElt instanceof HTMLInputElement &&\n newElt.type !== 'file'\n ) {\n // https://github.com/bigskysoftware/idiomorph/issues/27\n // | old input value | new input value | behaviour |\n // | --------------- | ---------------- | -------------------------------------- |\n // | `null` | `null` | preserve old input value |\n // | some value | the same value | preserve old input value |\n // | some value | `null` | set old input value to `\"\"` |\n // | `null` | some value | set old input value to new input value |\n // | some value | some other value | set old input value to new input value |\n if (newElt.getAttribute('value') !== oldElt.getAttribute('value')) {\n oldElt.value = newElt.getAttribute('value') ?? ''\n }\n } else if (\n oldElt instanceof HTMLTextAreaElement &&\n newElt instanceof HTMLTextAreaElement\n ) {\n if (newElt.value !== oldElt.value) {\n oldElt.value = newElt.value\n }\n if (oldElt.firstChild && oldElt.firstChild.nodeValue !== newElt.value) {\n oldElt.firstChild.nodeValue = newElt.value\n }\n }\n\n const preserveAttrs = (\n (newNode as HTMLElement).getAttribute(aliasedPreserveAttr) ?? ''\n ).split(' ')\n\n for (const { name, value } of newElt.attributes) {\n if (\n oldElt.getAttribute(name) !== value &&\n !preserveAttrs.includes(name)\n ) {\n oldElt.setAttribute(name, value)\n }\n }\n\n for (let i = oldElt.attributes.length - 1; i >= 0; i--) {\n const { name } = oldElt.attributes[i]!\n if (!newElt.hasAttribute(name) && !preserveAttrs.includes(name)) {\n oldElt.removeAttribute(name)\n }\n }\n\n // Preserve the scope marker even if the incoming markup doesn't carry it.\n if (shouldScopeChildren && !oldElt.hasAttribute('data-scope-children')) {\n oldElt.setAttribute('data-scope-children', '')\n }\n\n if (!oldElt.isEqualNode(newElt)) {\n morphChildren(oldElt, newElt)\n }\n\n if (shouldScopeChildren) {\n oldElt.dispatchEvent(\n new CustomEvent('datastar:scope-children', { bubbles: false }),\n )\n }\n }\n\n if (type === 8 /* comment */ || type === 3 /* text */) {\n if (oldNode.nodeValue !== newNode.nodeValue) {\n oldNode.nodeValue = newNode.nodeValue\n }\n }\n\n return oldNode\n}\n\n// A bottom-up algorithm that populates a map of Element -> IdSet.\n// The ID set for a given element is the set of all IDs contained within its subtree.\n// As an optimization, we filter these IDs through the given list of persistent IDs,\n// because we don't need to bother considering IDed elements that won't be in the new content.\nconst populateIdMapWithTree = (\n root: Element | ShadowRoot | null,\n elements: Iterable,\n): void => {\n for (const elt of elements) {\n if (ctxPersistentIds.has(elt.id)) {\n let current: Element | null = elt\n // walk up the parent hierarchy of that element, adding the ID of element to the parent's ID set\n while (current && current !== root) {\n let idSet = ctxIdMap.get(current)\n // if the ID set doesn\u2019t exist, create it and insert it in the map\n if (!idSet) {\n idSet = new Set()\n ctxIdMap.set(current, idSet)\n }\n idSet.add(elt.id)\n current = current.parentElement\n }\n }\n }\n}\n", "// Icon: material-symbols:settings-input-antenna\n// Slug: Patches signals.\n// Description: Patches signals.\n\nimport { watcher } from '@engine'\nimport { mergePatch } from '@engine/signals'\nimport { jsStrToObject } from '@utils/text'\n\nwatcher({\n name: 'datastar-patch-signals',\n apply({ error }, { signals, onlyIfMissing }) {\n if (signals) {\n const ifMissing = onlyIfMissing?.trim() === 'true'\n mergePatch(jsStrToObject(signals), { ifMissing })\n } else {\n throw error('PatchSignalsExpectedSignals')\n }\n },\n})\n"], - "mappings": "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", - "names": ["lol", "DSP", "DSS", "DATASTAR_FETCH_EVENT", "DATASTAR_SIGNAL_PATCH_EVENT", "hasOwn", "isPojo", "obj", "isEmpty", "prop", "hasOwn", "updateLeaves", "fn", "key", "val", "pathToObj", "paths", "result", "path", "value", "keys", "lastKey", "acc", "currentPatch", "queuedEffects", "batchDepth", "notifyIndex", "queuedEffectsLength", "prevSub", "activeSub", "version", "beginBatch", "endBatch", "flush", "dispatch", "startPeeking", "sub", "stopPeeking", "signal", "initialValue", "signalOper", "value_", "flags_", "computedSymbol", "computed", "getter", "c", "computedOper", "effect", "fn", "e", "fn_", "link", "effectOper", "run", "update", "updateComputed", "updateSignal", "startTracking", "oldValue", "endTracking", "s", "value", "notify", "flags", "subs", "subs_", "sub_", "checkDirty", "deps_", "dep", "dep_", "depFlags", "nextDep_", "propagate", "currentValue", "shallowPropagate", "unlink", "prevDep", "depsTail_", "nextDep", "version_", "subsTail_", "newLink", "prevDep_", "prevSub_", "nextSub_", "toRemove", "next", "stack", "top", "isValidLink", "subSubs", "nextSub", "prev_", "checkDepth", "dirty", "firstSub", "hasMultipleSubs", "checkLink", "getPath", "path", "result", "root", "split", "hasOwn", "deep", "prefix", "isArr", "isPojo", "deepObj", "key", "keys", "_", "prop", "newValue", "diff", "patch", "i", "pathStr", "nextVal", "detail", "pathToObj", "DATASTAR_SIGNAL_PATCH_EVENT", "mergePatch", "ifMissing", "mergeInner", "mergePaths", "paths", "options", "target", "targetParent", "toRegExp", "val", "filtered", "include", "exclude", "obj", "includeRe", "excludeRe", "node", "isHTMLOrSVG", "el", "kebab", "str", "snake", "str", "kebab", "jsStrToObject", "raw", "caseFns", "str", "x", "modifyCasing", "mods", "defaultCase", "c", "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", "action", "_", "fn", "startPeeking", "stopPeeking", "action", "_", "value", "filter", "startPeeking", "masked", "filtered", "updateLeaves", "mergePatch", "stopPeeking", "action", "_", "filter", "startPeeking", "masked", "filtered", "updateLeaves", "oldValue", "mergePatch", "stopPeeking", "createHttpMethod", "name", "method", "openWhenHiddenDefault", "action", "el", "evt", "error", "cleanups", "url", "selector", "userHeaders", "contentType", "include", "exclude", "openWhenHidden", "payload", "requestCancellation", "retry", "retryInterval", "retryScaler", "retryMaxWaitMs", "retryMaxCount", "controller", "cleanupFn", "initialHeaders", "headers", "req", "response", "dispatchFetch", "ERROR", "type", "argsRawLines", "line", "i", "k", "v", "argsRaw", "isWrongContent", "RETRYING", "urlInstance", "queryParams", "startPeeking", "filtered", "stopPeeking", "body", "formEl", "formData", "submitter", "preventDefault", "multipart", "formParams", "key", "value", "STARTED", "fetchEventSource", "e", "FINISHED", "RETRIES_FAILED", "DATASTAR_FETCH_EVENT", "err", "getBytes", "stream", "onChunk", "reader", "result", "getLines", "onLine", "buffer", "position", "fieldLength", "discardTrailingNewline", "arr", "concat", "bufLength", "lineStart", "lineEnd", "getMessages", "onId", "onRetry", "onMessage", "message", "newMessage", "decoder", "field", "valueOffset", "a", "b", "res", "input", "inputSignal", "inputHeaders", "inputOnOpen", "onmessage", "onclose", "onerror", "inputFetch", "responseOverrides", "rest", "resolve", "reject", "curRequestController", "onVisibilityChange", "create", "retryTimer", "dispose", "fetch", "onopen", "retries", "baseRetryInterval", "curRequestSignal", "dispatchNonSSE", "dispatchType", "argNames", "n", "kebab", "o", "status", "isNoContentStatus", "isRedirectStatus", "isErrorStatus", "ct", "script", "scriptAttributesHeader", "id", "interval", "innerErr", "attribute", "el", "key", "rx", "syncAttr", "val", "update", "observer", "obj", "attributeFilter", "cleanup", "effect", "dataURIRegex", "empty", "aliasedBind", "aliasify", "attribute", "el", "key", "mods", "value", "error", "signalName", "modifyCasing", "get", "type", "set", "syncSignal", "files", "signalFiles", "f", "resolve", "reader", "match", "mergePaths", "typeMap", "option", "initialValue", "getPath", "path", "signalNameKebab", "inputs", "paths", "i", "input", "signalValue", "cleanup", "effect", "attribute", "key", "el", "mods", "rx", "modifyCasing", "classes", "callback", "observer", "k", "classNames", "cn", "name", "cleanup", "effect", "attribute", "key", "mods", "rx", "error", "mergePaths", "modifyCasing", "computed", "patch", "updateLeaves", "old", "mergePatch", "attribute", "rx", "effect", "attribute", "el", "key", "mods", "value", "signalName", "modifyCasing", "mergePaths", "watcher", "event", "type", "elt", "STARTED", "FINISHED", "DATASTAR_FETCH_EVENT", "tagToMs", "args", "arg", "tagHas", "tags", "tag", "defaultValue", "delay", "callback", "wait", "args", "throttle", "leading", "trailing", "debounce", "lastArgs", "timer", "modifyTiming", "mods", "delayArgs", "tagToMs", "debounceArgs", "tagHas", "throttleArgs", "supportsViewTransitions", "modifyViewTransition", "callback", "mods", "cb", "args", "attribute", "rx", "mods", "callback", "beginBatch", "endBatch", "modifyViewTransition", "wait", "delayArgs", "tagToMs", "delay", "attribute", "el", "value", "mods", "spaces", "filters", "jsStrToObject", "callback", "observer", "filtered", "cleanup", "effect", "attribute", "el", "key", "mods", "rx", "target", "callback", "evt", "beginBatch", "endBatch", "modifyViewTransition", "modifyTiming", "evtListOpts", "cb", "eventName", "modifyCasing", "DATASTAR_FETCH_EVENT", "DATASTAR_SIGNAL_PATCH_EVENT", "clamp", "value", "min", "max", "once", "attribute", "el", "mods", "rx", "callback", "beginBatch", "endBatch", "modifyViewTransition", "modifyTiming", "options", "clamp", "exit", "observer", "entries", "entry", "attribute", "mods", "rx", "callback", "beginBatch", "endBatch", "modifyViewTransition", "duration", "durationArgs", "tagToMs", "tagHas", "intervalId", "attribute", "el", "key", "mods", "rx", "error", "filterAttr", "aliasify", "filtersRaw", "filters", "jsStrToObject", "running", "callback", "modifyTiming", "evt", "watched", "filtered", "isEmpty", "beginBatch", "endBatch", "DATASTAR_SIGNAL_PATCH_EVENT", "attribute", "el", "key", "mods", "value", "signalName", "modifyCasing", "mergePaths", "NONE", "DISPLAY", "attribute", "el", "rx", "update", "observer", "cleanup", "effect", "attribute", "key", "mods", "rx", "ifMissing", "modifyCasing", "mergePaths", "patch", "mergePatch", "attribute", "key", "el", "rx", "style", "initialStyles", "apply", "prop", "value", "initial", "update", "observer", "styles", "kebab", "cleanup", "effect", "attribute", "el", "rx", "update", "observer", "cleanup", "effect", "isValidType", "arr", "value", "PATCH_MODES", "NAMESPACES", "watcher", "ctx", "selector", "mode", "namespace", "useViewTransition", "elements", "args2", "supportsViewTransitions", "onPatchElements", "error", "elementsWithSvgsRemoved", "hasHtml", "hasHead", "hasBody", "wrapperTag", "wrappedEls", "newDocument", "newContent", "wrapperEl", "child", "target", "applyToTargets", "targets", "scripts", "script", "execute", "elScripts", "old", "name", "applyPatchMode", "element", "action", "cloned", "morph", "ctxIdMap", "ctxPersistentIds", "oldIdTagNameMap", "duplicateIds", "ctxPantry", "aliasedIgnoreMorph", "aliasify", "aliasedIgnoreMorphAttr", "oldElt", "isHTMLOrSVG", "normalizedElt", "oldIdElements", "id", "tagName", "newIdElements", "parent", "populateIdMapWithTree", "morphChildren", "oldParent", "newParent", "insertionPoint", "endPoint", "newChild", "bestMatch", "findBestMatch", "cursor", "tempNode", "removeNode", "morphNode", "movedChild", "current", "idSet", "moveBefore", "namespaceURI", "newEmptyChild", "newClonedChild", "node", "startPoint", "nextSibling", "siblingSoftMatchCount", "displaceMatchCount", "nodeMatchCount", "isSoftMatch", "isIdSetMatch", "oldSet", "newSet", "oldNode", "newNode", "aliasedPreserveAttr", "type", "newElt", "shouldScopeChildren", "preserveAttrs", "i", "root", "elt", "watcher", "error", "signals", "onlyIfMissing", "ifMissing", "mergePatch", "jsStrToObject"] + "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", "// Icon: ion:eye\r\n// Slug: Access signals without subscribing to changes.\r\n// Description: Allows accessing signals without subscribing to their changes in expressions.\r\n\r\nimport { action } from '@engine'\r\nimport { startPeeking, stopPeeking } from '@engine/signals'\r\n\r\naction({\r\n name: 'peek',\r\n apply(_, fn: () => any) {\r\n startPeeking()\r\n try {\r\n return fn()\r\n } finally {\r\n stopPeeking()\r\n }\r\n },\r\n})\r\n", "// Icon: ion:checkmark-round\r\n// Slug: Sets the value of all matching signals.\r\n// Description: Sets the value of all matching signals (or all signals if no filter is used) to the expression provided in the first argument.\r\n\r\nimport { action } from '@engine'\r\nimport {\r\n filtered,\r\n mergePatch,\r\n startPeeking,\r\n stopPeeking,\r\n} from '@engine/signals'\r\nimport type { SignalFilterOptions } from '@engine/types'\r\nimport { updateLeaves } from '@utils/paths'\r\n\r\naction({\r\n name: 'setAll',\r\n apply(_, value: any, filter: SignalFilterOptions) {\r\n // peek because in an effect you would be subscribing to signals and then setting them which\r\n // would cause an infinite loop and why would you want to infinite loop on purpose\r\n startPeeking()\r\n const masked = filtered(filter)\r\n updateLeaves(masked, () => value)\r\n mergePatch(masked)\r\n stopPeeking()\r\n },\r\n})\r\n", "// Icon: material-symbols:toggle-off\r\n// Slug: Toggles the value of all matching signals.\r\n// Description: Toggles the boolean value of all matching signals (or all signals if no filter is used).\r\n\r\nimport { action } from '@engine'\r\nimport {\r\n filtered,\r\n mergePatch,\r\n startPeeking,\r\n stopPeeking,\r\n} from '@engine/signals'\r\nimport type { SignalFilterOptions } from '@engine/types'\r\nimport { updateLeaves } from '@utils/paths'\r\n\r\naction({\r\n name: 'toggleAll',\r\n apply(_, filter: SignalFilterOptions) {\r\n // peek because in an effect you would be subscribing to signals and then setting them which\r\n // would cause an infinite loop and why would you want to infinite loop on purpose\r\n startPeeking()\r\n const masked = filtered(filter)\r\n updateLeaves(masked, (oldValue: any) => !oldValue)\r\n mergePatch(masked)\r\n stopPeeking()\r\n },\r\n})\r\n", "// Icon: ion:eye\r\n// Slug: Access signals without subscribing to changes.\r\n// Description: Allows accessing signals without subscribing to their changes in expressions.\r\n\r\nimport { action } from '@engine'\r\nimport { DATASTAR_FETCH_EVENT } from '@engine/consts'\r\nimport { filtered, startPeeking, stopPeeking } from '@engine/signals'\r\nimport type {\r\n DatastarFetchEvent,\r\n HTMLOrSVG,\r\n SignalFilterOptions,\r\n} from '@engine/types'\r\nimport { kebab } from '@utils/text'\r\n\r\nconst createHttpMethod = (\r\n name: string,\r\n method: string,\r\n openWhenHiddenDefault: boolean = true,\r\n): void =>\r\n action({\r\n name,\r\n apply: async (\r\n { el, evt, error, cleanups },\r\n url: string,\r\n {\r\n selector,\r\n headers: userHeaders,\r\n contentType = 'json',\r\n filterSignals: { include = /.*/, exclude = /(^|\\.)_/ } = {},\r\n openWhenHidden = openWhenHiddenDefault,\r\n payload,\r\n requestCancellation = 'auto',\r\n retry = 'auto',\r\n retryInterval = 1_000,\r\n retryScaler = 2,\r\n retryMaxWaitMs = 30_000,\r\n retryMaxCount = 10,\r\n }: FetchArgs = {},\r\n ) => {\r\n const controller =\r\n requestCancellation instanceof AbortController\r\n ? requestCancellation\r\n : new AbortController()\r\n if (requestCancellation === 'auto') {\r\n cleanups.get(`@${name}`)?.()\r\n cleanups.set(`@${name}`, async () => {\r\n controller.abort()\r\n // wait one tick for FINISHED to fire\r\n await Promise.resolve()\r\n })\r\n }\r\n\r\n let cleanupFn = null\r\n\r\n try {\r\n if (!url?.length) {\r\n throw error('FetchNoUrlProvided', { action })\r\n }\r\n\r\n const initialHeaders: Record = {\r\n Accept: 'text/event-stream, text/html, application/json',\r\n 'Datastar-Request': true,\r\n }\r\n if (contentType === 'json') {\r\n initialHeaders['Content-Type'] = 'application/json'\r\n }\r\n const headers = Object.assign({}, initialHeaders, userHeaders)\r\n\r\n // We ignore the content-type header if using form data\r\n // if missing the boundary will be set automatically\r\n\r\n const req: FetchEventSourceInit = {\r\n method,\r\n headers,\r\n openWhenHidden,\r\n retry,\r\n retryInterval,\r\n retryScaler,\r\n retryMaxWaitMs,\r\n retryMaxCount,\r\n signal: controller.signal,\r\n onopen: async (response: Response) => {\r\n if (response.status >= 400)\r\n dispatchFetch(ERROR, el, { status: response.status.toString() })\r\n },\r\n onmessage: (evt) => {\r\n if (!evt.event.startsWith('datastar')) return\r\n const type = evt.event\r\n const argsRawLines: Record = {}\r\n\r\n for (const line of evt.data.split('\\n')) {\r\n const i = line.indexOf(' ')\r\n const k = line.slice(0, i)\r\n const v = line.slice(i + 1)\r\n ;(argsRawLines[k] ||= []).push(v)\r\n }\r\n\r\n const argsRaw = Object.fromEntries(\r\n Object.entries(argsRawLines).map(([k, v]) => [k, v.join('\\n')]),\r\n )\r\n\r\n dispatchFetch(type, el, argsRaw)\r\n },\r\n onerror: (error) => {\r\n if (isWrongContent(error)) {\r\n // don't retry if the content-type is wrong\r\n throw error('FetchExpectedTextEventStream', { url })\r\n }\r\n // do nothing and it will retry\r\n if (error) {\r\n console.error(error.message)\r\n dispatchFetch(RETRYING, el, { message: error.message })\r\n }\r\n },\r\n }\r\n\r\n const urlInstance = new URL(url, document.baseURI)\r\n const queryParams = new URLSearchParams(urlInstance.search)\r\n\r\n if (contentType === 'json') {\r\n startPeeking()\r\n payload =\r\n payload !== undefined ? payload : filtered({ include, exclude })\r\n stopPeeking()\r\n const body = JSON.stringify(payload)\r\n if (method === 'GET') {\r\n queryParams.set('datastar', body)\r\n } else {\r\n req.body = body\r\n }\r\n } else if (contentType === 'form') {\r\n const formEl = (\r\n selector ? document.querySelector(selector) : el.closest('form')\r\n ) as HTMLFormElement\r\n if (!formEl) {\r\n throw error('FetchFormNotFound', { action, selector })\r\n }\r\n\r\n // Validate the form\r\n if (!formEl.noValidate && !formEl.checkValidity()) {\r\n formEl.reportValidity()\r\n return\r\n }\r\n\r\n // Collect the form data\r\n const formData = new FormData(formEl)\r\n let submitter = el as HTMLElement | null\r\n\r\n if (el === formEl && evt instanceof SubmitEvent) {\r\n // Get the submitter from the event\r\n submitter = evt.submitter\r\n } else {\r\n // Prevent the form being submitted\r\n const preventDefault = (evt: Event) => evt.preventDefault()\r\n formEl.addEventListener('submit', preventDefault)\r\n cleanupFn = () => {\r\n formEl.removeEventListener('submit', preventDefault)\r\n }\r\n }\r\n\r\n // Append the value of the form submitter if it is a button with a name\r\n if (submitter instanceof HTMLButtonElement) {\r\n const name = submitter.getAttribute('name')\r\n if (name) formData.append(name, submitter.value)\r\n }\r\n\r\n const multipart =\r\n formEl.getAttribute('enctype') === 'multipart/form-data'\r\n // Leave the `Content-Type` header empty for multipart encoding so the browser can set it automatically with the correct boundary\r\n if (!multipart) {\r\n headers['Content-Type'] = 'application/x-www-form-urlencoded'\r\n }\r\n\r\n const formParams = new URLSearchParams(formData as any)\r\n if (method === 'GET') {\r\n for (const [key, value] of formParams) {\r\n queryParams.append(key, value)\r\n }\r\n } else if (multipart) {\r\n req.body = formData\r\n } else {\r\n req.body = formParams\r\n }\r\n } else {\r\n throw error('FetchInvalidContentType', { action, contentType })\r\n }\r\n\r\n dispatchFetch(STARTED, el, {})\r\n urlInstance.search = queryParams.toString()\r\n\r\n try {\r\n await fetchEventSource(urlInstance.toString(), el, req)\r\n } catch (e: any) {\r\n if (!isWrongContent(e)) {\r\n throw error('FetchFailed', { method, url, error: e.message })\r\n }\r\n // exit gracefully and do nothing if the content-type is wrong\r\n // this can happen if the client is sending a request\r\n // where no response is expected, and they haven\u2019t\r\n // set the content-type to text/event-stream\r\n }\r\n } finally {\r\n dispatchFetch(FINISHED, el, {})\r\n cleanupFn?.()\r\n cleanups.delete(`@${name}`)\r\n }\r\n },\r\n })\r\n\r\ncreateHttpMethod('get', 'GET', false)\r\ncreateHttpMethod('patch', 'PATCH')\r\ncreateHttpMethod('post', 'POST')\r\ncreateHttpMethod('put', 'PUT')\r\ncreateHttpMethod('delete', 'DELETE')\r\n\r\nexport const STARTED = 'started'\r\nexport const FINISHED = 'finished'\r\nexport const ERROR = 'error'\r\nexport const RETRYING = 'retrying'\r\nexport const RETRIES_FAILED = 'retries-failed'\r\n\r\nconst dispatchFetch = (\r\n type: string,\r\n el: HTMLOrSVG,\r\n argsRaw: Record,\r\n) =>\r\n document.dispatchEvent(\r\n new CustomEvent(DATASTAR_FETCH_EVENT, {\r\n detail: { type, el, argsRaw },\r\n }),\r\n )\r\n\r\nconst isWrongContent = (err: any) => `${err}`.includes('text/event-stream')\r\n\r\ntype ResponseOverrides =\r\n | {\r\n selector?: string\r\n mode?: string\r\n namespace?: string\r\n useViewTransition?: boolean\r\n }\r\n | {\r\n onlyIfMissing?: boolean\r\n }\r\n\r\nexport type FetchArgs = {\r\n selector?: string\r\n headers?: Record\r\n contentType?: 'json' | 'form'\r\n filterSignals?: SignalFilterOptions\r\n openWhenHidden?: boolean\r\n payload?: any\r\n requestCancellation?: 'auto' | 'disabled' | AbortController\r\n responseOverrides?: ResponseOverrides\r\n retry?: 'auto' | 'error' | 'always' | 'never'\r\n retryInterval?: number\r\n retryScaler?: number\r\n retryMaxWaitMs?: number\r\n retryMaxCount?: number\r\n}\r\n\r\n// Below originally from https://github.com/Azure/fetch-event-source/blob/main/LICENSE\r\n\r\n/**\r\n * Represents a message sent in an event stream\r\n * https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events#Event_stream_format\r\n */\r\n\r\ninterface EventSourceMessage {\r\n id: string\r\n event: string\r\n data: string\r\n retry?: number\r\n}\r\n\r\n/**\r\n * Converts a ReadableStream into a callback pattern.\r\n * @param stream The input ReadableStream.\r\n * @param onChunk A function that will be called on each new byte chunk in the stream.\r\n * @returns {Promise} A promise that will be resolved when the stream closes.\r\n */\r\nconst getBytes = async (\r\n stream: ReadableStream,\r\n onChunk: (arr: Uint8Array) => void,\r\n): Promise => {\r\n const reader = stream.getReader()\r\n let result = await reader.read()\r\n while (!result.done) {\r\n onChunk(result.value)\r\n result = await reader.read()\r\n }\r\n}\r\n\r\nconst getLines = (onLine: (line: Uint8Array, fieldLength: number) => void) => {\r\n let buffer: Uint8Array | undefined\r\n let position: number // current read position\r\n let fieldLength: number // length of the `field` portion of the line\r\n let discardTrailingNewline = false\r\n\r\n // return a function that can process each incoming byte chunk:\r\n return (arr: Uint8Array) => {\r\n if (!buffer) {\r\n buffer = arr\r\n position = 0\r\n fieldLength = -1\r\n } else {\r\n // we're still parsing the old line. Append the new bytes into buffer:\r\n buffer = concat(buffer, arr)\r\n }\r\n\r\n const bufLength = buffer.length\r\n let lineStart = 0 // index where the current line starts\r\n while (position < bufLength) {\r\n if (discardTrailingNewline) {\r\n if (buffer[position] === 10) lineStart = ++position // skip to next char\r\n discardTrailingNewline = false\r\n }\r\n\r\n // start looking forward till the end of line:\r\n let lineEnd = -1 // index of the \\r or \\n char\r\n for (; position < bufLength && lineEnd === -1; ++position) {\r\n switch (buffer[position]) {\r\n case 58: // :\r\n if (fieldLength === -1) {\r\n // first colon in line\r\n fieldLength = position - lineStart\r\n }\r\n break\r\n // @ts-expect-error:7029 \\r case below should fallthrough to \\n:\r\n // biome-ignore lint/suspicious/noFallthroughSwitchClause: intentional fallthrough for CR to LF\r\n case 13: // \\r\r\n discardTrailingNewline = true\r\n case 10: // \\n\r\n lineEnd = position\r\n break\r\n }\r\n }\r\n\r\n if (lineEnd === -1) break // Wait for the next arr and then continue parsing\r\n\r\n // we've reached the line end, send it out:\r\n onLine(buffer.subarray(lineStart, lineEnd), fieldLength)\r\n lineStart = position // we're now on the next line\r\n fieldLength = -1\r\n }\r\n\r\n if (lineStart === bufLength)\r\n buffer = undefined // we've finished reading it\r\n else if (lineStart) {\r\n // Create a new view into buffer beginning at lineStart so we don't\r\n // need to copy over the previous lines when we get the new arr:\r\n buffer = buffer.subarray(lineStart)\r\n position -= lineStart\r\n }\r\n }\r\n}\r\n\r\nconst getMessages = (\r\n onId: (id: string) => void,\r\n onRetry: (retry: number) => void,\r\n onMessage?: (msg: EventSourceMessage) => void,\r\n): ((line: Uint8Array, fieldLength: number) => void) => {\r\n let message = newMessage()\r\n const decoder = new TextDecoder()\r\n\r\n // return a function that can process each incoming line buffer:\r\n return (line, fieldLength) => {\r\n if (!line.length) {\r\n // empty line denotes end of message. Trigger the callback and start a new message:\r\n onMessage?.(message)\r\n message = newMessage()\r\n } else if (fieldLength > 0) {\r\n // exclude comments and lines with no values\r\n // line is of format \":\" or \": \"\r\n // https://html.spec.whatwg.org/multipage/server-sent-events.html#event-stream-interpretation\r\n const field = decoder.decode(line.subarray(0, fieldLength))\r\n const valueOffset = fieldLength + (line[fieldLength + 1] === 32 ? 2 : 1)\r\n const value = decoder.decode(line.subarray(valueOffset))\r\n\r\n switch (field) {\r\n case 'data':\r\n message.data = message.data ? `${message.data}\\n${value}` : value\r\n break\r\n case 'event':\r\n message.event = value\r\n break\r\n case 'id':\r\n onId((message.id = value))\r\n break\r\n case 'retry': {\r\n const retry = +value\r\n if (!Number.isNaN(retry)) {\r\n // per spec, ignore non-integers\r\n onRetry((message.retry = retry))\r\n }\r\n break\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst concat = (a: Uint8Array, b: Uint8Array) => {\r\n const res = new Uint8Array(a.length + b.length)\r\n res.set(a)\r\n res.set(b, a.length)\r\n return res\r\n}\r\n\r\nconst newMessage = (): EventSourceMessage => ({\r\n // data, event, and id must be initialized to empty strings:\r\n // https://html.spec.whatwg.org/multipage/server-sent-events.html#event-stream-interpretation\r\n // retry should be initialized to undefined so we return a consistent shape\r\n // to the js engine all the time: https://mathiasbynens.be/notes/shapes-ics#takeaways\r\n data: '',\r\n event: '',\r\n id: '',\r\n retry: undefined,\r\n})\r\n\r\ntype FetchEventSourceInit = RequestInit & {\r\n headers?: Record\r\n onopen?: (response: Response) => Promise\r\n onmessage?: (ev: EventSourceMessage) => void\r\n onclose?: () => void\r\n onerror?: (err: any) => number | null | undefined | void\r\n openWhenHidden?: boolean\r\n fetch?: typeof fetch\r\n retry?: 'auto' | 'error' | 'always' | 'never'\r\n retryInterval?: number\r\n retryScaler?: number\r\n retryMaxWaitMs?: number\r\n retryMaxCount?: number\r\n responseOverrides?: ResponseOverrides\r\n}\r\n\r\nconst fetchEventSource = (\r\n input: RequestInfo,\r\n el: HTMLOrSVG,\r\n {\r\n signal: inputSignal,\r\n headers: inputHeaders,\r\n onopen: inputOnOpen,\r\n onmessage,\r\n onclose,\r\n onerror,\r\n openWhenHidden,\r\n fetch: inputFetch,\r\n retry = 'auto',\r\n retryInterval = 1_000,\r\n retryScaler = 2,\r\n retryMaxWaitMs = 30_000,\r\n retryMaxCount = 10,\r\n responseOverrides,\r\n ...rest\r\n }: FetchEventSourceInit,\r\n): Promise => {\r\n return new Promise((resolve, reject) => {\r\n // make a copy of the input headers since we may modify it below:\r\n const headers: Record = {\r\n ...inputHeaders,\r\n }\r\n\r\n let curRequestController: AbortController\r\n const onVisibilityChange = () => {\r\n curRequestController.abort() // close existing request on every visibility change\r\n if (!document.hidden) create() // page is now visible again, recreate request.\r\n }\r\n\r\n if (!openWhenHidden) {\r\n document.addEventListener('visibilitychange', onVisibilityChange)\r\n }\r\n\r\n let retryTimer: ReturnType | undefined\r\n const dispose = () => {\r\n document.removeEventListener('visibilitychange', onVisibilityChange)\r\n clearTimeout(retryTimer)\r\n curRequestController.abort()\r\n }\r\n\r\n // if the incoming signal aborts, dispose resources and resolve:\r\n inputSignal?.addEventListener('abort', () => {\r\n dispose()\r\n resolve() // don't waste time constructing/logging errors\r\n })\r\n\r\n const fetch = inputFetch || window.fetch\r\n const onopen = inputOnOpen || (() => {})\r\n\r\n let retries = 0\r\n let baseRetryInterval = retryInterval\r\n const create = async () => {\r\n curRequestController = new AbortController()\r\n const curRequestSignal = curRequestController.signal\r\n try {\r\n const response = await fetch(input, {\r\n ...rest,\r\n headers,\r\n signal: curRequestSignal,\r\n })\r\n\r\n await onopen(response)\r\n\r\n const dispatchNonSSE = async (\r\n dispatchType: string,\r\n response: Response,\r\n name: string,\r\n responseOverrides?: ResponseOverrides,\r\n ...argNames: string[]\r\n ) => {\r\n const argsRaw: Record = {\r\n [name]: await response.text(),\r\n }\r\n for (const n of argNames) {\r\n let v = response.headers.get(`datastar-${kebab(n)}`)\r\n if (responseOverrides) {\r\n const o = (responseOverrides as any)[n]\r\n if (o) v = typeof o === 'string' ? o : JSON.stringify(o)\r\n }\r\n if (v) argsRaw[n] = v\r\n }\r\n\r\n dispatchFetch(dispatchType, el, argsRaw)\r\n dispose()\r\n resolve()\r\n }\r\n\r\n const status = response.status\r\n const isNoContentStatus = status === 204\r\n const isRedirectStatus = status >= 300 && status < 400\r\n const isErrorStatus = status >= 400 && status < 600\r\n\r\n if (status !== 200) {\r\n onclose?.()\r\n if (\r\n retry !== 'never' &&\r\n !isNoContentStatus &&\r\n !isRedirectStatus &&\r\n (retry === 'always' || (retry === 'error' && isErrorStatus))\r\n ) {\r\n clearTimeout(retryTimer)\r\n retryTimer = setTimeout(create, retryInterval)\r\n return\r\n }\r\n dispose()\r\n resolve()\r\n return\r\n }\r\n\r\n // on successful connection, reset the retry logic\r\n retries = 0\r\n retryInterval = baseRetryInterval\r\n\r\n const ct = response.headers.get('Content-Type')\r\n if (ct?.includes('text/html')) {\r\n return await dispatchNonSSE(\r\n 'datastar-patch-elements',\r\n response,\r\n 'elements',\r\n responseOverrides,\r\n 'selector',\r\n 'mode',\r\n 'namespace',\r\n 'useViewTransition',\r\n 'namespace'\r\n )\r\n }\r\n\r\n if (ct?.includes('application/json')) {\r\n return await dispatchNonSSE(\r\n 'datastar-patch-signals',\r\n response,\r\n 'signals',\r\n responseOverrides,\r\n 'onlyIfMissing',\r\n )\r\n }\r\n\r\n if (ct?.includes('text/javascript')) {\r\n const script = document.createElement('script')\r\n const scriptAttributesHeader = response.headers.get(\r\n 'datastar-script-attributes',\r\n )\r\n\r\n if (scriptAttributesHeader) {\r\n for (const [name, value] of Object.entries(\r\n JSON.parse(scriptAttributesHeader),\r\n )) {\r\n script.setAttribute(name, value as string)\r\n }\r\n }\r\n script.textContent = await response.text()\r\n document.head.appendChild(script)\r\n dispose()\r\n return\r\n }\r\n\r\n await getBytes(\r\n response.body!,\r\n getLines(\r\n getMessages(\r\n (id) => {\r\n if (id) {\r\n // signals the id and send it back on the next retry:\r\n headers['last-event-id'] = id\r\n } else {\r\n // don't send the last-event-id header anymore:\r\n delete headers['last-event-id']\r\n }\r\n },\r\n (retry) => {\r\n baseRetryInterval = retryInterval = retry\r\n },\r\n onmessage,\r\n ),\r\n ),\r\n )\r\n\r\n onclose?.()\r\n\r\n if (retry === 'always' && !isRedirectStatus) {\r\n clearTimeout(retryTimer)\r\n retryTimer = setTimeout(create, retryInterval)\r\n return\r\n }\r\n\r\n dispose()\r\n resolve()\r\n } catch (err) {\r\n if (!curRequestSignal.aborted) {\r\n // if we haven\u2019t aborted the request ourselves:\r\n try {\r\n // check if we need to retry:\r\n const interval: any = onerror?.(err) || retryInterval\r\n clearTimeout(retryTimer)\r\n retryTimer = setTimeout(create, interval)\r\n retryInterval = Math.min(\r\n retryInterval * retryScaler,\r\n retryMaxWaitMs,\r\n ) // exponential backoff\r\n if (++retries >= retryMaxCount) {\r\n dispatchFetch(RETRIES_FAILED, el, {})\r\n // we should not retry anymore:\r\n dispose()\r\n reject('Max retries reached.') // Max retries reached, check your server or network connection\r\n } else {\r\n console.error(\r\n `Datastar failed to reach ${input.toString()} retrying in ${interval}ms.`,\r\n )\r\n }\r\n } catch (innerErr) {\r\n // we should not retry anymore:\r\n dispose()\r\n reject(innerErr)\r\n }\r\n }\r\n }\r\n }\r\n\r\n create()\r\n })\r\n}\r\n", "// Icon: material-symbols:edit-attributes-outline\r\n// Slug: Syncs the value of an attribute with an expression.\r\n// Description: Sets the value of any HTML attribute to an expression, and keeps it in sync.\r\n\r\nimport { attribute } from '@engine'\r\nimport { effect } from '@engine/signals'\r\n\r\nattribute({\r\n name: 'attr',\r\n requirement: { value: 'must' },\r\n returnsValue: true,\r\n apply({ el, key, rx }) {\r\n const syncAttr = (key: string, val: any) => {\r\n if (val === '' || val === true) {\r\n el.setAttribute(key, '')\r\n } else if (val === false || val == null) {\r\n el.removeAttribute(key)\r\n } else if (typeof val === 'string') {\r\n el.setAttribute(key, val)\r\n } else {\r\n el.setAttribute(key, JSON.stringify(val))\r\n }\r\n }\r\n\r\n const update = key\r\n ? () => {\r\n observer.disconnect()\r\n const val = rx() as string\r\n syncAttr(key, val)\r\n observer.observe(el, {\r\n attributeFilter: [key],\r\n })\r\n }\r\n : () => {\r\n observer.disconnect()\r\n const obj = rx() as Record\r\n const attributeFilter = Object.keys(obj)\r\n for (const key of attributeFilter) {\r\n syncAttr(key, obj[key])\r\n }\r\n observer.observe(el, {\r\n attributeFilter,\r\n })\r\n }\r\n\r\n const observer = new MutationObserver(update)\r\n const cleanup = effect(update)\r\n\r\n return () => {\r\n observer.disconnect()\r\n cleanup()\r\n }\r\n },\r\n})\r\n", "// Icon: akar-icons:link-chain\r\n// Slug: Creates a signal with two-way data binding.\r\n// Description: Creates a signal (if one doesn\u2019t already exist) and sets up two-way data binding between it and an element\u2019s value.\r\n\r\nimport { attribute } from '@engine'\r\nimport { effect, getPath, mergePaths } from '@engine/signals'\r\nimport type { Paths } from '@engine/types'\r\nimport { aliasify, modifyCasing } from '@utils/text'\r\n\r\ntype SignalFile = {\r\n name: string\r\n contents: string\r\n mime: string\r\n}\r\n\r\nconst dataURIRegex = /^data:(?[^;]+);base64,(?.*)$/\r\nconst empty = Symbol('empty')\r\n\r\nconst aliasedBind = aliasify('bind')\r\n\r\nattribute({\r\n name: 'bind',\r\n requirement: 'exclusive',\r\n apply({ el, key, mods, value, error }) {\r\n const signalName = key != null ? modifyCasing(key, mods) : value\r\n\r\n let get = (el: any, type: string) =>\r\n type === 'number' ? +el.value : el.value\r\n\r\n let set = (value: any) => {\r\n ;(el as HTMLInputElement).value = `${value}`\r\n }\r\n\r\n if (el instanceof HTMLInputElement) {\r\n switch (el.type) {\r\n case 'range':\r\n case 'number':\r\n get = (el: any, type: string) =>\r\n type === 'string' ? el.value : +el.value\r\n break\r\n\r\n case 'checkbox':\r\n get = (el: HTMLInputElement, type: string) => {\r\n if (el.value !== 'on') {\r\n if (type === 'boolean') {\r\n return el.checked\r\n } else {\r\n return el.checked ? el.value : ''\r\n }\r\n } else {\r\n if (type === 'string') {\r\n return el.checked ? el.value : ''\r\n } else {\r\n return el.checked\r\n }\r\n }\r\n }\r\n set = (value: string | boolean) => {\r\n el.checked = typeof value === 'string' ? value === el.value : value\r\n }\r\n break\r\n\r\n case 'radio':\r\n // Set up radio button name attribute if not present\r\n if (!el.getAttribute('name')?.length) {\r\n el.setAttribute('name', signalName)\r\n }\r\n\r\n get = (el: HTMLInputElement, type: string) =>\r\n el.checked ? (type === 'number' ? +el.value : el.value) : empty\r\n set = (value: string | number) => {\r\n el.checked =\r\n value === (typeof value === 'number' ? +el.value : el.value)\r\n }\r\n break\r\n case 'file': {\r\n const syncSignal = () => {\r\n const files = [...(el.files || [])]\r\n const signalFiles: SignalFile[] = []\r\n Promise.all(\r\n files.map(\r\n (f) =>\r\n new Promise((resolve) => {\r\n const reader = new FileReader()\r\n reader.onload = () => {\r\n if (typeof reader.result !== 'string') {\r\n throw error('InvalidFileResultType', {\r\n resultType: typeof reader.result,\r\n })\r\n }\r\n const match = reader.result.match(dataURIRegex)\r\n if (!match?.groups) {\r\n throw error('InvalidDataUri', {\r\n result: reader.result,\r\n })\r\n }\r\n signalFiles.push({\r\n name: f.name,\r\n contents: match.groups.contents,\r\n mime: match.groups.mime,\r\n })\r\n }\r\n reader.onloadend = () => resolve()\r\n reader.readAsDataURL(f)\r\n }),\r\n ),\r\n ).then(() => {\r\n mergePaths([[signalName, signalFiles]])\r\n })\r\n }\r\n\r\n el.addEventListener('change', syncSignal)\r\n el.addEventListener('input', syncSignal)\r\n\r\n return () => {\r\n el.removeEventListener('change', syncSignal)\r\n el.removeEventListener('input', syncSignal)\r\n }\r\n }\r\n }\r\n } else if (el instanceof HTMLSelectElement) {\r\n if (el.multiple) {\r\n const typeMap = new Map()\r\n get = (el: HTMLSelectElement) =>\r\n [...el.selectedOptions].map((option) => {\r\n const type = typeMap.get(option.value)\r\n return type === 'string' || type == null\r\n ? option.value\r\n : +option.value\r\n })\r\n\r\n set = (value: (string | number)[]) => {\r\n for (const option of el.options) {\r\n if (value.includes(option.value)) {\r\n typeMap.set(option.value, 'string')\r\n option.selected = true\r\n } else if (value.includes(+option.value)) {\r\n typeMap.set(option.value, 'number')\r\n option.selected = true\r\n } else {\r\n option.selected = false\r\n }\r\n }\r\n }\r\n }\r\n } else if (el instanceof HTMLTextAreaElement) {\r\n // default case\r\n } else {\r\n // web component\r\n get = (el: Element) =>\r\n 'value' in el ? el.value : el.getAttribute('value')\r\n set = (value: any) => {\r\n if ('value' in el) {\r\n el.value = value\r\n } else {\r\n el.setAttribute('value', value)\r\n }\r\n }\r\n }\r\n\r\n const initialValue = getPath(signalName)\r\n const type = typeof initialValue\r\n\r\n let path = signalName\r\n if (\r\n Array.isArray(initialValue) &&\r\n !(el instanceof HTMLSelectElement && el.multiple)\r\n ) {\r\n const signalNameKebab = key ? key : value!\r\n const inputs = document.querySelectorAll(\r\n `[${aliasedBind}\\\\:${CSS.escape(signalNameKebab)}],[${aliasedBind}=\"${CSS.escape(signalNameKebab)}\"]`,\r\n ) as NodeListOf\r\n\r\n const paths: Paths = []\r\n let i = 0\r\n for (const input of inputs) {\r\n paths.push([`${path}.${i}`, get(input, 'none')])\r\n\r\n if (el === input) {\r\n break\r\n }\r\n i++\r\n }\r\n mergePaths(paths, { ifMissing: true })\r\n path = `${path}.${i}`\r\n } else {\r\n mergePaths([[path, get(el, type)]], {\r\n ifMissing: true,\r\n })\r\n }\r\n\r\n const syncSignal = () => {\r\n const signalValue = getPath(path)\r\n if (signalValue != null) {\r\n const value = get(el, typeof signalValue)\r\n if (value !== empty) {\r\n mergePaths([[path, value]])\r\n }\r\n }\r\n }\r\n\r\n el.addEventListener('input', syncSignal)\r\n el.addEventListener('change', syncSignal)\r\n const cleanup = effect(() => {\r\n set(getPath(path))\r\n })\r\n\r\n return () => {\r\n cleanup()\r\n el.removeEventListener('input', syncSignal)\r\n el.removeEventListener('change', syncSignal)\r\n }\r\n },\r\n})\r\n", "// Icon: ic:baseline-format-paint\r\n// Slug: Adds or removes a class based on an expression.\r\n// Description: Adds or removes a class to or from an element based on an expression.\r\n\r\nimport { attribute } from '@engine'\r\nimport { effect } from '@engine/signals'\r\nimport { modifyCasing } from '@utils/text'\r\n\r\nattribute({\r\n name: 'class',\r\n requirement: {\r\n value: 'must',\r\n },\r\n returnsValue: true,\r\n apply({ key, el, mods, rx }) {\r\n key &&= modifyCasing(key, mods, 'kebab')\r\n\r\n let classes: Record\r\n const callback = () => {\r\n observer.disconnect()\r\n\r\n classes = key\r\n ? { [key]: rx() as boolean }\r\n : (rx() as Record)\r\n\r\n for (const k in classes) {\r\n const classNames = k.split(/\\s+/).filter((cn) => cn.length > 0)\r\n if (classes[k]) {\r\n for (const name of classNames) {\r\n if (!el.classList.contains(name)) {\r\n el.classList.add(name)\r\n }\r\n }\r\n } else {\r\n for (const name of classNames) {\r\n if (el.classList.contains(name)) {\r\n el.classList.remove(name)\r\n }\r\n }\r\n }\r\n }\r\n\r\n observer.observe(el, { attributeFilter: ['class'] })\r\n }\r\n\r\n const observer = new MutationObserver(callback)\r\n const cleanup = effect(callback)\r\n\r\n return () => {\r\n observer.disconnect()\r\n cleanup()\r\n\r\n for (const k in classes) {\r\n const classNames = k.split(/\\s+/).filter((cn) => cn.length > 0)\r\n for (const name of classNames) {\r\n el.classList.remove(name)\r\n }\r\n }\r\n }\r\n },\r\n})\r\n", "// Icon: streamline-ultimate:wifi-signal-2\r\n// Slug: Creates a computed signal.\r\n// Description: Creates a signal that is computed based on an expression.\r\n\r\nimport { attribute } from '@engine'\r\nimport { computed, mergePaths, mergePatch } from '@engine/signals'\r\nimport { modifyCasing } from '@utils/text'\r\nimport { updateLeaves } from '@utils/paths'\r\n\r\nattribute({\r\n name: 'computed',\r\n requirement: {\r\n value: 'must',\r\n },\r\n returnsValue: true,\r\n apply({ key, mods, rx, error }) {\r\n if (key) {\r\n mergePaths([[modifyCasing(key, mods), computed(rx)]])\r\n } else {\r\n const patch = Object.assign({}, rx() as Record any>)\r\n updateLeaves(patch, (old) => {\r\n if (typeof old === 'function') {\r\n return computed(old)\r\n } else {\r\n throw error('ComputedExpectedFunction')\r\n }\r\n })\r\n mergePatch(patch)\r\n }\r\n },\r\n})\r\n", "// Icon: oui:security-signal\r\n// Slug: Executes an expression when signals change.\r\n// Description: Executes an expression on page load and whenever any signals in the expression change.\r\n\r\nimport { attribute } from '@engine'\r\nimport { effect } from '@engine/signals'\r\n\r\nattribute({\r\n name: 'effect',\r\n requirement: {\r\n key: 'denied',\r\n value: 'must',\r\n },\r\n apply: ({ rx }) => effect(rx),\r\n})\r\n", "// Icon: streamline:signal-loading-remix\r\n// Slug: Creates an indicator for whether an SSE request is in flight.\r\n// Description: Creates a signal and sets its value to `true` while an SSE request request is in flight, otherwise `false`.\r\n\r\nimport { attribute } from '@engine'\r\nimport { DATASTAR_FETCH_EVENT } from '@engine/consts'\r\nimport { mergePaths } from '@engine/signals'\r\nimport type { DatastarFetchEvent } from '@engine/types'\r\nimport { FINISHED, STARTED } from '@plugins/actions/fetch'\r\nimport { modifyCasing } from '@utils/text'\r\n\r\nattribute({\r\n name: 'indicator',\r\n requirement: 'exclusive',\r\n apply({ el, key, mods, value }) {\r\n const signalName = key != null ? modifyCasing(key, mods) : value\r\n\r\n mergePaths([[signalName, false]])\r\n\r\n const watcher = ((event: CustomEvent) => {\r\n const { type, el: elt } = event.detail\r\n if (elt !== el) {\r\n return\r\n }\r\n switch (type) {\r\n case STARTED:\r\n mergePaths([[signalName, true]])\r\n break\r\n case FINISHED:\r\n mergePaths([[signalName, false]])\r\n break\r\n }\r\n }) as EventListener\r\n document.addEventListener(DATASTAR_FETCH_EVENT, watcher)\r\n return () => {\r\n mergePaths([[signalName, false]])\r\n document.removeEventListener(DATASTAR_FETCH_EVENT, watcher)\r\n }\r\n },\r\n})\r\n", "export const tagToMs = (args: Set) => {\r\n if (!args || args.size <= 0) return 0\r\n for (const arg of args) {\r\n if (arg.endsWith('ms')) {\r\n return +arg.replace('ms', '')\r\n }\r\n if (arg.endsWith('s')) {\r\n return +arg.replace('s', '') * 1000\r\n }\r\n try {\r\n return Number.parseFloat(arg)\r\n } catch (_) {}\r\n }\r\n return 0\r\n}\r\n\r\nexport const tagHas = (\r\n tags: Set,\r\n tag: string,\r\n defaultValue = false,\r\n) => {\r\n if (!tags) return defaultValue\r\n return tags.has(tag.toLowerCase())\r\n}\r\n\r\nexport const tagFirst = (tags?: Set, defaultValue = ''): string => {\r\n if (tags && tags.size > 0) {\r\n for (const tag of tags) {\r\n return tag\r\n }\r\n }\r\n return defaultValue\r\n}\r\n", "import type { EventCallbackHandler, Modifiers } from '@engine/types'\r\nimport { tagHas, tagToMs } from '@utils/tags'\r\n\r\nexport const delay = (\r\n callback: EventCallbackHandler,\r\n wait: number,\r\n): EventCallbackHandler => {\r\n return (...args: any[]) => {\r\n setTimeout(() => {\r\n callback(...args)\r\n }, wait)\r\n }\r\n}\r\n\r\nexport const throttle = (\r\n callback: EventCallbackHandler,\r\n wait: number,\r\n leading = true,\r\n trailing = false,\r\n debounce = false,\r\n): EventCallbackHandler => {\r\n let lastArgs: Parameters | null = null\r\n let timer = 0\r\n\r\n return (...args: any[]) => {\r\n if (leading && !timer) {\r\n callback(...args)\r\n lastArgs = null\r\n } else {\r\n lastArgs = args\r\n }\r\n if (!timer || debounce) {\r\n if (timer) {\r\n clearTimeout(timer)\r\n }\r\n timer = setTimeout(() => {\r\n if (trailing && lastArgs !== null) {\r\n callback(...lastArgs)\r\n }\r\n lastArgs = null\r\n timer = 0\r\n }, wait)\r\n }\r\n }\r\n}\r\n\r\nexport const modifyTiming = (\r\n callback: EventCallbackHandler,\r\n mods: Modifiers,\r\n): EventCallbackHandler => {\r\n const delayArgs = mods.get('delay')\r\n if (delayArgs) {\r\n const wait = tagToMs(delayArgs)\r\n callback = delay(callback, wait)\r\n }\r\n\r\n const debounceArgs = mods.get('debounce')\r\n if (debounceArgs) {\r\n const wait = tagToMs(debounceArgs)\r\n const leading = tagHas(debounceArgs, 'leading', false)\r\n const trailing = !tagHas(debounceArgs, 'notrailing', false)\r\n callback = throttle(callback, wait, leading, trailing, true)\r\n }\r\n\r\n const throttleArgs = mods.get('throttle')\r\n if (throttleArgs) {\r\n const wait = tagToMs(throttleArgs)\r\n const leading = !tagHas(throttleArgs, 'noleading', false)\r\n const trailing = tagHas(throttleArgs, 'trailing', false)\r\n callback = throttle(callback, wait, leading, trailing)\r\n }\r\n\r\n return callback\r\n}\r\n", "import type { EventCallbackHandler, Modifiers } from '@engine/types'\r\n\r\nexport const supportsViewTransitions = !!document.startViewTransition\r\n\r\nexport const modifyViewTransition = (\r\n callback: EventCallbackHandler,\r\n mods: Modifiers,\r\n): EventCallbackHandler => {\r\n if (mods.has('viewtransition') && supportsViewTransitions) {\r\n const cb = callback // I hate javascript\r\n callback = (...args: any[]) =>\r\n document.startViewTransition(() => cb(...args))\r\n }\r\n\r\n return callback\r\n}\r\n", "// Icon: material-symbols:timer-play-outline\r\n// Slug: Runs an expression when loaded into the DOM.\r\n// Description: Runs an expression when the element is loaded into the DOM.\r\n\r\nimport { attribute } from '@engine'\r\nimport { beginBatch, endBatch } from '@engine/signals'\r\nimport { tagToMs } from '@utils/tags'\r\nimport { delay } from '@utils/timing'\r\nimport { modifyViewTransition } from '@utils/view-transitions'\r\n\r\nattribute({\r\n name: 'init',\r\n requirement: {\r\n key: 'denied',\r\n value: 'must',\r\n },\r\n apply({ rx, mods }) {\r\n let callback = () => {\r\n beginBatch()\r\n rx()\r\n endBatch()\r\n }\r\n callback = modifyViewTransition(callback, mods)\r\n let wait = 0\r\n const delayArgs = mods.get('delay')\r\n if (delayArgs) {\r\n wait = tagToMs(delayArgs)\r\n if (wait > 0) {\r\n callback = delay(callback, wait)\r\n }\r\n }\r\n callback()\r\n },\r\n})\r\n", "// Icon: si:json-fill\r\n// Slug: Outputs a JSON stringified version of signals.\r\n// Description: Sets the text content of an element to a reactive JSON stringified version of signals.\r\n\r\nimport { attribute } from '@engine'\r\nimport { effect, filtered } from '@engine/signals'\r\nimport type { SignalFilterOptions } from '@engine/types'\r\nimport { jsStrToObject } from '@utils/text'\r\n\r\nattribute({\r\n name: 'json-signals',\r\n requirement: {\r\n key: 'denied',\r\n },\r\n apply({ el, value, mods }) {\r\n const spaces = mods.has('terse') ? 0 : 2\r\n let filters: SignalFilterOptions = {}\r\n if (value) {\r\n filters = jsStrToObject(value)\r\n }\r\n\r\n const callback = () => {\r\n observer.disconnect()\r\n el.textContent = JSON.stringify(filtered(filters), null, spaces)\r\n observer.observe(el, {\r\n childList: true,\r\n characterData: true,\r\n subtree: true,\r\n })\r\n }\r\n const observer = new MutationObserver(callback)\r\n const cleanup = effect(callback)\r\n\r\n return () => {\r\n observer.disconnect()\r\n cleanup()\r\n }\r\n },\r\n})\r\n", "// Icon: material-symbols:mail\r\n// Slug: Attaches an event listener to an element.\r\n// Description: Attaches an event listener to an element, executing an expression whenever the event is triggered.\r\n\r\nimport { attribute } from '@engine'\r\nimport {\r\n DATASTAR_FETCH_EVENT,\r\n DATASTAR_SIGNAL_PATCH_EVENT,\r\n} from '@engine/consts'\r\nimport { beginBatch, endBatch } from '@engine/signals'\r\nimport { modifyCasing } from '@utils/text'\r\nimport { modifyTiming } from '@utils/timing'\r\nimport { modifyViewTransition } from '@utils/view-transitions'\r\n\r\nattribute({\r\n name: 'on',\r\n requirement: 'must',\r\n argNames: ['evt'],\r\n apply({ el, key, mods, rx }) {\r\n let target: Element | Window | Document = el\r\n if (mods.has('window')) target = window\r\n let callback = (evt?: Event) => {\r\n if (evt) {\r\n if (mods.has('prevent')) {\r\n evt.preventDefault()\r\n }\r\n if (mods.has('stop')) {\r\n evt.stopPropagation()\r\n }\r\n }\r\n beginBatch()\r\n rx(evt)\r\n endBatch()\r\n }\r\n callback = modifyViewTransition(callback, mods)\r\n callback = modifyTiming(callback, mods)\r\n const evtListOpts: AddEventListenerOptions = {\r\n capture: mods.has('capture'),\r\n passive: mods.has('passive'),\r\n once: mods.has('once'),\r\n }\r\n if (mods.has('outside')) {\r\n target = document\r\n const cb = callback\r\n callback = (evt?: Event) => {\r\n if (!el.contains(evt?.target as HTMLElement)) {\r\n cb(evt)\r\n }\r\n }\r\n }\r\n const eventName = modifyCasing(key, mods, 'kebab')\r\n // Listen for Datastar events on the document\r\n if (\r\n eventName === DATASTAR_FETCH_EVENT ||\r\n eventName === DATASTAR_SIGNAL_PATCH_EVENT\r\n ) {\r\n target = document\r\n }\r\n // Prevent default on form submit events\r\n if (el instanceof HTMLFormElement && eventName === 'submit') {\r\n const cb = callback\r\n callback = (evt?: Event) => {\r\n evt?.preventDefault()\r\n cb(evt)\r\n }\r\n }\r\n target.addEventListener(eventName, callback, evtListOpts)\r\n return () => {\r\n target.removeEventListener(eventName, callback)\r\n }\r\n },\r\n})\r\n", "export const clamp = (value: number, min: number, max: number): number => {\r\n return Math.max(min, Math.min(max, value))\r\n}\r\n\r\nexport const lerp = (\r\n min: number,\r\n max: number,\r\n t: number,\r\n clamped = true,\r\n): number => {\r\n const v = min + (max - min) * t\r\n return clamped ? clamp(v, min, max) : v\r\n}\r\n\r\nexport const inverseLerp = (\r\n min: number,\r\n max: number,\r\n value: number,\r\n clamped = true,\r\n): number => {\r\n if (value < min) return 0\r\n if (value > max) return 1\r\n const v = (value - min) / (max - min)\r\n return clamped ? clamp(v, min, max) : v\r\n}\r\n\r\nexport const fit = (\r\n value: number,\r\n inMin: number,\r\n inMax: number,\r\n outMin: number,\r\n outMax: number,\r\n clamped = true,\r\n rounded = false,\r\n): number => {\r\n const t = inverseLerp(inMin, inMax, value, clamped)\r\n const fitted = lerp(outMin, outMax, t, clamped)\r\n return rounded ? Math.round(fitted) : fitted\r\n}\r\n", "// Icon: mdi-light:vector-intersection\r\n// Slug: Runs an expression on intersection.\r\n// Description: Runs an expression when the element intersects with the viewport.\r\n\r\nimport { attribute } from '@engine'\r\nimport { beginBatch, endBatch } from '@engine/signals'\r\nimport type { HTMLOrSVG } from '@engine/types'\r\nimport { clamp } from '@utils/math'\r\nimport { modifyTiming } from '@utils/timing'\r\nimport { modifyViewTransition } from '@utils/view-transitions'\r\n\r\nconst once = new WeakSet()\r\n\r\nattribute({\r\n name: 'on-intersect',\r\n requirement: {\r\n key: 'denied',\r\n value: 'must',\r\n },\r\n apply({ el, mods, rx }) {\r\n let callback = () => {\r\n beginBatch()\r\n rx()\r\n endBatch()\r\n }\r\n callback = modifyViewTransition(callback, mods)\r\n callback = modifyTiming(callback, mods)\r\n const options = { threshold: 0 }\r\n if (mods.has('full')) {\r\n options.threshold = 1\r\n } else if (mods.has('half')) {\r\n options.threshold = 0.5\r\n } else if (mods.get('threshold')) {\r\n options.threshold = clamp(Number(mods.get('threshold')), 0, 100) / 100\r\n }\r\n const exit = mods.has('exit')\r\n let observer: IntersectionObserver | null = new IntersectionObserver(\r\n (entries) => {\r\n for (const entry of entries) {\r\n if (entry.isIntersecting !== exit) {\r\n callback()\r\n if (observer && once.has(el)) {\r\n observer.disconnect()\r\n }\r\n }\r\n }\r\n },\r\n options,\r\n )\r\n observer.observe(el)\r\n if (mods.has('once')) {\r\n once.add(el)\r\n }\r\n return () => {\r\n if (!mods.has('once')) {\r\n once.delete(el)\r\n }\r\n if (observer) {\r\n observer.disconnect()\r\n observer = null\r\n }\r\n }\r\n },\r\n})\r\n", "// Icon: material-symbols:timer-outline\r\n// Slug: Runs an expression at a regular interval.\r\n// Description: Runs an expression at a regular interval.\r\n\r\nimport { attribute } from '@engine'\r\nimport { beginBatch, endBatch } from '@engine/signals'\r\nimport { tagHas, tagToMs } from '@utils/tags'\r\nimport { modifyViewTransition } from '@utils/view-transitions'\r\n\r\nattribute({\r\n name: 'on-interval',\r\n requirement: {\r\n key: 'denied',\r\n value: 'must',\r\n },\r\n apply({ mods, rx }) {\r\n let callback = () => {\r\n beginBatch()\r\n rx()\r\n endBatch()\r\n }\r\n callback = modifyViewTransition(callback, mods)\r\n let duration = 1000\r\n const durationArgs = mods.get('duration')\r\n if (durationArgs) {\r\n duration = tagToMs(durationArgs)\r\n const leading = tagHas(durationArgs, 'leading', false)\r\n if (leading) {\r\n callback()\r\n }\r\n }\r\n const intervalId = setInterval(callback, duration)\r\n return () => {\r\n clearInterval(intervalId)\r\n }\r\n },\r\n})\r\n", "// Icon: material-symbols:change-circle-outline\r\n// Slug: Runs an expression when signals are patched.\r\n// Description: Runs an expression whenever one or more signals are patched.\r\n\r\nimport { attribute } from '@engine'\r\nimport { DATASTAR_SIGNAL_PATCH_EVENT } from '@engine/consts'\r\nimport { beginBatch, endBatch, filtered } from '@engine/signals'\r\nimport type { JSONPatch, SignalFilterOptions } from '@engine/types'\r\nimport { isEmpty } from '@utils/paths'\r\nimport { aliasify, jsStrToObject } from '@utils/text'\r\nimport { modifyTiming } from '@utils/timing'\r\n\r\nattribute({\r\n name: 'on-signal-patch',\r\n requirement: {\r\n value: 'must',\r\n },\r\n argNames: ['patch'],\r\n returnsValue: true,\r\n apply({ el, key, mods, rx, error }) {\r\n if (!!key && key !== 'filter') {\r\n throw error('KeyNotAllowed')\r\n }\r\n\r\n const filterAttr = aliasify(`${this.name}-filter`)\r\n const filtersRaw = el.getAttribute(filterAttr)\r\n let filters: SignalFilterOptions = {}\r\n if (filtersRaw) {\r\n filters = jsStrToObject(filtersRaw)\r\n }\r\n\r\n let running = false\r\n\r\n const callback: EventListener = modifyTiming(\r\n (evt: CustomEvent) => {\r\n if (running) return\r\n const watched = filtered(filters, evt.detail)\r\n if (!isEmpty(watched)) {\r\n running = true\r\n beginBatch()\r\n try {\r\n rx(watched)\r\n } finally {\r\n endBatch()\r\n running = false\r\n }\r\n }\r\n },\r\n mods,\r\n )\r\n\r\n document.addEventListener(DATASTAR_SIGNAL_PATCH_EVENT, callback)\r\n return () => {\r\n document.removeEventListener(DATASTAR_SIGNAL_PATCH_EVENT, callback)\r\n }\r\n },\r\n})\r\n", "// Icon: mdi:cursor-pointer\r\n// Slug: Creates a reference to an element.\r\n// Description: Creates a new signal that is a reference to the element on which the data attribute is placed.\r\n\r\nimport { attribute } from '@engine'\r\nimport { mergePaths } from '@engine/signals'\r\nimport { modifyCasing } from '@utils/text'\r\n\r\nattribute({\r\n name: 'ref',\r\n requirement: 'exclusive',\r\n apply({ el, key, mods, value }) {\r\n const signalName = key != null ? modifyCasing(key, mods) : value\r\n mergePaths([[signalName, el]])\r\n },\r\n})\r\n", "// Icon: streamline:interface-edit-view-eye-eyeball-open-view\r\n// Slug: Shows or hides an element.\r\n// Description: Shows or hides an element based on whether an expression evaluates to `true` or `false`.\r\n\r\nimport { attribute } from '@engine'\r\nimport { effect } from '@engine/signals'\r\n\r\nconst NONE = 'none'\r\nconst DISPLAY = 'display'\r\n\r\nattribute({\r\n name: 'show',\r\n requirement: {\r\n key: 'denied',\r\n value: 'must',\r\n },\r\n returnsValue: true,\r\n apply({ el, rx }) {\r\n const update = () => {\r\n observer.disconnect()\r\n const shouldShow = rx()\r\n if (shouldShow) {\r\n if (el.style.display === NONE) el.style.removeProperty(DISPLAY)\r\n } else {\r\n el.style.setProperty(DISPLAY, NONE)\r\n }\r\n observer.observe(el, { attributeFilter: ['style'] })\r\n }\r\n const observer = new MutationObserver(update)\r\n const cleanup = effect(update)\r\n\r\n return () => {\r\n observer.disconnect()\r\n cleanup()\r\n }\r\n },\r\n})\r\n", "// Icon: streamline:wifi-signal-full-remix\r\n// Slug: Patches signals into the existing signals.\r\n// Description: Patches (adds, updates or removes) one or more signals into the existing signals.\r\n\r\nimport { attribute } from '@engine'\r\nimport { mergePatch, mergePaths } from '@engine/signals'\r\nimport { modifyCasing } from '@utils/text'\r\n\r\nattribute({\r\n name: 'signals',\r\n returnsValue: true,\r\n apply({ key, mods, rx }) {\r\n const ifMissing = mods.has('ifmissing')\r\n\r\n if (key) {\r\n key = modifyCasing(key, mods)\r\n mergePaths([[key, rx?.()]], { ifMissing })\r\n } else {\r\n const patch = Object.assign({}, rx?.() as Record)\r\n mergePatch(patch, { ifMissing })\r\n }\r\n },\r\n})\r\n", "// Icon: material-symbols:format-paint-outline\r\n// Slug: Sets inline styles on an element based on an expression.\r\n// Description: Sets CSS styles on an element using either key-based or object syntax, and keeps them in sync with reactive signals.\r\n\r\nimport { attribute } from '@engine'\r\nimport { effect } from '@engine/signals'\r\nimport { kebab } from '@utils/text'\r\n\r\nattribute({\r\n name: 'style',\r\n requirement: {\r\n value: 'must',\r\n },\r\n returnsValue: true,\r\n apply({ key, el, rx }) {\r\n const { style } = el\r\n const initialStyles = new Map()\r\n\r\n const apply = (prop: string, value: any) => {\r\n const initial = initialStyles.get(prop)\r\n if (!value && value !== 0) {\r\n initial !== undefined &&\r\n (initial\r\n ? style.setProperty(prop, initial)\r\n : style.removeProperty(prop))\r\n } else {\r\n initial === undefined &&\r\n initialStyles.set(prop, style.getPropertyValue(prop))\r\n style.setProperty(prop, String(value))\r\n }\r\n }\r\n\r\n const update = () => {\r\n observer.disconnect()\r\n\r\n if (key) {\r\n apply(key, rx())\r\n } else {\r\n const styles = rx() as Record\r\n\r\n for (const [prop, initial] of initialStyles) {\r\n prop in styles ||\r\n (initial\r\n ? style.setProperty(prop, initial)\r\n : style.removeProperty(prop))\r\n }\r\n\r\n for (const prop in styles) {\r\n apply(kebab(prop), styles[prop])\r\n }\r\n }\r\n\r\n observer.observe(el, { attributeFilter: ['style'] })\r\n }\r\n\r\n const observer = new MutationObserver(update)\r\n const cleanup = effect(update)\r\n\r\n return () => {\r\n observer.disconnect()\r\n cleanup()\r\n for (const [prop, initial] of initialStyles) {\r\n initial ? style.setProperty(prop, initial) : style.removeProperty(prop)\r\n }\r\n }\r\n },\r\n})\r\n", "// Icon: icon-park-outline:text\r\n// Slug: Binds the text content of an element.\r\n// Description: Binds the text content of an element to an expression.\r\n\r\nimport { attribute } from '@engine'\r\nimport { effect } from '@engine/signals'\r\n\r\nattribute({\r\n name: 'text',\r\n requirement: {\r\n key: 'denied',\r\n value: 'must',\r\n },\r\n returnsValue: true,\r\n apply({ el, rx }) {\r\n const update = () => {\r\n observer.disconnect()\r\n el.textContent = `${rx()}`\r\n observer.observe(el, {\r\n childList: true,\r\n characterData: true,\r\n subtree: true,\r\n })\r\n }\r\n\r\n const observer = new MutationObserver(update)\r\n const cleanup = effect(update)\r\n\r\n return () => {\r\n observer.disconnect()\r\n cleanup()\r\n }\r\n },\r\n})\r\n", "// Icon: material-symbols:cloud-download\r\n// Slug: Patches elements into the DOM.\r\n// Description: Patches elements into the DOM.\r\n\r\nimport { watcher } from '@engine'\r\nimport type { WatcherContext } from '@engine/types'\r\nimport { isHTMLOrSVG } from '@utils/dom'\r\nimport { aliasify } from '@utils/text'\r\nimport { supportsViewTransitions } from '@utils/view-transitions'\r\n\r\nconst isValidType = (\r\n arr: T,\r\n value: string,\r\n): value is T[number] => (arr as readonly string[]).includes(value)\r\n\r\nconst PATCH_MODES = [\r\n 'remove',\r\n 'outer',\r\n 'inner',\r\n 'replace',\r\n 'prepend',\r\n 'append',\r\n 'before',\r\n 'after',\r\n] as const\r\ntype PatchElementsMode = (typeof PATCH_MODES)[number]\r\n\r\nconst NAMESPACES = ['html', 'svg', 'mathml'] as const\r\ntype Namespace = (typeof NAMESPACES)[number]\r\n\r\ntype PatchElementsArgs = {\r\n selector: string\r\n mode: PatchElementsMode\r\n namespace: Namespace\r\n useViewTransition: boolean\r\n elements: string\r\n}\r\n\r\nwatcher({\r\n name: 'datastar-patch-elements',\r\n apply(\r\n ctx,\r\n {\r\n selector = '',\r\n mode = 'outer',\r\n namespace = 'html',\r\n useViewTransition = '',\r\n elements = '',\r\n },\r\n ) {\r\n if (!isValidType(PATCH_MODES, mode)) {\r\n throw ctx.error('PatchElementsInvalidMode', { mode })\r\n }\r\n\r\n if (!selector && mode !== 'outer' && mode !== 'replace') {\r\n throw ctx.error('PatchElementsExpectedSelector')\r\n }\r\n\r\n if (!isValidType(NAMESPACES, namespace)) {\r\n throw ctx.error('PatchElementsInvalidNamespace', { namespace })\r\n }\r\n\r\n const args2: PatchElementsArgs = {\r\n selector,\r\n mode,\r\n namespace,\r\n useViewTransition: useViewTransition.trim() === 'true',\r\n elements,\r\n }\r\n\r\n if (supportsViewTransitions && useViewTransition) {\r\n document.startViewTransition(() => onPatchElements(ctx, args2))\r\n } else {\r\n onPatchElements(ctx, args2)\r\n }\r\n },\r\n})\r\n\r\nconst onPatchElements = (\r\n { error }: WatcherContext,\r\n { selector, mode, namespace, elements }: PatchElementsArgs,\r\n) => {\r\n const elementsWithSvgsRemoved = elements.replace(\r\n /]*>|>)([\\s\\S]*?)<\\/svg>/gim,\r\n '',\r\n )\r\n const hasHtml = /<\\/html>/.test(elementsWithSvgsRemoved)\r\n const hasHead = /<\\/head>/.test(elementsWithSvgsRemoved)\r\n const hasBody = /<\\/body>/.test(elementsWithSvgsRemoved)\r\n\r\n const wrapperTag =\r\n namespace === 'svg' ? 'svg' : namespace === 'mathml' ? 'math' : ''\r\n const wrappedEls = wrapperTag\r\n ? `<${wrapperTag}>${elements}`\r\n : elements\r\n\r\n const newDocument = new DOMParser().parseFromString(\r\n hasHtml || hasHead || hasBody\r\n ? elements\r\n : ``,\r\n 'text/html',\r\n )\r\n\r\n let newContent = document.createDocumentFragment()\r\n if (hasHtml) {\r\n newContent.appendChild(newDocument.documentElement)\r\n } else if (hasHead && hasBody) {\r\n newContent.appendChild(newDocument.head)\r\n newContent.appendChild(newDocument.body)\r\n } else if (hasHead) {\r\n newContent.appendChild(newDocument.head)\r\n } else if (hasBody) {\r\n newContent.appendChild(newDocument.body)\r\n } else if (wrapperTag) {\r\n const wrapperEl = newDocument\r\n .querySelector('template')!\r\n .content.querySelector(wrapperTag)!\r\n for (const child of wrapperEl.childNodes) {\r\n newContent.appendChild(child)\r\n }\r\n } else {\r\n newContent = newDocument.querySelector('template')!.content\r\n }\r\n\r\n if (!selector && (mode === 'outer' || mode === 'replace')) {\r\n for (const child of newContent.children) {\r\n let target: Element\r\n if (child instanceof HTMLHtmlElement) {\r\n target = document.documentElement\r\n } else if (child instanceof HTMLBodyElement) {\r\n target = document.body\r\n } else if (child instanceof HTMLHeadElement) {\r\n target = document.head\r\n } else {\r\n target = document.getElementById(child.id)!\r\n if (!target) {\r\n console.warn(error('PatchElementsNoTargetsFound'), {\r\n element: { id: child.id },\r\n })\r\n continue\r\n }\r\n }\r\n\r\n applyToTargets(mode as PatchElementsMode, child, [target])\r\n }\r\n } else {\r\n const targets = document.querySelectorAll(selector)\r\n if (!targets.length) {\r\n console.warn(error('PatchElementsNoTargetsFound'), { selector })\r\n return\r\n }\r\n\r\n applyToTargets(mode as PatchElementsMode, newContent, targets)\r\n }\r\n}\r\n\r\nconst scripts = new WeakSet()\r\nfor (const script of document.querySelectorAll('script')) {\r\n scripts.add(script)\r\n}\r\n\r\nconst execute = (target: Element): void => {\r\n const elScripts =\r\n target instanceof HTMLScriptElement\r\n ? [target]\r\n : target.querySelectorAll('script')\r\n for (const old of elScripts) {\r\n if (!scripts.has(old)) {\r\n const script = document.createElement('script')\r\n for (const { name, value } of old.attributes) {\r\n script.setAttribute(name, value)\r\n }\r\n script.text = old.text\r\n old.replaceWith(script)\r\n scripts.add(script)\r\n }\r\n }\r\n}\r\n\r\nconst applyPatchMode = (\r\n targets: Iterable,\r\n element: DocumentFragment | Element,\r\n action: string,\r\n) => {\r\n for (const target of targets) {\r\n const cloned = element.cloneNode(true) as Element\r\n execute(cloned)\r\n // @ts-expect-error\r\n target[action](cloned)\r\n }\r\n}\r\n\r\nconst applyToTargets = (\r\n mode: PatchElementsMode,\r\n element: DocumentFragment | Element,\r\n targets: Iterable,\r\n) => {\r\n switch (mode) {\r\n case 'remove':\r\n for (const target of targets) {\r\n target.remove()\r\n }\r\n break\r\n case 'outer':\r\n case 'inner':\r\n for (const target of targets) {\r\n morph(target, element.cloneNode(true) as Element, mode)\r\n execute(target)\r\n }\r\n break\r\n case 'replace':\r\n applyPatchMode(targets, element, 'replaceWith')\r\n break\r\n case 'prepend':\r\n case 'append':\r\n case 'before':\r\n case 'after':\r\n applyPatchMode(targets, element, mode)\r\n }\r\n}\r\n\r\nconst ctxIdMap = new Map>()\r\nconst ctxPersistentIds = new Set()\r\nconst oldIdTagNameMap = new Map()\r\nconst duplicateIds = new Set()\r\nconst ctxPantry = document.createElement('div')\r\nctxPantry.hidden = true\r\nlet ctxFutureMatches = new WeakSet()\r\nlet ctxActiveElementAndParents: Element[] = []\r\n\r\nconst aliasedIgnoreMorph = aliasify('ignore-morph')\r\nconst aliasedIgnoreMorphAttr = `[${aliasedIgnoreMorph}]`\r\nconst morph = (\r\n oldElt: Element | ShadowRoot,\r\n newContent: DocumentFragment | Element,\r\n mode: 'outer' | 'inner' = 'outer',\r\n): void => {\r\n if (\r\n (isHTMLOrSVG(oldElt) &&\r\n isHTMLOrSVG(newContent) &&\r\n oldElt.hasAttribute(aliasedIgnoreMorph) &&\r\n newContent.hasAttribute(aliasedIgnoreMorph)) ||\r\n oldElt.parentElement?.closest(aliasedIgnoreMorphAttr)\r\n ) {\r\n return\r\n }\r\n\r\n const normalizedElt = document.createElement('div')\r\n normalizedElt.append(newContent)\r\n document.body.insertAdjacentElement('afterend', ctxPantry)\r\n\r\n // Computes the set of IDs that persist between the two contents excluding duplicates\r\n const oldIdElements = oldElt.querySelectorAll('[id]')\r\n for (const { id, tagName } of oldIdElements) {\r\n if (oldIdTagNameMap.has(id)) {\r\n duplicateIds.add(id)\r\n } else if (id) {\r\n oldIdTagNameMap.set(id, tagName)\r\n }\r\n }\r\n if (oldElt instanceof Element && oldElt.id) {\r\n if (oldIdTagNameMap.has(oldElt.id)) {\r\n duplicateIds.add(oldElt.id)\r\n } else {\r\n oldIdTagNameMap.set(oldElt.id, oldElt.tagName)\r\n }\r\n }\r\n\r\n ctxPersistentIds.clear()\r\n const newIdElements = normalizedElt.querySelectorAll('[id]')\r\n for (const { id, tagName } of newIdElements) {\r\n if (ctxPersistentIds.has(id)) {\r\n duplicateIds.add(id)\r\n } else if (oldIdTagNameMap.get(id) === tagName) {\r\n ctxPersistentIds.add(id)\r\n }\r\n }\r\n\r\n for (const id of duplicateIds) {\r\n ctxPersistentIds.delete(id)\r\n }\r\n\r\n oldIdTagNameMap.clear()\r\n duplicateIds.clear()\r\n ctxIdMap.clear()\r\n\r\n const parent = mode === 'outer' ? oldElt.parentElement! : oldElt\r\n populateIdMapWithTree(parent, oldIdElements)\r\n populateIdMapWithTree(normalizedElt, newIdElements)\r\n\r\n ctxFutureMatches = new WeakSet()\r\n ctxActiveElementAndParents = []\r\n let elt = document.activeElement\r\n while (elt !== oldElt) {\r\n if (!elt) break\r\n ctxActiveElementAndParents.push(elt)\r\n elt = elt.parentElement\r\n }\r\n\r\n morphChildren(\r\n parent,\r\n normalizedElt,\r\n mode === 'outer' ? oldElt : null,\r\n oldElt.nextSibling,\r\n )\r\n\r\n ctxPantry.remove()\r\n}\r\n\r\n// This is the core algorithm for matching up children.\r\n// The idea is to use ID sets to try to match up nodes as faithfully as possible.\r\n// We greedily match, which allows us to keep the algorithm fast,\r\n// but by using ID sets, we are able to better match up with content deeper in the DOM.\r\nconst morphChildren = (\r\n oldParent: Element | ShadowRoot, // the old content that we are merging the new content into\r\n newParent: Element, // the parent element of the new content\r\n insertionPoint: Node | null = null, // the point in the DOM we start morphing at (defaults to first child)\r\n endPoint: Node | null = null, // the point in the DOM we stop morphing at (defaults to after last child)\r\n): void => {\r\n // normalize\r\n if (\r\n oldParent instanceof HTMLTemplateElement &&\r\n newParent instanceof HTMLTemplateElement\r\n ) {\r\n // we can pretend the DocumentElement is an Element\r\n oldParent = oldParent.content as unknown as Element\r\n newParent = newParent.content as unknown as Element\r\n }\r\n insertionPoint ??= oldParent.firstChild\r\n\r\n // run through all the new content\r\n for (const newChild of newParent.childNodes) {\r\n // once we reach the end of the old parent content skip to the end and insert the rest\r\n if (insertionPoint && insertionPoint !== endPoint) {\r\n const bestMatch = findBestMatch(newChild, insertionPoint, endPoint)\r\n if (bestMatch) {\r\n // if the node to morph is not at the insertion point then move nodes before it to the end\r\n if (bestMatch !== insertionPoint) {\r\n moveNodesBetweenToEnd(\r\n oldParent,\r\n insertionPoint,\r\n bestMatch,\r\n endPoint,\r\n newChild,\r\n )\r\n }\r\n morphNode(bestMatch, newChild)\r\n insertionPoint = bestMatch.nextSibling\r\n continue\r\n }\r\n }\r\n\r\n // if the matching node is elsewhere in the original content\r\n if (newChild instanceof Element && ctxPersistentIds.has(newChild.id)) {\r\n // move it and all its children here and morph, will always be found\r\n // Search for an element by ID within the document and pantry, and move it using moveBefore.\r\n const movedChild = document.getElementById(newChild.id) as Element\r\n\r\n // Removes an element from its ancestors' ID maps.\r\n // This is needed when an element is moved from the \"future\" via `moveBeforeId`.\r\n // Otherwise, its erstwhile ancestors could be mistakenly moved to the pantry rather than being deleted,\r\n // preventing their removal hooks from being called.\r\n let current = movedChild\r\n while ((current = current.parentNode as Element)) {\r\n const idSet = ctxIdMap.get(current)\r\n if (idSet) {\r\n idSet.delete(newChild.id)\r\n if (!idSet.size) {\r\n ctxIdMap.delete(current)\r\n }\r\n }\r\n }\r\n\r\n moveBefore(oldParent, movedChild, insertionPoint)\r\n morphNode(movedChild, newChild)\r\n insertionPoint = movedChild.nextSibling\r\n continue\r\n }\r\n\r\n // This performs the action of inserting a new node while handling situations where the node contains\r\n // elements with persistent IDs and possible state info we can still preserve by moving in and then morphing\r\n if (ctxIdMap.has(newChild)) {\r\n // node has children with IDs with possible state so create a dummy elt of same type and apply full morph algorithm\r\n const namespaceURI = (newChild as Element).namespaceURI\r\n const tagName = (newChild as Element).tagName\r\n const newEmptyChild =\r\n namespaceURI && namespaceURI !== 'http://www.w3.org/1999/xhtml'\r\n ? document.createElementNS(namespaceURI, tagName)\r\n : document.createElement(tagName)\r\n oldParent.insertBefore(newEmptyChild, insertionPoint)\r\n morphNode(newEmptyChild, newChild)\r\n insertionPoint = newEmptyChild.nextSibling\r\n } else {\r\n // optimization: no id state to preserve so we can just insert a clone of the newChild and its descendants\r\n const newClonedChild = document.importNode(newChild, true) // importNode to not mutate newParent\r\n oldParent.insertBefore(newClonedChild, insertionPoint)\r\n insertionPoint = newClonedChild.nextSibling\r\n }\r\n }\r\n\r\n // remove any remaining old nodes that didn't match up with new content\r\n while (insertionPoint && insertionPoint !== endPoint) {\r\n const tempNode = insertionPoint\r\n insertionPoint = insertionPoint.nextSibling\r\n removeNode(tempNode)\r\n }\r\n}\r\n\r\nconst matchesUpcomingSibling = (\r\n oldNode: Node,\r\n startNode: Node,\r\n limit = 5,\r\n): boolean => {\r\n if (ctxFutureMatches.has(oldNode)) return true\r\n for (\r\n let sibling = startNode.nextSibling, i = 0;\r\n sibling && i < limit;\r\n sibling = sibling.nextSibling, i++\r\n ) {\r\n if (oldNode.isEqualNode(sibling)) {\r\n ctxFutureMatches.add(oldNode)\r\n return true\r\n }\r\n }\r\n return false\r\n}\r\n\r\n// Scans forward from startPoint to endPoint looking for the best match for node.\r\n// Priority: id set match > exact/attribute match > tag match\r\nconst findBestMatch = (\r\n node: Node,\r\n startPoint: Node | null,\r\n endPoint: Node | null,\r\n): Node | null => {\r\n // non-element nodes: only check first position, don't scan siblings\r\n if (node.nodeType !== 1) {\r\n return startPoint?.nodeType === node.nodeType ? startPoint : null\r\n }\r\n\r\n let softMatch: Node | null = null\r\n let displaceMatchCount = 0\r\n\r\n // Max ID matches we are willing to displace in our search\r\n const nodeMatchCount = ctxIdMap.get(node)?.size || 0\r\n let scanLimit = 10\r\n\r\n let cursor = startPoint\r\n while (cursor && cursor !== endPoint) {\r\n // soft matching is a prerequisite for id set matching\r\n if (isSoftMatch(cursor, node)) {\r\n const oldSet = ctxIdMap.get(cursor)\r\n const newSet = ctxIdMap.get(node)\r\n\r\n if (newSet && oldSet) {\r\n for (const id of oldSet) {\r\n // a potential match is an id in the new and old nodes that\r\n // has not already been merged into the DOM\r\n // But the newNode content we call this on has not been\r\n // merged yet and we don't allow duplicate IDs so it is simple\r\n if (newSet.has(id)) {\r\n return cursor // found an id set match, we're done!\r\n }\r\n }\r\n }\r\n\r\n // we haven\u2019t yet saved a soft match fallback\r\n // the current soft match will hard match something else in the future, leave it\r\n // only consider nodes without id children (avoid moving nodes with state)\r\n if (!ctxIdMap.has(cursor)) {\r\n // exact match within scan window\r\n if (scanLimit > 0 && cursor.isEqualNode(node)) {\r\n return cursor\r\n }\r\n // save first tag-only match as fallback\r\n if (!softMatch) {\r\n softMatch = cursor\r\n }\r\n }\r\n }\r\n\r\n // stop if we've displaced more IDs than the node contains\r\n displaceMatchCount += ctxIdMap.get(cursor)?.size || 0\r\n if (displaceMatchCount > nodeMatchCount) break\r\n\r\n // stop if cursor contains active element to avoid losing focus\r\n if (ctxActiveElementAndParents.includes(cursor as Element)) break\r\n\r\n // stop scanning after limit if node has no ID children to match\r\n if (--scanLimit < 1 && !nodeMatchCount) break\r\n\r\n cursor = cursor.nextSibling\r\n }\r\n\r\n // if softMatch will be used by an upcoming sibling, insert current node instead\r\n if (softMatch && matchesUpcomingSibling(softMatch, node)) {\r\n return null\r\n }\r\n\r\n return softMatch\r\n}\r\n\r\n// ok to cast: if one is not element, `id` and `tagName` will be null and we'll just compare that.\r\nconst isSoftMatch = (oldNode: Node, newNode: Node): boolean =>\r\n oldNode.nodeType === newNode.nodeType &&\r\n (oldNode as Element).tagName === (newNode as Element).tagName &&\r\n // If oldElt has an `id` with possible state and it doesn\u2019t match newElt.id then avoid morphing.\r\n // We'll still match an anonymous node with an IDed newElt, though, because if it got this far,\r\n // its not persistent, and new nodes can't have any hidden state.\r\n (!(oldNode as Element).id ||\r\n (oldNode as Element).id === (newNode as Element).id)\r\n\r\n// Gets rid of an unwanted DOM node; strategy depends on nature of its reuse:\r\n// - Persistent nodes will be moved to the pantry for later reuse\r\n// - Other nodes will have their hooks called, and then are removed\r\nconst removeNode = (node: Node): void => {\r\n // are we going to id set match this later?\r\n ctxIdMap.has(node)\r\n ? moveBefore(ctxPantry, node, null)\r\n : node.parentNode?.removeChild(node)\r\n}\r\n\r\nconst moveNodesBetweenToEnd = (\r\n oldParent: Element | ShadowRoot,\r\n startInclusive: Node,\r\n endExclusive: Node,\r\n originalEndPoint: Node | null,\r\n currentNewChild: Node,\r\n): void => {\r\n let cursor: Node | null = startInclusive\r\n while (cursor && cursor !== endExclusive) {\r\n const tempNode = cursor\r\n cursor = cursor.nextSibling\r\n if (\r\n tempNode instanceof Element &&\r\n (ctxIdMap.has(tempNode) ||\r\n matchesUpcomingSibling(tempNode, currentNewChild, 5))\r\n ) {\r\n moveBefore(oldParent, tempNode, originalEndPoint)\r\n } else {\r\n removeNode(tempNode)\r\n }\r\n }\r\n}\r\n\r\n// Moves an element before another element within the same parent.\r\n// Uses the proposed `moveBefore` API if available (and working), otherwise falls back to `insertBefore`.\r\n// This is essentially a forward-compat wrapper.\r\nconst moveBefore: (parentNode: Node, node: Node, after: Node | null) => void =\r\n // @ts-expect-error\r\n removeNode.call.bind(ctxPantry.moveBefore ?? ctxPantry.insertBefore)\r\n\r\nconst aliasedPreserveAttr = aliasify('preserve-attr')\r\n\r\n// syncs the oldNode to the newNode, copying over all attributes and\r\n// inner element state from the newNode to the oldNode\r\nconst morphNode = (\r\n oldNode: Node, // root node to merge content into\r\n newNode: Node, // new content to merge\r\n): Node => {\r\n const type = newNode.nodeType\r\n\r\n // if is an element type, sync the attributes from the\r\n // new node into the new node\r\n if (type === 1 /* element type */) {\r\n const oldElt = oldNode as Element\r\n const newElt = newNode as Element\r\n const shouldScopeChildren = oldElt.hasAttribute('data-scope-children')\r\n if (\r\n oldElt.hasAttribute(aliasedIgnoreMorph) &&\r\n newElt.hasAttribute(aliasedIgnoreMorph)\r\n ) {\r\n return oldNode\r\n }\r\n\r\n // many bothans died to bring us this information:\r\n // https://github.com/patrick-steele-idem/morphdom/blob/master/src/specialElHandlers.js\r\n // https://github.com/choojs/nanomorph/blob/master/lib/morph.js#L113\r\n if (\r\n oldElt instanceof HTMLInputElement &&\r\n newElt instanceof HTMLInputElement &&\r\n newElt.type !== 'file'\r\n ) {\r\n // https://github.com/bigskysoftware/idiomorph/issues/27\r\n // | old input value | new input value | behaviour |\r\n // | --------------- | ---------------- | -------------------------------------- |\r\n // | `null` | `null` | preserve old input value |\r\n // | some value | the same value | preserve old input value |\r\n // | some value | `null` | set old input value to `\"\"` |\r\n // | `null` | some value | set old input value to new input value |\r\n // | some value | some other value | set old input value to new input value |\r\n if (newElt.getAttribute('value') !== oldElt.getAttribute('value')) {\r\n oldElt.value = newElt.getAttribute('value') ?? ''\r\n }\r\n } else if (\r\n oldElt instanceof HTMLTextAreaElement &&\r\n newElt instanceof HTMLTextAreaElement\r\n ) {\r\n if (newElt.value !== oldElt.value) {\r\n oldElt.value = newElt.value\r\n }\r\n if (oldElt.firstChild && oldElt.firstChild.nodeValue !== newElt.value) {\r\n oldElt.firstChild.nodeValue = newElt.value\r\n }\r\n }\r\n\r\n const preserveAttrs = (\r\n (newNode as HTMLElement).getAttribute(aliasedPreserveAttr) ?? ''\r\n ).split(' ')\r\n\r\n for (const { name, value } of newElt.attributes) {\r\n if (\r\n oldElt.getAttribute(name) !== value &&\r\n !preserveAttrs.includes(name)\r\n ) {\r\n oldElt.setAttribute(name, value)\r\n }\r\n }\r\n\r\n for (let i = oldElt.attributes.length - 1; i >= 0; i--) {\r\n const { name } = oldElt.attributes[i]!\r\n if (!newElt.hasAttribute(name) && !preserveAttrs.includes(name)) {\r\n oldElt.removeAttribute(name)\r\n }\r\n }\r\n\r\n // Preserve the scope marker even if the incoming markup doesn't carry it.\r\n if (shouldScopeChildren && !oldElt.hasAttribute('data-scope-children')) {\r\n oldElt.setAttribute('data-scope-children', '')\r\n }\r\n\r\n if (!oldElt.isEqualNode(newElt)) {\r\n morphChildren(oldElt, newElt)\r\n }\r\n\r\n if (shouldScopeChildren) {\r\n oldElt.dispatchEvent(\r\n new CustomEvent('datastar:scope-children', { bubbles: false }),\r\n )\r\n }\r\n }\r\n\r\n if (type === 8 /* comment */ || type === 3 /* text */) {\r\n if (oldNode.nodeValue !== newNode.nodeValue) {\r\n oldNode.nodeValue = newNode.nodeValue\r\n }\r\n }\r\n\r\n return oldNode\r\n}\r\n\r\n// A bottom-up algorithm that populates a map of Element -> IdSet.\r\n// The ID set for a given element is the set of all IDs contained within its subtree.\r\n// As an optimization, we filter these IDs through the given list of persistent IDs,\r\n// because we don't need to bother considering IDed elements that won't be in the new content.\r\nconst populateIdMapWithTree = (\r\n root: Element | ShadowRoot | null,\r\n elements: Iterable,\r\n): void => {\r\n for (const elt of elements) {\r\n if (ctxPersistentIds.has(elt.id)) {\r\n let current: Element | null = elt\r\n // walk up the parent hierarchy of that element, adding the ID of element to the parent's ID set\r\n while (current && current !== root) {\r\n let idSet = ctxIdMap.get(current)\r\n // if the ID set doesn\u2019t exist, create it and insert it in the map\r\n if (!idSet) {\r\n idSet = new Set()\r\n ctxIdMap.set(current, idSet)\r\n }\r\n idSet.add(elt.id)\r\n current = current.parentElement\r\n }\r\n }\r\n }\r\n}\r\n", "// Icon: material-symbols:settings-input-antenna\r\n// Slug: Patches signals.\r\n// Description: Patches signals.\r\n\r\nimport { watcher } from '@engine'\r\nimport { mergePatch } from '@engine/signals'\r\nimport { jsStrToObject } from '@utils/text'\r\n\r\nwatcher({\r\n name: 'datastar-patch-signals',\r\n apply({ error }, { signals, onlyIfMissing }) {\r\n if (signals) {\r\n const ifMissing = onlyIfMissing?.trim() === 'true'\r\n mergePatch(jsStrToObject(signals), { ifMissing })\r\n } else {\r\n throw error('PatchSignalsExpectedSignals')\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", "isEmpty", "prop", "hasOwn", "updateLeaves", "fn", "key", "val", "pathToObj", "paths", "result", "path", "value", "keys", "lastKey", "acc", "currentPatch", "queuedEffects", "batchDepth", "notifyIndex", "queuedEffectsLength", "prevSub", "activeSub", "version", "beginBatch", "endBatch", "flush", "dispatch", "startPeeking", "sub", "stopPeeking", "signal", "initialValue", "signalOper", "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", "jsStrToObject", "raw", "caseFns", "str", "x", "modifyCasing", "mods", "defaultCase", "c", "aliasify", "name", "url", "error", "ctx", "reason", "metadata", "e", "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", "action", "_", "fn", "startPeeking", "stopPeeking", "action", "_", "value", "filter", "startPeeking", "masked", "filtered", "updateLeaves", "mergePatch", "stopPeeking", "action", "_", "filter", "startPeeking", "masked", "filtered", "updateLeaves", "oldValue", "mergePatch", "stopPeeking", "createHttpMethod", "name", "method", "openWhenHiddenDefault", "action", "el", "evt", "error", "cleanups", "url", "selector", "userHeaders", "contentType", "include", "exclude", "openWhenHidden", "payload", "requestCancellation", "retry", "retryInterval", "retryScaler", "retryMaxWaitMs", "retryMaxCount", "controller", "cleanupFn", "initialHeaders", "headers", "req", "response", "dispatchFetch", "ERROR", "type", "argsRawLines", "line", "i", "k", "v", "argsRaw", "isWrongContent", "RETRYING", "urlInstance", "queryParams", "startPeeking", "filtered", "stopPeeking", "body", "formEl", "formData", "submitter", "preventDefault", "multipart", "formParams", "key", "value", "STARTED", "fetchEventSource", "e", "FINISHED", "RETRIES_FAILED", "DATASTAR_FETCH_EVENT", "err", "getBytes", "stream", "onChunk", "reader", "result", "getLines", "onLine", "buffer", "position", "fieldLength", "discardTrailingNewline", "arr", "concat", "bufLength", "lineStart", "lineEnd", "getMessages", "onId", "onRetry", "onMessage", "message", "newMessage", "decoder", "field", "valueOffset", "a", "b", "res", "input", "inputSignal", "inputHeaders", "inputOnOpen", "onmessage", "onclose", "onerror", "inputFetch", "responseOverrides", "rest", "resolve", "reject", "curRequestController", "onVisibilityChange", "create", "retryTimer", "dispose", "fetch", "onopen", "retries", "baseRetryInterval", "curRequestSignal", "dispatchNonSSE", "dispatchType", "argNames", "n", "kebab", "o", "status", "isNoContentStatus", "isRedirectStatus", "isErrorStatus", "ct", "script", "scriptAttributesHeader", "id", "interval", "innerErr", "attribute", "el", "key", "rx", "syncAttr", "val", "update", "observer", "obj", "attributeFilter", "cleanup", "effect", "dataURIRegex", "empty", "aliasedBind", "aliasify", "attribute", "el", "key", "mods", "value", "error", "signalName", "modifyCasing", "get", "type", "set", "syncSignal", "files", "signalFiles", "f", "resolve", "reader", "match", "mergePaths", "typeMap", "option", "initialValue", "getPath", "path", "signalNameKebab", "inputs", "paths", "i", "input", "signalValue", "cleanup", "effect", "attribute", "key", "el", "mods", "rx", "modifyCasing", "classes", "callback", "observer", "k", "classNames", "cn", "name", "cleanup", "effect", "attribute", "key", "mods", "rx", "error", "mergePaths", "modifyCasing", "computed", "patch", "updateLeaves", "old", "mergePatch", "attribute", "rx", "effect", "attribute", "el", "key", "mods", "value", "signalName", "modifyCasing", "mergePaths", "watcher", "event", "type", "elt", "STARTED", "FINISHED", "DATASTAR_FETCH_EVENT", "tagToMs", "args", "arg", "tagHas", "tags", "tag", "defaultValue", "delay", "callback", "wait", "args", "throttle", "leading", "trailing", "debounce", "lastArgs", "timer", "modifyTiming", "mods", "delayArgs", "tagToMs", "debounceArgs", "tagHas", "throttleArgs", "supportsViewTransitions", "modifyViewTransition", "callback", "mods", "cb", "args", "attribute", "rx", "mods", "callback", "beginBatch", "endBatch", "modifyViewTransition", "wait", "delayArgs", "tagToMs", "delay", "attribute", "el", "value", "mods", "spaces", "filters", "jsStrToObject", "callback", "observer", "filtered", "cleanup", "effect", "attribute", "el", "key", "mods", "rx", "target", "callback", "evt", "beginBatch", "endBatch", "modifyViewTransition", "modifyTiming", "evtListOpts", "cb", "eventName", "modifyCasing", "DATASTAR_FETCH_EVENT", "DATASTAR_SIGNAL_PATCH_EVENT", "clamp", "value", "min", "max", "once", "attribute", "el", "mods", "rx", "callback", "beginBatch", "endBatch", "modifyViewTransition", "modifyTiming", "options", "clamp", "exit", "observer", "entries", "entry", "attribute", "mods", "rx", "callback", "beginBatch", "endBatch", "modifyViewTransition", "duration", "durationArgs", "tagToMs", "tagHas", "intervalId", "attribute", "el", "key", "mods", "rx", "error", "filterAttr", "aliasify", "filtersRaw", "filters", "jsStrToObject", "running", "callback", "modifyTiming", "evt", "watched", "filtered", "isEmpty", "beginBatch", "endBatch", "DATASTAR_SIGNAL_PATCH_EVENT", "attribute", "el", "key", "mods", "value", "signalName", "modifyCasing", "mergePaths", "NONE", "DISPLAY", "attribute", "el", "rx", "update", "observer", "cleanup", "effect", "attribute", "key", "mods", "rx", "ifMissing", "modifyCasing", "mergePaths", "patch", "mergePatch", "attribute", "key", "el", "rx", "style", "initialStyles", "apply", "prop", "value", "initial", "update", "observer", "styles", "kebab", "cleanup", "effect", "attribute", "el", "rx", "update", "observer", "cleanup", "effect", "isValidType", "arr", "value", "PATCH_MODES", "NAMESPACES", "watcher", "ctx", "selector", "mode", "namespace", "useViewTransition", "elements", "args2", "supportsViewTransitions", "onPatchElements", "error", "elementsWithSvgsRemoved", "hasHtml", "hasHead", "hasBody", "wrapperTag", "wrappedEls", "newDocument", "newContent", "wrapperEl", "child", "target", "applyToTargets", "targets", "scripts", "script", "execute", "elScripts", "old", "name", "applyPatchMode", "element", "action", "cloned", "morph", "ctxIdMap", "ctxPersistentIds", "oldIdTagNameMap", "duplicateIds", "ctxPantry", "ctxFutureMatches", "ctxActiveElementAndParents", "aliasedIgnoreMorph", "aliasify", "aliasedIgnoreMorphAttr", "oldElt", "isHTMLOrSVG", "normalizedElt", "oldIdElements", "id", "tagName", "newIdElements", "parent", "populateIdMapWithTree", "elt", "morphChildren", "oldParent", "newParent", "insertionPoint", "endPoint", "newChild", "bestMatch", "findBestMatch", "moveNodesBetweenToEnd", "morphNode", "movedChild", "current", "idSet", "moveBefore", "namespaceURI", "newEmptyChild", "newClonedChild", "tempNode", "removeNode", "matchesUpcomingSibling", "oldNode", "startNode", "limit", "sibling", "i", "node", "startPoint", "softMatch", "displaceMatchCount", "nodeMatchCount", "scanLimit", "cursor", "isSoftMatch", "oldSet", "newSet", "newNode", "startInclusive", "endExclusive", "originalEndPoint", "currentNewChild", "aliasedPreserveAttr", "type", "newElt", "shouldScopeChildren", "preserveAttrs", "root", "watcher", "error", "signals", "onlyIfMissing", "ifMissing", "mergePatch", "jsStrToObject"] } From c35dca6fb4da53d2c8ee5b1311d3860b8cb2b89c Mon Sep 17 00:00:00 2001 From: MichaelWest22 Date: Wed, 4 Feb 2026 01:56:12 +1300 Subject: [PATCH 5/6] optimize newSet/oldSet and skip searching for id that is new. --- bundles/datastar.js | 12 +++++------ bundles/datastar.js.map | 6 +++--- library/src/plugins/watchers/patchElements.ts | 20 ++++++++++++------- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/bundles/datastar.js b/bundles/datastar.js index dc3002bd..ca159a3c 100644 --- a/bundles/datastar.js +++ b/bundles/datastar.js @@ -1,8 +1,8 @@ -var ut=/🖕JS_DS🚀/.source,je=ut.slice(0,5),Ge=ut.slice(4),q="datastar-fetch",Z="datastar-signal-patch";var F=Object.hasOwn??Object.prototype.hasOwnProperty.call;var U=e=>e!==null&&typeof e=="object"&&(Object.getPrototypeOf(e)===Object.prototype||Object.getPrototypeOf(e)===null),ft=e=>{for(let t in e)if(F(e,t))return!1;return!0},Y=(e,t)=>{for(let n in e){let s=e[n];U(s)||Array.isArray(s)?Y(s,t):e[n]=t(s)}},we=e=>{let t={};for(let[n,s]of e){let r=n.split("."),i=r.pop(),o=r.reduce((a,c)=>a[c]??={},t);o[i]=s}return t};var xe=[],Be=[],Pe=0,Me=0,We=0,Ue,j,Le=0,w=()=>{Pe++},x=()=>{--Pe||(mt(),J())},C=e=>{Ue=j,j=e},P=()=>{j=Ue,Ue=void 0},me=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},S=e=>{let t={fn_:e,flags_:2};j&&Ke(t,j),C(t),w();try{t.fn_()}finally{x(),P()}return yt.bind(0,t)},mt=()=>{for(;Me"getter"in e?gt(e):ht(e,e.value_),gt=e=>{C(e),vt(e);try{let t=e.value_;return t!==(e.value_=e.getter(t))}finally{P(),Et(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}},bt=(e,t)=>{if(t&16||t&32&&St(e.deps_,e)){C(e),vt(e),w();try{e.fn_()}finally{x(),P(),Et(e)}return}t&32&&(e.flags_=t&-33);let n=e.deps_;for(;n;){let s=n.dep_,r=s.flags_;r&64&&bt(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||mt()),!0}return!1}let n=e.value_;if(e.flags_&16&&ht(e,n)){let s=e.subs_;s&&Ce(s)}return j&&Ke(e,j),n},Kt=e=>{let t=e.flags_;if(t&16||t&32&&St(e.deps_,e)){if(gt(e)){let n=e.subs_;n&&Ce(n)}}else t&32&&(e.flags_=t&-33);return j&&Ke(e,j),e.value_},yt=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_,o=e.prevSub_;if(r?r.prevDep_=s:t.depsTail_=s,s?s.nextDep_=r:t.deps_=r,i?i.prevSub_=o:n.subsTail_=o,o)o.nextSub_=i;else if(!(n.subs_=i))if("getter"in n){let a=n.deps_;if(a){n.flags_=17;do a=Fe(a,n);while(a)}}else"previousValue"in n||yt(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 o=(e=i).nextSub_;o&&(n={value_:t,prev_:n},t=o);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},Et=e=>{let t=e.depsTail_,n=t?t.nextDep_:e.deps_;for(;n;)n=Fe(n,e);e.flags_&=-5},St=(e,t)=>{let n,s=0,r=!1;e:for(;;){let i=e.dep_,o=i.flags_;if(t.flags_&16)r=!0;else if((o&17)===17){if(dt(i)){let a=i.subs_;a.nextSub_&&Ce(a),r=!0}}else if((o&33)===33){(e.nextSub_||e.prevSub_)&&(n={value_:e,prev_:n}),e=i.deps_,t=i,++s;continue}if(!r){let a=e.nextDep_;if(a){e=a;continue}}for(;s--;){let a=t.subs_,c=a.nextSub_;if(c?(e=n.value_,n=n.prev_):e=a,r){if(dt(t)){c&&Ce(a),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=X,n=e.split(".");for(let s of n){if(t==null||!F(t,s))return;t=t[s]}return t},Ne=(e,t="")=>{let n=Array.isArray(e);if(n||U(e)){let s=n?[]:{};for(let i in e)s[i]=me(Ne(e[i],`${t+i}.`));let r=me(0);return new Proxy(s,{get(i,o){if(!(o==="toJSON"&&!F(s,o)))return n&&o in Array.prototype?(r(),s[o]):typeof o=="symbol"?s[o]:((!F(s,o)||s[o]()==null)&&(s[o]=me(""),J(t+o,""),r(r()+1)),s[o]())},set(i,o,a){let c=t+o;if(n&&o==="length"){let l=s[o]-a;if(s[o]=a,l>0){let u={};for(let d=a;d{if(e!==void 0&&t!==void 0&&xe.push([e,t]),!Pe&&xe.length){let n=we(xe);xe.length=0,document.dispatchEvent(new CustomEvent(Z,{detail:n}))}},O=(e,{ifMissing:t}={})=>{w();for(let n in e)e[n]==null?t||delete X[n]:Tt(e[n],n,X,"",t);x()},T=(e,t)=>O(we(e),t),Tt=(e,t,n,s,r)=>{if(U(e)){F(n,t)&&(U(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&&F(n,t)||(n[t]=e)},pt=e=>typeof e=="string"?RegExp(e.replace(/^\/|\/$/g,"")):e,D=({include:e=/.*/,exclude:t=/(?!)/}={},n=X)=>{let s=pt(e),r=pt(t),i=[],o=[[n,""]];for(;o.length;){let[a,c]=o.pop();for(let l in a){let u=c+l;U(a[l])?o.push([a[l],`${u}.`]):s.test(u)&&!r.test(u)&&i.push([u,oe(u)])}}return we(i)},X=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 _t=e=>ge(e).replace(/-/g,"_");var ae=e=>{try{return JSON.parse(e)}catch{return Function(`return (${e})`)()}},At={camel:e=>e.replace(/-[a-z]/g,t=>t[1].toUpperCase()),snake:e=>e.replace(/-/g,"_"),pascal:e=>e[0].toUpperCase()+At.camel(e.slice(1))},M=(e,t,n="camel")=>{for(let s of t.get("case")||[n])e=At[s]?.(e)||e;return e},G=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=_t(t),i=new URLSearchParams({metadata:JSON.stringify(n)}).toString(),o=JSON.stringify(n,null,2);return s.message=`${t} +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: ${o}`,s},be=new Map,Qe=new Map,wt=new Map,xt=new Proxy({},{get:(e,t)=>be.get(t)?.apply,has:(e,t)=>be.has(t),ownKeys:()=>Reflect.ownKeys(be),set:()=>!1,deleteProperty:()=>!1}),ye=new Map,ke=[],Ze=new Set,Xt=new WeakSet,m=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()})},k=e=>{be.set(e.name,e)};document.addEventListener(q,(e=>{let t=wt.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=>{wt.set(e.name,e)},Rt=e=>{for(let t of e){let n=ye.get(t);if(n&&ye.delete(t))for(let s of n.values())for(let r of s.values())r()}},Mt=G("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 o of i)z(o)&&(Rt([o]),Rt(o.querySelectorAll("*")));for(let o of r)z(o)&&(De([o]),De(o.querySelectorAll("*")))}else if(n==="attributes"&&s.startsWith("data-")&&z(t)&&!Lt(t)){let o=s.slice(5),a=t.getAttribute(s);if(a===null){let c=ye.get(t);if(c){let l=c.get(o);if(l){for(let u of l.values())u();c.delete(o)}}}else Nt(t,o,a)}},nn=new MutationObserver(tn),sn=e=>{let[t,...n]=e.split("__"),[s,r]=t.split(/:(.+)/),i=new Map;for(let o of n){let[a,...c]=o.split(".");i.set(a,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:o,mods:a}=sn(r),c=Qe.get(i);if((!s||Ze.has(i))&&c){let l={el:e,rawKey:r,mods:a,error:he.bind(0,{plugin:{type:"attribute",name:c.name},element:{id:e.id,tag:e.tagName},expression:{rawKey:r,key:o,value:n}}),key:o,value:n,loadedPluginNames:{actions:new Set(be.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",b=o!=null&&o!=="",f=n!=null&&n!=="";if(b){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(b&&f)throw l.error("KeyAndValueProvided");if(!b&&!f)throw l.error("KeyOrValueRequired")}let p=new Map;if(f){let v;l.rx=(..._)=>(v||(v=on(n,{returnsValue:c.returnsValue,argNames:c.argNames,cleanups:p})),v(e,..._))}let h=c.apply(l);h&&p.set("attribute",h);let y=ye.get(e);if(y){let v=y.get(r);if(v)for(let _ of v.values())_()}else y=new Map,ye.set(e,y);y.set(r,p)}}},on=(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,o=RegExp(`(?:${je})(.*?)(?:${Ge})`,"gm"),a=0;for(let c of r.matchAll(o)){let l=c[1],u=`__escaped${a++}`;i.set(u,l),r=r.replace(je+l+Ge,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=(b,f,...p)=>{let h=he.bind(0,{plugin:{type:"action",name:b},element:{id:l.id,tag:l.tagName},expression:{fnContent:r,value:e}}),y=xt[b];if(y)return y({el:l,evt:f,error:h,cleanups:s},...p);throw h("UndefinedAction")};try{return c(l,X,d,void 0,...u)}catch(b){throw console.error(b),he({element:{id:l.id,tag:l.tagName},expression:{fnContent:r,value:e},error:b.message},"ExecuteExpression")}}}catch(c){throw console.error(c),he({expression:{fnContent:r,value:e},error:c.message},"GenerateExpression")}};k({name:"peek",apply(e,t){C();try{return t()}finally{P()}}});k({name:"setAll",apply(e,t,n){C();let s=D(n);Y(s,()=>t),O(s),P()}});k({name:"toggleAll",apply(e,t){C();let n=D(t);Y(n,s=>!s),O(n),P()}});var Ee=(e,t,n=!0)=>k({name:e,apply:async({el:s,evt:r,error:i,cleanups:o},a,{selector:c,headers:l,contentType:u="json",filterSignals:{include:d=/.*/,exclude:b=/(^|\.)_/}={},openWhenHidden:f=n,payload:p,requestCancellation:h="auto",retry:y="auto",retryInterval:v=1e3,retryScaler:_=2,retryMaxWaitMs:I=3e4,retryMaxCount:ne=10}={})=>{let de=h instanceof AbortController?h:new AbortController;h==="auto"&&(o.get(`@${e}`)?.(),o.set(`@${e}`,async()=>{de.abort(),await Promise.resolve()}));let H=null;try{if(!a?.length)throw i("FetchNoUrlProvided",{action:k});let V={Accept:"text/event-stream, text/html, application/json","Datastar-Request":!0};u==="json"&&(V["Content-Type"]="application/json");let _e=Object.assign({},V,l),se={method:t,headers:_e,openWhenHidden:f,retry:y,retryInterval:v,retryScaler:_,retryMaxWaitMs:I,retryMaxCount:ne,signal:de.signal,onopen:async g=>{g.status>=400&&ee(an,s,{status:g.status.toString()})},onmessage:g=>{if(!g.event.startsWith("datastar"))return;let B=g.event,E={};for(let A of g.data.split(` -`)){let R=A.indexOf(" "),W=A.slice(0,R),He=A.slice(R+1);(E[W]||=[]).push(He)}let N=Object.fromEntries(Object.entries(E).map(([A,R])=>[A,R.join(` -`)]));ee(B,s,N)},onerror:g=>{if(Ft(g))throw g("FetchExpectedTextEventStream",{url:a});g&&(console.error(g.message),ee(cn,s,{message:g.message}))}},re=new URL(a,document.baseURI),ie=new URLSearchParams(re.search);if(u==="json"){C(),p=p!==void 0?p:D({include:d,exclude:b}),P();let g=JSON.stringify(p);t==="GET"?ie.set("datastar",g):se.body=g}else if(u==="form"){let g=c?document.querySelector(c):s.closest("form");if(!g)throw i("FetchFormNotFound",{action:k,selector:c});if(!g.noValidate&&!g.checkValidity()){g.reportValidity();return}let B=new FormData(g),E=s;if(s===g&&r instanceof SubmitEvent)E=r.submitter;else{let R=W=>W.preventDefault();g.addEventListener("submit",R),H=()=>{g.removeEventListener("submit",R)}}if(E instanceof HTMLButtonElement){let R=E.getAttribute("name");R&&B.append(R,E.value)}let N=g.getAttribute("enctype")==="multipart/form-data";N||(_e["Content-Type"]="application/x-www-form-urlencoded");let A=new URLSearchParams(B);if(t==="GET")for(let[R,W]of A)ie.append(R,W);else N?se.body=B:se.body=A}else throw i("FetchInvalidContentType",{action:k,contentType:u});ee(Ye,s,{}),re.search=ie.toString();try{await mn(re.toString(),s,se)}catch(g){if(!Ft(g))throw i("FetchFailed",{method:t,url:a,error:g.message})}}finally{ee(Xe,s,{}),H?.(),o.delete(`@${e}`)}}});Ee("get","GET",!1);Ee("patch","PATCH");Ee("post","POST");Ee("put","PUT");Ee("delete","DELETE");var Ye="started",Xe="finished",an="error",cn="retrying",ln="retries-failed",ee=(e,t,n)=>document.dispatchEvent(new CustomEvent(q,{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=pn(t,i):(t=i,n=0,s=-1);let o=t.length,a=0;for(;n{let s=Ct(),r=new TextDecoder;return(i,o)=>{if(!i.length)n?.(s),s=Ct();else if(o>0){let a=r.decode(i.subarray(0,o)),c=o+(i[o+1]===32?2:1),l=r.decode(i.subarray(c));switch(a){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}}}}},pn=(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}),mn=(e,t,{signal:n,headers:s,onopen:r,onmessage:i,onclose:o,onerror:a,openWhenHidden:c,fetch:l,retry:u="auto",retryInterval:d=1e3,retryScaler:b=2,retryMaxWaitMs:f=3e4,retryMaxCount:p=10,responseOverrides:h,...y})=>new Promise((v,_)=>{let I={...s},ne,de=()=>{ne.abort(),document.hidden||g()};c||document.addEventListener("visibilitychange",de);let H,V=()=>{document.removeEventListener("visibilitychange",de),clearTimeout(H),ne.abort()};n?.addEventListener("abort",()=>{V(),v()});let _e=l||window.fetch,se=r||(()=>{}),re=0,ie=d,g=async()=>{ne=new AbortController;let B=ne.signal;try{let E=await _e(e,{...y,headers:I,signal:B});await se(E);let N=async($,pe,$e,Ae,...Jt)=>{let lt={[$e]:await pe.text()};for(let Ie of Jt){let qe=pe.headers.get(`datastar-${ge(Ie)}`);if(Ae){let Re=Ae[Ie];Re&&(qe=typeof Re=="string"?Re:JSON.stringify(Re))}qe&&(lt[Ie]=qe)}ee($,t,lt),V(),v()},A=E.status,R=A===204,W=A>=300&&A<400,He=A>=400&&A<600;if(A!==200){if(o?.(),u!=="never"&&!R&&!W&&(u==="always"||u==="error"&&He)){clearTimeout(H),H=setTimeout(g,d);return}V(),v();return}re=0,d=ie;let Ve=E.headers.get("Content-Type");if(Ve?.includes("text/html"))return await N("datastar-patch-elements",E,"elements",h,"selector","mode","namespace","useViewTransition","namespace");if(Ve?.includes("application/json"))return await N("datastar-patch-signals",E,"signals",h,"onlyIfMissing");if(Ve?.includes("text/javascript")){let $=document.createElement("script"),pe=E.headers.get("datastar-script-attributes");if(pe)for(let[$e,Ae]of Object.entries(JSON.parse(pe)))$.setAttribute($e,Ae);$.textContent=await E.text(),document.head.appendChild($),V();return}if(await un(E.body,fn(dn($=>{$?I["last-event-id"]=$:delete I["last-event-id"]},$=>{ie=d=$},i))),o?.(),u==="always"&&!W){clearTimeout(H),H=setTimeout(g,d);return}V(),v()}catch(E){if(!B.aborted)try{let N=a?.(E)||d;clearTimeout(H),H=setTimeout(g,N),d=Math.min(d*b,f),++re>=p?(ee(ln,t,{}),V(),_("Max retries reached.")):console.error(`Datastar failed to reach ${e.toString()} retrying in ${N}ms.`)}catch(N){V(),_(N)}}};g()});m({name:"attr",requirement:{value:"must"},returnsValue:!0,apply({el:e,key:t,rx:n}){let s=(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))},r=t?()=>{i.disconnect();let a=n();s(t,a),i.observe(e,{attributeFilter:[t]})}:()=>{i.disconnect();let a=n(),c=Object.keys(a);for(let l of c)s(l,a[l]);i.observe(e,{attributeFilter:c})},i=new MutationObserver(r),o=S(r);return()=>{i.disconnect(),o()}}});var gn=/^data:(?[^;]+);base64,(?.*)$/,Pt=Symbol("empty"),Ot=G("bind");m({name:"bind",requirement:"exclusive",apply({el:e,key:t,mods:n,value:s,error:r}){let i=t!=null?M(t,n):s,o=(f,p)=>p==="number"?+f.value:f.value,a=f=>{e.value=`${f}`};if(e instanceof HTMLInputElement)switch(e.type){case"range":case"number":o=(f,p)=>p==="string"?f.value:+f.value;break;case"checkbox":o=(f,p)=>f.value!=="on"?p==="boolean"?f.checked:f.checked?f.value:"":p==="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",i),o=(f,p)=>f.checked?p==="number"?+f.value:f.value:Pt,a=f=>{e.checked=f===(typeof f=="number"?+e.value:e.value)};break;case"file":{let f=()=>{let p=[...e.files||[]],h=[];Promise.all(p.map(y=>new Promise(v=>{let _=new FileReader;_.onload=()=>{if(typeof _.result!="string")throw r("InvalidFileResultType",{resultType:typeof _.result});let I=_.result.match(gn);if(!I?.groups)throw r("InvalidDataUri",{result:_.result});h.push({name:y.name,contents:I.groups.contents,mime:I.groups.mime})},_.onloadend=()=>v(),_.readAsDataURL(y)}))).then(()=>{T([[i,h]])})};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;o=p=>[...p.selectedOptions].map(h=>{let y=f.get(h.value);return y==="string"||y==null?h.value:+h.value}),a=p=>{for(let h of e.options)p.includes(h.value)?(f.set(h.value,"string"),h.selected=!0):p.includes(+h.value)?(f.set(h.value,"number"),h.selected=!0):h.selected=!1}}}else e instanceof HTMLTextAreaElement||(o=f=>"value"in f?f.value:f.getAttribute("value"),a=f=>{"value"in e?e.value=f:e.setAttribute("value",f)});let c=oe(i),l=typeof c,u=i;if(Array.isArray(c)&&!(e instanceof HTMLSelectElement&&e.multiple)){let f=t||s,p=document.querySelectorAll(`[${Ot}\\:${CSS.escape(f)}],[${Ot}="${CSS.escape(f)}"]`),h=[],y=0;for(let v of p){if(h.push([`${u}.${y}`,o(v,"none")]),e===v)break;y++}T(h,{ifMissing:!0}),u=`${u}.${y}`}else T([[u,o(e,l)]],{ifMissing:!0});let d=()=>{let f=oe(u);if(f!=null){let p=o(e,typeof f);p!==Pt&&T([[u,p]])}};e.addEventListener("input",d),e.addEventListener("change",d);let b=S(()=>{a(oe(u))});return()=>{b(),e.removeEventListener("input",d),e.removeEventListener("change",d)}}});m({name:"class",requirement:{value:"must"},returnsValue:!0,apply({key:e,el:t,mods:n,rx:s}){e&&=M(e,n,"kebab");let r,i=()=>{o.disconnect(),r=e?{[e]:s()}:s();for(let c in r){let l=c.split(/\s+/).filter(u=>u.length>0);if(r[c])for(let u of l)t.classList.contains(u)||t.classList.add(u);else for(let u of l)t.classList.contains(u)&&t.classList.remove(u)}o.observe(t,{attributeFilter:["class"]})},o=new MutationObserver(i),a=S(i);return()=>{o.disconnect(),a();for(let c in r){let l=c.split(/\s+/).filter(u=>u.length>0);for(let u of l)t.classList.remove(u)}}}});m({name:"computed",requirement:{value:"must"},returnsValue:!0,apply({key:e,mods:t,rx:n,error:s}){if(e)T([[M(e,t),Oe(n)]]);else{let r=Object.assign({},n());Y(r,i=>{if(typeof i=="function")return Oe(i);throw s("ComputedExpectedFunction")}),O(r)}}});m({name:"effect",requirement:{key:"denied",value:"must"},apply:({rx:e})=>S(e)});m({name:"indicator",requirement:"exclusive",apply({el:e,key:t,mods:n,value:s}){let r=t!=null?M(t,n):s;T([[r,!1]]);let i=(o=>{let{type:a,el:c}=o.detail;if(c===e)switch(a){case Ye:T([[r,!0]]);break;case Xe:T([[r,!1]]);break}});return document.addEventListener(q,i),()=>{T([[r,!1]]),document.removeEventListener(q,i)}}});var K=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)},kt=(e,t,n=!0,s=!1,r=!1)=>{let i=null,o=0;return(...a)=>{n&&!o?(e(...a),i=null):i=a,(!o||r)&&(o&&clearTimeout(o),o=setTimeout(()=>{s&&i!==null&&e(...i),i=null,o=0},t))}},ce=(e,t)=>{let n=t.get("delay");if(n){let i=K(n);e=et(e,i)}let s=t.get("debounce");if(s){let i=K(s),o=te(s,"leading",!1),a=!te(s,"notrailing",!1);e=kt(e,i,o,a,!0)}let r=t.get("throttle");if(r){let i=K(r),o=!te(r,"noleading",!1),a=te(r,"trailing",!1);e=kt(e,i,o,a)}return e};var tt=!!document.startViewTransition,Q=(e,t)=>{if(t.has("viewtransition")&&tt){let n=e;e=(...s)=>document.startViewTransition(()=>n(...s))}return e};m({name:"init",requirement:{key:"denied",value:"must"},apply({rx:e,mods:t}){let n=()=>{w(),e(),x()};n=Q(n,t);let s=0,r=t.get("delay");r&&(s=K(r),s>0&&(n=et(n,s))),n()}});m({name:"json-signals",requirement:{key:"denied"},apply({el:e,value:t,mods:n}){let s=n.has("terse")?0:2,r={};t&&(r=ae(t));let i=()=>{o.disconnect(),e.textContent=JSON.stringify(D(r),null,s),o.observe(e,{childList:!0,characterData:!0,subtree:!0})},o=new MutationObserver(i),a=S(i);return()=>{o.disconnect(),a()}}});m({name:"on",requirement:"must",argNames:["evt"],apply({el:e,key:t,mods:n,rx:s}){let r=e;n.has("window")&&(r=window);let i=c=>{c&&(n.has("prevent")&&c.preventDefault(),n.has("stop")&&c.stopPropagation()),w(),s(c),x()};i=Q(i,n),i=ce(i,n);let o={capture:n.has("capture"),passive:n.has("passive"),once:n.has("once")};if(n.has("outside")){r=document;let c=i;i=l=>{e.contains(l?.target)||c(l)}}let a=M(t,n,"kebab");if((a===q||a===Z)&&(r=document),e instanceof HTMLFormElement&&a==="submit"){let c=i;i=l=>{l?.preventDefault(),c(l)}}return r.addEventListener(a,i,o),()=>{r.removeEventListener(a,i)}}});var Dt=(e,t,n)=>Math.max(t,Math.min(n,e));var nt=new WeakSet;m({name:"on-intersect",requirement:{key:"denied",value:"must"},apply({el:e,mods:t,rx:n}){let s=()=>{w(),n(),x()};s=Q(s,t),s=ce(s,t);let r={threshold:0};t.has("full")?r.threshold=1:t.has("half")?r.threshold=.5:t.get("threshold")&&(r.threshold=Dt(Number(t.get("threshold")),0,100)/100);let i=t.has("exit"),o=new IntersectionObserver(a=>{for(let c of a)c.isIntersecting!==i&&(s(),o&&nt.has(e)&&o.disconnect())},r);return o.observe(e),t.has("once")&&nt.add(e),()=>{t.has("once")||nt.delete(e),o&&(o.disconnect(),o=null)}}});m({name:"on-interval",requirement:{key:"denied",value:"must"},apply({mods:e,rx:t}){let n=()=>{w(),t(),x()};n=Q(n,e);let s=1e3,r=e.get("duration");r&&(s=K(r),te(r,"leading",!1)&&n());let i=setInterval(n,s);return()=>{clearInterval(i)}}});m({name:"on-signal-patch",requirement:{value:"must"},argNames:["patch"],returnsValue:!0,apply({el:e,key:t,mods:n,rx:s,error:r}){if(t&&t!=="filter")throw r("KeyNotAllowed");let i=G(`${this.name}-filter`),o=e.getAttribute(i),a={};o&&(a=ae(o));let c=!1,l=ce(u=>{if(c)return;let d=D(a,u.detail);if(!ft(d)){c=!0,w();try{s(d)}finally{x(),c=!1}}},n);return document.addEventListener(Z,l),()=>{document.removeEventListener(Z,l)}}});m({name:"ref",requirement:"exclusive",apply({el:e,key:t,mods:n,value:s}){let r=t!=null?M(t,n):s;T([[r,e]])}});var Ht="none",Vt="display";m({name:"show",requirement:{key:"denied",value:"must"},returnsValue:!0,apply({el:e,rx:t}){let n=()=>{s.disconnect(),t()?e.style.display===Ht&&e.style.removeProperty(Vt):e.style.setProperty(Vt,Ht),s.observe(e,{attributeFilter:["style"]})},s=new MutationObserver(n),r=S(n);return()=>{s.disconnect(),r()}}});m({name:"signals",returnsValue:!0,apply({key:e,mods:t,rx:n}){let s=t.has("ifmissing");if(e)e=M(e,t),T([[e,n?.()]],{ifMissing:s});else{let r=Object.assign({},n?.());O(r,{ifMissing:s})}}});m({name:"style",requirement:{value:"must"},returnsValue:!0,apply({key:e,el:t,rx:n}){let{style:s}=t,r=new Map,i=(l,u)=>{let d=r.get(l);!u&&u!==0?d!==void 0&&(d?s.setProperty(l,d):s.removeProperty(l)):(d===void 0&&r.set(l,s.getPropertyValue(l)),s.setProperty(l,String(u)))},o=()=>{if(a.disconnect(),e)i(e,n());else{let l=n();for(let[u,d]of r)u in l||(d?s.setProperty(u,d):s.removeProperty(u));for(let u in l)i(ge(u),l[u])}a.observe(t,{attributeFilter:["style"]})},a=new MutationObserver(o),c=S(o);return()=>{a.disconnect(),c();for(let[l,u]of r)u?s.setProperty(l,u):s.removeProperty(l)}}});m({name:"text",requirement:{key:"denied",value:"must"},returnsValue:!0,apply({el:e,rx:t}){let n=()=>{s.disconnect(),e.textContent=`${t()}`,s.observe(e,{childList:!0,characterData:!0,subtree:!0})},s=new MutationObserver(n),r=S(n);return()=>{s.disconnect(),r()}}});var $t=(e,t)=>e.includes(t),hn=["remove","outer","inner","replace","prepend","append","before","after"],bn=["html","svg","mathml"];ve({name:"datastar-patch-elements",apply(e,{selector:t="",mode:n="outer",namespace:s="html",useViewTransition:r="",elements:i=""}){if(!$t(hn,n))throw e.error("PatchElementsInvalidMode",{mode:n});if(!t&&n!=="outer"&&n!=="replace")throw e.error("PatchElementsExpectedSelector");if(!$t(bn,s))throw e.error("PatchElementsInvalidNamespace",{namespace:s});let o={selector:t,mode:n,namespace:s,useViewTransition:r.trim()==="true",elements:i};tt&&r?document.startViewTransition(()=>It(e,o)):It(e,o)}});var It=({error:e},{selector:t,mode:n,namespace:s,elements:r})=>{let i=r.replace(/]*>|>)([\s\S]*?)<\/svg>/gim,""),o=/<\/html>/.test(i),a=/<\/head>/.test(i),c=/<\/body>/.test(i),l=s==="svg"?"svg":s==="mathml"?"math":"",u=l?`<${l}>${r}`:r,d=new DOMParser().parseFromString(o||a||c?r:``,"text/html"),b=document.createDocumentFragment();if(o)b.appendChild(d.documentElement);else if(a&&c)b.appendChild(d.head),b.appendChild(d.body);else if(a)b.appendChild(d.head);else if(c)b.appendChild(d.body);else if(l){let f=d.querySelector("template").content.querySelector(l);for(let p of f.childNodes)b.appendChild(p)}else b=d.querySelector("template").content;if(!t&&(n==="outer"||n==="replace"))for(let f of b.children){let p;if(f instanceof HTMLHtmlElement)p=document.documentElement;else if(f instanceof HTMLBodyElement)p=document.body;else if(f instanceof HTMLHeadElement)p=document.head;else if(p=document.getElementById(f.id),!p){console.warn(e("PatchElementsNoTargetsFound"),{element:{id:f.id}});continue}jt(n,f,[p])}else{let f=document.querySelectorAll(t);if(!f.length){console.warn(e("PatchElementsNoTargetsFound"),{selector:t});return}jt(n,b,f)}},rt=new WeakSet;for(let e of document.querySelectorAll("script"))rt.add(e);var Bt=e=>{let t=e instanceof HTMLScriptElement?[e]:e.querySelectorAll("script");for(let n of t)if(!rt.has(n)){let s=document.createElement("script");for(let{name:r,value:i}of n.attributes)s.setAttribute(r,i);s.text=n.text,n.replaceWith(s),rt.add(s)}},qt=(e,t,n)=>{for(let s of e){let r=t.cloneNode(!0);Bt(r),s[n](r)}},jt=(e,t,n)=>{switch(e){case"remove":for(let s of n)s.remove();break;case"outer":case"inner":for(let s of n)vn(s,t.cloneNode(!0),e),Bt(s);break;case"replace":qt(n,t,"replaceWith");break;case"prepend":case"append":case"before":case"after":qt(n,t,e)}},L=new Map,ue=new Set,le=new Map,Se=new Set,fe=document.createElement("div");fe.hidden=!0;var it=new WeakSet,ot=[],Te=G("ignore-morph"),yn=`[${Te}]`,vn=(e,t,n="outer")=>{if(z(e)&&z(t)&&e.hasAttribute(Te)&&t.hasAttribute(Te)||e.parentElement?.closest(yn))return;let s=document.createElement("div");s.append(t),document.body.insertAdjacentElement("afterend",fe);let r=e.querySelectorAll("[id]");for(let{id:c,tagName:l}of r)le.has(c)?Se.add(c):c&&le.set(c,l);e instanceof Element&&e.id&&(le.has(e.id)?Se.add(e.id):le.set(e.id,e.tagName)),ue.clear();let i=s.querySelectorAll("[id]");for(let{id:c,tagName:l}of i)ue.has(c)?Se.add(c):le.get(c)===l&&ue.add(c);for(let c of Se)ue.delete(c);le.clear(),Se.clear(),L.clear();let o=n==="outer"?e.parentElement:e;Gt(o,r),Gt(s,i),it=new WeakSet,ot=[];let a=document.activeElement;for(;a!==e&&a;)ot.push(a),a=a.parentElement;Wt(o,s,n==="outer"?e:null,e.nextSibling),fe.remove()},Wt=(e,t,n=null,s=null)=>{e instanceof HTMLTemplateElement&&t instanceof HTMLTemplateElement&&(e=e.content,t=t.content),n??=e.firstChild;for(let r of t.childNodes){if(n&&n!==s){let i=En(r,n,s);if(i){i!==n&&Tn(e,n,i,s,r),st(i,r),n=i.nextSibling;continue}}if(r instanceof Element&&ue.has(r.id)){let i=document.getElementById(r.id),o=i;for(;o=o.parentNode;){let a=L.get(o);a&&(a.delete(r.id),a.size||L.delete(o))}ct(e,i,n),st(i,r),n=i.nextSibling;continue}if(L.has(r)){let i=r.namespaceURI,o=r.tagName,a=i&&i!=="http://www.w3.org/1999/xhtml"?document.createElementNS(i,o):document.createElement(o);e.insertBefore(a,n),st(a,r),n=a.nextSibling}else{let i=document.importNode(r,!0);e.insertBefore(i,n),n=i.nextSibling}}for(;n&&n!==s;){let r=n;n=n.nextSibling,at(r)}},Ut=(e,t,n=5)=>{if(it.has(e))return!0;for(let s=t.nextSibling,r=0;s&&r{if(e.nodeType!==1)return t?.nodeType===e.nodeType?t:null;let s=null,r=0,i=L.get(e)?.size||0,o=10,a=t;for(;a&&a!==n;){if(Sn(a,e)){let c=L.get(a),l=L.get(e);if(l&&c){for(let u of c)if(l.has(u))return a}if(!L.has(a)){if(o>0&&a.isEqualNode(e))return a;s||(s=a)}}if(r+=L.get(a)?.size||0,r>i||ot.includes(a)||--o<1&&!i)break;a=a.nextSibling}return s&&Ut(s,e)?null:s},Sn=(e,t)=>e.nodeType===t.nodeType&&e.tagName===t.tagName&&(!e.id||e.id===t.id),at=e=>{L.has(e)?ct(fe,e,null):e.parentNode?.removeChild(e)},Tn=(e,t,n,s,r)=>{let i=t;for(;i&&i!==n;){let o=i;i=i.nextSibling,o instanceof Element&&(L.has(o)||Ut(o,r,5))?ct(e,o,s):at(o)}},ct=at.call.bind(fe.moveBefore??fe.insertBefore),_n=G("preserve-attr"),st=(e,t)=>{let n=t.nodeType;if(n===1){let s=e,r=t,i=s.hasAttribute("data-scope-children");if(s.hasAttribute(Te)&&r.hasAttribute(Te))return e;s instanceof HTMLInputElement&&r instanceof HTMLInputElement&&r.type!=="file"?r.getAttribute("value")!==s.getAttribute("value")&&(s.value=r.getAttribute("value")??""):s instanceof HTMLTextAreaElement&&r instanceof HTMLTextAreaElement&&(r.value!==s.value&&(s.value=r.value),s.firstChild&&s.firstChild.nodeValue!==r.value&&(s.firstChild.nodeValue=r.value));let o=(t.getAttribute(_n)??"").split(" ");for(let{name:a,value:c}of r.attributes)s.getAttribute(a)!==c&&!o.includes(a)&&s.setAttribute(a,c);for(let a=s.attributes.length-1;a>=0;a--){let{name:c}=s.attributes[a];!r.hasAttribute(c)&&!o.includes(c)&&s.removeAttribute(c)}i&&!s.hasAttribute("data-scope-children")&&s.setAttribute("data-scope-children",""),s.isEqualNode(r)||Wt(s,r),i&&s.dispatchEvent(new CustomEvent("datastar:scope-children",{bubbles:!1}))}return(n===8||n===3)&&e.nodeValue!==t.nodeValue&&(e.nodeValue=t.nodeValue),e},Gt=(e,t)=>{for(let n of t)if(ue.has(n.id)){let s=n;for(;s&&s!==e;){let r=L.get(s);r||(r=new Set,L.set(s,r)),r.add(n.id),s=s.parentElement}}};ve({name:"datastar-patch-signals",apply({error:e},{signals:t,onlyIfMissing:n}){if(t){let s=n?.trim()==="true";O(ae(t),{ifMissing:s})}else throw e("PatchSignalsExpectedSignals")}});export{k as action,xt as actions,m as attribute,w as beginBatch,Oe as computed,S as effect,x as endBatch,D as filtered,oe as getPath,O as mergePatch,T as mergePaths,X as root,me as signal,C as startPeeking,P as stopPeeking,ve as watcher}; +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=/