diff --git a/README.md b/README.md
index 27674b626..f9488d480 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,7 @@
Datastar helps you build reactive web applications with the simplicity of server-side rendering and the power of a full-stack SPA framework.
-Getting started is as easy as adding a single 13.0 KiB script tag to your HTML.
+Getting started is as easy as adding a single 13.2 KiB script tag to your HTML.
```html
diff --git a/Taskfile.yml b/Taskfile.yml
index 4466f4d9e..6f2bdaab3 100644
--- a/Taskfile.yml
+++ b/Taskfile.yml
@@ -2,7 +2,7 @@
version: "3"
-interval: 100ms
+interval: 1000ms
vars:
VERSION:
diff --git a/build/consts.go b/build/consts.go
index 79ee93f4b..a8bbbe197 100644
--- a/build/consts.go
+++ b/build/consts.go
@@ -62,6 +62,12 @@ type ConstTemplateData struct {
var Consts = &ConstTemplateData{
DoNotEdit: "This is auto-generated by Datastar. DO NOT EDIT.",
SDKLanguages: []Language{
+ {
+ FileExtension: "clojure",
+ Name: "Clojure",
+ Icon: "vscode-icons:file-type-clojure",
+ SdkUrl: "https://github.com/starfederation/datastar/tree/main/sdk/clojure",
+ },
{
FileExtension: "dotnet",
Name: "Dotnet",
@@ -99,7 +105,7 @@ var Consts = &ConstTemplateData{
SdkUrl: "https://github.com/starfederation/datastar/tree/main/sdk/python",
},
{
- FileExtension: "rs",
+ FileExtension: "rust",
Name: "Rust",
Icon: "vscode-icons:file-type-rust",
SdkUrl: "https://github.com/starfederation/datastar/tree/main/sdk/rust",
diff --git a/build/consts_clojure.qtpl b/build/consts_clojure.qtpl
new file mode 100644
index 000000000..0d05902e3
--- /dev/null
+++ b/build/consts_clojure.qtpl
@@ -0,0 +1,79 @@
+{%- func clojureConsts(data *ConstTemplateData) -%}
+;; {%s data.DoNotEdit %}
+(ns starfederation.datastar.clojure.consts
+ (:require
+ [clojure.string :as string]))
+
+
+(def datastar-key "{%s data.DatastarKey %}")
+(def version "{%s data.Version %}")
+(def version-client-byte-size {%d data.VersionClientByteSize %})
+(def version-client-byte-size-gzip {%d data.VersionClientByteSizeGzip %})
+
+
+;; -----------------------------------------------------------------------------
+;; Default durations
+;; -----------------------------------------------------------------------------
+{%- for _, d := range data.DefaultDurations -%}
+(def default-{%s d.Name.Kebab %}
+ "{%s= d.Description %}"
+ {%d durationToMs(d.Duration) %})
+
+{%- endfor -%}
+
+;; -----------------------------------------------------------------------------
+;; Default values
+;; -----------------------------------------------------------------------------
+{%- for _, s := range data.DefaultStrings -%}
+(def default-{%s s.Name.Kebab %}
+ "{%s= s.Description %}"
+ (-> "{%s s.Value %}"
+ (string/split #" ")
+ (update 0 keyword)
+ (->> (apply array-map))))
+
+{%- endfor -%}
+
+;; -----------------------------------------------------------------------------
+;; Dataline literals
+;; -----------------------------------------------------------------------------
+{%- for _, literal := range data.DatalineLiterals -%}
+(def {%s literal.Kebab %}-dataline-literal "{%s literal.Camel %} ")
+{%- endfor -%}
+
+
+;; -----------------------------------------------------------------------------
+;; Default booleans
+;; -----------------------------------------------------------------------------
+{%- for _, b := range data.DefaultBools -%}
+(def default-{%s b.Name.Kebab %}
+ "{%s= b.Description %}"
+ {%v b.Value %})
+
+{%- endfor -%}
+
+
+;; -----------------------------------------------------------------------------
+;; Enums
+;; -----------------------------------------------------------------------------
+{%- for _, enum := range data.Enums -%}
+;; {%s enum.Name.Pascal %}
+
+{%- for _, entry := range enum.Values -%}
+(def {%s enum.Name.Kebab %}-{%s entry.Name.Kebab %}
+ "{%s= entry.Description %}"
+ "{%s entry.Value %}")
+
+{%- endfor -%}
+
+{%- if enum.Default != nil -%}
+(def default-{%s enum.Name.Kebab %}
+ "Default value for {%s enum.Name.Pascal %}.
+ {%s= enum.Default.Description %}"
+ {%s enum.Name.Kebab %}-{%s enum.Default.Name.Kebab %})
+{%- endif -%}
+
+
+{%- endfor -%}
+
+{%- endfunc -%}
diff --git a/build/run.go b/build/run.go
index 3a674ae92..1c8c3f0fe 100644
--- a/build/run.go
+++ b/build/run.go
@@ -131,15 +131,16 @@ func writeOutConsts(version string) error {
})
templates := map[string]func(data *ConstTemplateData) string{
- "README.md": datastarREADME,
- "library/README.md": datastarREADME,
- "library/src/engine/consts.ts": datastarClientConsts,
- "library/package.json": datastarClientPackageJSON,
- "sdk/go/consts.go": goConsts,
- "sdk/dotnet/src/Consts.fs": dotnetConsts,
- "sdk/php/src/Consts.php": phpConsts,
- "sdk/php/src/enums/EventType.php": phpEventType,
- "sdk/php/src/enums/FragmentMergeMode.php": phpFragmentMergeMode,
+ "README.md": datastarREADME,
+ "library/README.md": datastarREADME,
+ "library/src/engine/consts.ts": datastarClientConsts,
+ "library/package.json": datastarClientPackageJSON,
+ "sdk/clojure/sdk/src/main/starfederation/datastar/clojure/consts.clj": clojureConsts,
+ "sdk/go/consts.go": goConsts,
+ "sdk/dotnet/src/Consts.fs": dotnetConsts,
+ "sdk/php/src/Consts.php": phpConsts,
+ "sdk/php/src/enums/EventType.php": phpEventType,
+ "sdk/php/src/enums/FragmentMergeMode.php": phpFragmentMergeMode,
"sdk/java/core/src/main/java/starfederation/datastar/Consts.java": javaConsts,
"sdk/java/core/src/main/java/starfederation/datastar/enums/EventType.java": javaEventType,
"sdk/java/core/src/main/java/starfederation/datastar/enums/FragmentMergeMode.java": javaFragmentMergeMode,
@@ -147,6 +148,7 @@ func writeOutConsts(version string) error {
"sdk/typescript/src/consts.ts": typescriptConsts,
"sdk/rust/src/consts.rs": rustConsts,
"sdk/zig/src/consts.zig": zigConsts,
+ "examples/clojure/hello-world/resources/public/hello-world.html": helloWorldExample,
"examples/dotnet/HelloWorld/wwwroot/hello-world.html": helloWorldExample,
"examples/go/hello-world/hello-world.html": helloWorldExample,
"examples/php/hello-world/public/hello-world.html": helloWorldExamplePHP,
diff --git a/bundles/datastar-core.js b/bundles/datastar-core.js
index 9861a1c33..97a88e3a5 100644
--- a/bundles/datastar-core.js
+++ b/bundles/datastar-core.js
@@ -1,8 +1,8 @@
// Datastar v1.0.0-beta.2
-var U=/🖕JS_DS🚀/.source,D=U.slice(0,5),j=U.slice(4),k="datastar";var _e={Morph:"morph",Inner:"inner",Outer:"outer",Prepend:"prepend",Append:"append",Before:"before",After:"after",UpsertAttributes:"upsertAttributes"},xe=_e.Morph;var y=(s=>(s[s.Attribute=1]="Attribute",s[s.Watcher=2]="Watcher",s[s.Action=3]="Action",s))(y||{});var me="computed",H={type:1,name:me,keyReq:1,valReq:1,onLoad:({key:t,signals:e,genRX:n})=>{let s=n();e.setComputed(t,s)}};var Y=t=>t.replace(/[A-Z]+(?![a-z])|[A-Z]/g,(e,n)=>(n?"-":"")+e.toLowerCase()),X=t=>t.replace(/(?:^\w|[A-Z]|\b\w)/g,(e,n)=>n===0?e.toLowerCase():e.toUpperCase()).replace(/\s+/g,""),Z=t=>new Function(`return Object.assign({}, ${t})`)();var Q={type:1,name:"signals",removeOnLoad:!0,onLoad:t=>{let{key:e,value:n,genRX:s,signals:i,mods:o}=t,r=o.has("ifmissing");if(e!==""&&!r){let l=n===""?n:s()();i.setValue(e,l)}else{let l=Z(t.value);t.value=JSON.stringify(l);let f=s()();i.merge(f,r)}}};var ee={type:1,name:"star",keyReq:2,valReq:2,onLoad:()=>{alert("YOU ARE PROBABLY OVERCOMPLICATING IT")}};var R=class{#e=0;#t;constructor(e=k){this.#t=e}with(e){if(typeof e=="string")for(let n of e.split(""))this.with(n.charCodeAt(0));else this.#e=(this.#e<<5)-this.#e+e;return this}reset(){return this.#e=0,this}get value(){return this.#t+Math.abs(this.#e).toString(36)}};function te(t){if(t.id)return t.id;let e=new R,n=t;for(;n.parentNode;){if(n.id){e.with(n.id);break}if(n===n.ownerDocument.documentElement)e.with(n.tagName);else for(let s=1,i=t;i.previousElementSibling;i=i.previousElementSibling,s++)e.with(s);n=n.parentNode}return e.value}var ye=`${window.location.origin}/errors`;function B(t,e,n={}){let s=new Error;e=e[0].toUpperCase()+e.slice(1),s.name=`${k} ${t} error`;let i=Y(e).replaceAll("-","_"),o=new URLSearchParams({metadata:JSON.stringify(n)}).toString(),r=JSON.stringify(n,null,2);return s.message=`${e}
-More info: ${ye}/${t}/${i}?${o}
-Context: ${r}`,s}function h(t,e,n={}){return B("internal",e,Object.assign({from:t},n))}function ne(t,e,n={}){let s={plugin:{name:e.plugin.name,type:y[e.plugin.type]}};return B("init",t,Object.assign(s,n))}function m(t,e,n={}){let s={plugin:{name:e.plugin.name,type:y[e.plugin.type]},element:{id:e.el.id,tag:e.el.tagName},expression:{rawKey:e.rawKey,key:e.key,value:e.value,validSignals:e.signals.paths(),fnContent:e.fnContent}};return B("runtime",t,Object.assign(s,n))}var v="preact-signals",ve=Symbol.for("preact-signals"),_=1,T=2,C=4,N=8,P=16,w=32;function q(){M++}function K(){if(M>1){M--;return}let t,e=!1;for(;A!==void 0;){let n=A;for(A=void 0,G++;n!==void 0;){let s=n._nextBatchedEffect;if(n._nextBatchedEffect=void 0,n._flags&=~T,!(n._flags&N)&&ie(n))try{n._callback()}catch(i){e||(t=i,e=!0)}n=s}}if(G=0,M--,e)throw h(v,"BatchError, error",{error:t})}var a;var A,M=0,G=0,V=0;function se(t){if(a===void 0)return;let e=t._node;if(e===void 0||e._target!==a)return e={_version:0,_source:t,_prevSource:a._sources,_nextSource:void 0,_target:a,_prevTarget:void 0,_nextTarget:void 0,_rollbackNode:e},a._sources!==void 0&&(a._sources._nextSource=e),a._sources=e,t._node=e,a._flags&w&&t._subscribe(e),e;if(e._version===-1)return e._version=0,e._nextSource!==void 0&&(e._nextSource._prevSource=e._prevSource,e._prevSource!==void 0&&(e._prevSource._nextSource=e._nextSource),e._prevSource=a._sources,e._nextSource=void 0,a._sources._nextSource=e,a._sources=e),e}function u(t){this._value=t,this._version=0,this._node=void 0,this._targets=void 0}u.prototype.brand=ve;u.prototype._refresh=()=>!0;u.prototype._subscribe=function(t){this._targets!==t&&t._prevTarget===void 0&&(t._nextTarget=this._targets,this._targets!==void 0&&(this._targets._prevTarget=t),this._targets=t)};u.prototype._unsubscribe=function(t){if(this._targets!==void 0){let e=t._prevTarget,n=t._nextTarget;e!==void 0&&(e._nextTarget=n,t._prevTarget=void 0),n!==void 0&&(n._prevTarget=e,t._nextTarget=void 0),t===this._targets&&(this._targets=n)}};u.prototype.subscribe=function(t){return I(()=>{let e=this.value,n=a;a=void 0;try{t(e)}finally{a=n}})};u.prototype.valueOf=function(){return this.value};u.prototype.toString=function(){return`${this.value}`};u.prototype.toJSON=function(){return this.value};u.prototype.peek=function(){let t=a;a=void 0;try{return this.value}finally{a=t}};Object.defineProperty(u.prototype,"value",{get(){let t=se(this);return t!==void 0&&(t._version=this._version),this._value},set(t){if(t!==this._value){if(G>100)throw h(v,"SignalCycleDetected");this._value=t,this._version++,V++,q();try{for(let e=this._targets;e!==void 0;e=e._nextTarget)e._target._notify()}finally{K()}}}});function ie(t){for(let e=t._sources;e!==void 0;e=e._nextSource)if(e._source._version!==e._version||!e._source._refresh()||e._source._version!==e._version)return!0;return!1}function re(t){for(let e=t._sources;e!==void 0;e=e._nextSource){let n=e._source._node;if(n!==void 0&&(e._rollbackNode=n),e._source._node=e,e._version=-1,e._nextSource===void 0){t._sources=e;break}}}function oe(t){let e=t._sources,n;for(;e!==void 0;){let s=e._prevSource;e._version===-1?(e._source._unsubscribe(e),s!==void 0&&(s._nextSource=e._nextSource),e._nextSource!==void 0&&(e._nextSource._prevSource=s)):n=e,e._source._node=e._rollbackNode,e._rollbackNode!==void 0&&(e._rollbackNode=void 0),e=s}t._sources=n}function S(t){u.call(this,void 0),this._fn=t,this._sources=void 0,this._globalVersion=V-1,this._flags=C}S.prototype=new u;S.prototype._refresh=function(){if(this._flags&=~T,this._flags&_)return!1;if((this._flags&(C|w))===w||(this._flags&=~C,this._globalVersion===V))return!0;if(this._globalVersion=V,this._flags|=_,this._version>0&&!ie(this))return this._flags&=~_,!0;let t=a;try{re(this),a=this;let e=this._fn();(this._flags&P||this._value!==e||this._version===0)&&(this._value=e,this._flags&=~P,this._version++)}catch(e){this._value=e,this._flags|=P,this._version++}return a=t,oe(this),this._flags&=~_,!0};S.prototype._subscribe=function(t){if(this._targets===void 0){this._flags|=C|w;for(let e=this._sources;e!==void 0;e=e._nextSource)e._source._subscribe(e)}u.prototype._subscribe.call(this,t)};S.prototype._unsubscribe=function(t){if(this._targets!==void 0&&(u.prototype._unsubscribe.call(this,t),this._targets===void 0)){this._flags&=~w;for(let e=this._sources;e!==void 0;e=e._nextSource)e._source._unsubscribe(e)}};S.prototype._notify=function(){if(!(this._flags&T)){this._flags|=C|T;for(let t=this._targets;t!==void 0;t=t._nextTarget)t._target._notify()}};Object.defineProperty(S.prototype,"value",{get(){if(this._flags&_)throw h(v,"SignalCycleDetected");let t=se(this);if(this._refresh(),t!==void 0&&(t._version=this._version),this._flags&P)throw h(v,"GetComputedError",{value:this._value});return this._value}});function ae(t){return new S(t)}function le(t){let e=t._cleanup;if(t._cleanup=void 0,typeof e=="function"){q();let n=a;a=void 0;try{e()}catch(s){throw t._flags&=~_,t._flags|=N,W(t),h(v,"CleanupEffectError",{error:s})}finally{a=n,K()}}}function W(t){for(let e=t._sources;e!==void 0;e=e._nextSource)e._source._unsubscribe(e);t._fn=void 0,t._sources=void 0,le(t)}function Se(t){if(a!==this)throw h(v,"EndEffectError");oe(this),a=t,this._flags&=~_,this._flags&N&&W(this),K()}function O(t){this._fn=t,this._cleanup=void 0,this._sources=void 0,this._nextBatchedEffect=void 0,this._flags=w}O.prototype._callback=function(){let t=this._start();try{if(this._flags&N||this._fn===void 0)return;let e=this._fn();typeof e=="function"&&(this._cleanup=e)}finally{t()}};O.prototype._start=function(){if(this._flags&_)throw h(v,"SignalCycleDetected");this._flags|=_,this._flags&=~N,le(this),re(this),q();let t=a;return a=this,Se.bind(this,t)};O.prototype._notify=function(){this._flags&T||(this._flags|=T,this._nextBatchedEffect=A,A=this)};O.prototype._dispose=function(){this._flags|=N,this._flags&_||W(this)};function I(t){let e=new O(t);try{e._callback()}catch(n){throw e._dispose(),n}return e._dispose.bind(e)}var ue="namespacedSignals";function ce(t,e=!1){let n={};for(let s in t)if(Object.hasOwn(t,s)){if(e&&s.startsWith("_"))continue;let i=t[s];i instanceof u?n[s]=i.value:n[s]=ce(i)}return n}function fe(t,e,n=!1){for(let s in e)if(Object.hasOwn(e,s)){if(s.match(/\_\_+/))throw h(ue,"InvalidSignalKey",{key:s});let i=e[s];if(i instanceof Object&&!Array.isArray(i))t[s]||(t[s]={}),fe(t[s],i,n);else{if(Object.hasOwn(t,s)){if(n)continue;let r=t[s];if(r instanceof u){r.value=i;continue}}t[s]=new u(i)}}}function de(t,e){for(let n in t)if(Object.hasOwn(t,n)){let s=t[n];s instanceof u?e(n,s):de(s,(i,o)=>{e(`${n}.${i}`,o)})}}function be(t,...e){let n={};for(let s of e){let i=s.split("."),o=t,r=n;for(let p=0;pn());this.setSignal(e,s)}value(e){return this.signal(e)?.value}setValue(e,n){let s=this.upsertIfMissing(e,n);s.value=n}upsertIfMissing(e,n){let s=e.split("."),i=this.#e;for(let p=0;pe.push(n)),e}values(e=!1){return ce(this.#e,e)}JSON(e=!0,n=!1){let s=this.values(n);return e?JSON.stringify(s,null,2):JSON.stringify(s)}toString(){return this.JSON()}};var F=class{#e=new $;#t=[];#s={};#o=[];#n=new Map;get signals(){return this.#e}load(...e){for(let n of e){let s=this,i={get signals(){return s.#e},effect:r=>I(r),actions:this.#s,apply:this.apply.bind(this),cleanup:this.#i.bind(this),plugin:n},o;switch(n.type){case 2:{let r=n;this.#o.push(r),o=r.onGlobalInit;break}case 3:{this.#s[n.name]=n;break}case 1:{let r=n;this.#t.push(r),o=r.onGlobalInit;break}default:throw ne("InvalidPluginType",i)}o&&o(i)}this.#t.sort((n,s)=>{let i=s.name.length-n.name.length;return i!==0?i:n.name.localeCompare(s.name)})}apply(e){this.#r(e,n=>{this.#i(n);for(let s of Object.keys(n.dataset)){let i=this.#t.find(c=>s.startsWith(c.name));if(!i)continue;n.id.length||(n.id=te(n));let[o,...r]=s.slice(i.name.length).split(/\_\_+/),l=o.length>0;if(l){let c=o.slice(1);o=o.startsWith("-")?c:o[0].toLowerCase()+c}let p=`${n.dataset[s]}`||"",f=p.length>0,L=this,g={get signals(){return L.#e},effect:c=>I(c),apply:this.apply.bind(this),cleanup:this.#i.bind(this),actions:this.#s,genRX:()=>this.#a(g,...i.argNames||[]),plugin:i,el:n,rawKey:s,key:o,value:p,mods:new Map},b=i.keyReq||0;if(l){if(b===2)throw m(`${i.name}KeyNotAllowed`,g)}else if(b===1)throw m(`${i.name}KeyRequired`,g);let x=i.valReq||0;if(f){if(x===2)throw m(`${i.name}ValueNotAllowed`,g)}else if(x===1)throw m(`${i.name}ValueRequired`,g);if(b===3||x===3){if(l&&f)throw m(`${i.name}KeyAndValueProvided`,g);if(!l&&!f)throw m(`${i.name}KeyOrValueRequired`,g)}for(let c of r){let[E,...ge]=c.split(".");g.mods.set(X(E),new Set(ge.map(he=>he.toLowerCase())))}let d=i.onLoad(g);d&&(this.#n.has(n)||this.#n.set(n,{id:n.id,fns:[]}),this.#n.get(n)?.fns.push(d)),i?.removeOnLoad&&delete n.dataset[s]}})}#a(e,...n){let s="",i=/(\/(\\\/|[^\/])*\/|"(\\"|[^\"])*"|'(\\'|[^'])*'|`(\\`|[^`])*`|[^;])+/gm,o=e.value.trim().match(i);if(o){let d=o.length-1,c=o[d].trim();c.startsWith("return")||(o[d]=`return (${c});`),s=o.join(`;
-`)}let r=new Map,l=new RegExp(`(?:${D})(.*?)(?:${j})`,"gm");for(let d of s.matchAll(l)){let c=d[1],E=new R("dsEscaped").with(c).value;r.set(E,c),s=s.replace(D+c+j,E)}let p=/@(\w*)\(/gm,f=s.matchAll(p),L=new Set;for(let d of f)L.add(d[1]);let g=new RegExp(`@(${Object.keys(this.#s).join("|")})\\(`,"gm");s=s.replaceAll(g,"ctx.actions.$1.fn(ctx,");let b=e.signals.paths();if(b.length){let d=new RegExp(`\\$(${b.join("|")})(\\W|$)`,"gm");s=s.replaceAll(d,"ctx.signals.signal('$1').value$2")}for(let[d,c]of r)s=s.replace(d,c);let x=`return (()=> {
-${s}
-})()`;e.fnContent=x;try{let d=new Function("ctx",...n,x);return(...c)=>{try{return d(e,...c)}catch(E){throw m("ExecuteExpression",e,{error:E.message})}}}catch(d){throw m("GenerateExpression",e,{error:d.message})}}#r(e,n){if(!e||!(e instanceof HTMLElement||e instanceof SVGElement))return null;let s=e.dataset;if("starIgnore"in s)return null;"starIgnore__self"in s||n(e);let i=e.firstElementChild;for(;i;)this.#r(i,n),i=i.nextElementSibling}#i(e){let n=this.#n.get(e);if(n){for(let s of n.fns)s();this.#n.delete(e)}}};var pe=new F;pe.load(ee,Q,H);var J=pe;J.apply(document.body);var rt=J;export{rt as Datastar};
+var z=/🖕JS_DS🚀/.source,C=z.slice(0,5),j=z.slice(4),A="datastar";var ye={Morph:"morph",Inner:"inner",Outer:"outer",Prepend:"prepend",Append:"append",Before:"before",After:"after",UpsertAttributes:"upsertAttributes"},Ae=ye.Morph;var b=(n=>(n[n.Attribute=1]="Attribute",n[n.Watcher=2]="Watcher",n[n.Action=3]="Action",n))(b||{});var Y=`${A}-signals`;var Se="computed",Z={type:1,name:Se,keyReq:1,valReq:1,onLoad:({key:t,signals:e,genRX:s})=>{let n=s();e.setComputed(t,n)}};var H=t=>t.replace(/[A-Z]+(?![a-z])|[A-Z]/g,(e,s)=>(s?"-":"")+e.toLowerCase()),K=t=>H(t).replace(/-./g,e=>e[1].toUpperCase()),Q=t=>new Function(`return Object.assign({}, ${t})`)();var ee={type:1,name:"signals",removeOnLoad:!0,onLoad:t=>{let{key:e,value:s,genRX:n,signals:r,mods:o}=t,i=o.has("ifmissing");if(e!==""&&!i){let a=s===""?s:n()();r.setValue(e,a)}else{let a=Q(t.value);t.value=JSON.stringify(a);let p=n()();r.merge(p,i)}}};var te={type:1,name:"star",keyReq:2,valReq:2,onLoad:()=>{alert("YOU ARE PROBABLY OVERCOMPLICATING IT")}};var O=class{#e=0;#n;constructor(e=A){this.#n=e}with(e){if(typeof e=="string")for(let s of e.split(""))this.with(s.charCodeAt(0));else this.#e=(this.#e<<5)-this.#e+e;return this}reset(){return this.#e=0,this}get value(){return this.#n+Math.abs(this.#e).toString(36)}};function ne(t){if(t.id)return t.id;let e=new O,s=t;for(;s.parentNode;){if(s.id){e.with(s.id);break}if(s===s.ownerDocument.documentElement)e.with(s.tagName);else for(let n=1,r=t;r.previousElementSibling;r=r.previousElementSibling,n++)e.with(n);s=s.parentNode}return e.value}function se(t,e,s=!1,n=!0){let r=-1,o=()=>r&&clearTimeout(r);return(...i)=>{o(),s&&!r&&t(...i),r=setTimeout(()=>{n&&t(...i),o()},e)}}var be=`${window.location.origin}/errors`;function B(t,e,s={}){let n=new Error;e=e[0].toUpperCase()+e.slice(1),n.name=`${A} ${t} error`;let r=H(e).replaceAll("-","_"),o=new URLSearchParams({metadata:JSON.stringify(s)}).toString(),i=JSON.stringify(s,null,2);return n.message=`${e}
+More info: ${be}/${t}/${r}?${o}
+Context: ${i}`,n}function _(t,e,s={}){return B("internal",e,Object.assign({from:t},s))}function re(t,e,s={}){let n={plugin:{name:e.plugin.name,type:b[e.plugin.type]}};return B("init",t,Object.assign(n,s))}function S(t,e,s={}){let n={plugin:{name:e.plugin.name,type:b[e.plugin.type]},element:{id:e.el.id,tag:e.el.tagName},expression:{rawKey:e.rawKey,key:e.key,value:e.value,validSignals:e.signals.paths(),fnContent:e.fnContent}};return B("runtime",t,Object.assign(n,s))}var x="preact-signals",xe=Symbol.for("preact-signals"),v=1,N=2,k=4,R=8,V=16,w=32;function q(){P++}function J(){if(P>1){P--;return}let t,e=!1;for(;D!==void 0;){let s=D;for(D=void 0,W++;s!==void 0;){let n=s._nextBatchedEffect;if(s._nextBatchedEffect=void 0,s._flags&=~N,!(s._flags&R)&&oe(s))try{s._callback()}catch(r){e||(t=r,e=!0)}s=n}}if(W=0,P--,e)throw _(x,"BatchError, error",{error:t})}var u;var D,P=0,W=0,$=0;function ie(t){if(u===void 0)return;let e=t._node;if(e===void 0||e._target!==u)return e={_version:0,_source:t,_prevSource:u._sources,_nextSource:void 0,_target:u,_prevTarget:void 0,_nextTarget:void 0,_rollbackNode:e},u._sources!==void 0&&(u._sources._nextSource=e),u._sources=e,t._node=e,u._flags&w&&t._subscribe(e),e;if(e._version===-1)return e._version=0,e._nextSource!==void 0&&(e._nextSource._prevSource=e._prevSource,e._prevSource!==void 0&&(e._prevSource._nextSource=e._nextSource),e._prevSource=u._sources,e._nextSource=void 0,u._sources._nextSource=e,u._sources=e),e}function f(t){this._value=t,this._version=0,this._node=void 0,this._targets=void 0}f.prototype.brand=xe;f.prototype._refresh=()=>!0;f.prototype._subscribe=function(t){this._targets!==t&&t._prevTarget===void 0&&(t._nextTarget=this._targets,this._targets!==void 0&&(this._targets._prevTarget=t),this._targets=t)};f.prototype._unsubscribe=function(t){if(this._targets!==void 0){let e=t._prevTarget,s=t._nextTarget;e!==void 0&&(e._nextTarget=s,t._prevTarget=void 0),s!==void 0&&(s._prevTarget=e,t._nextTarget=void 0),t===this._targets&&(this._targets=s)}};f.prototype.subscribe=function(t){return I(()=>{let e=this.value,s=u;u=void 0;try{t(e)}finally{u=s}})};f.prototype.valueOf=function(){return this.value};f.prototype.toString=function(){return`${this.value}`};f.prototype.toJSON=function(){return this.value};f.prototype.peek=function(){let t=u;u=void 0;try{return this.value}finally{u=t}};Object.defineProperty(f.prototype,"value",{get(){let t=ie(this);return t!==void 0&&(t._version=this._version),this._value},set(t){if(t!==this._value){if(W>100)throw _(x,"SignalCycleDetected");this._value=t,this._version++,$++,q();try{for(let e=this._targets;e!==void 0;e=e._nextTarget)e._target._notify()}finally{J()}}}});function oe(t){for(let e=t._sources;e!==void 0;e=e._nextSource)if(e._source._version!==e._version||!e._source._refresh()||e._source._version!==e._version)return!0;return!1}function ae(t){for(let e=t._sources;e!==void 0;e=e._nextSource){let s=e._source._node;if(s!==void 0&&(e._rollbackNode=s),e._source._node=e,e._version=-1,e._nextSource===void 0){t._sources=e;break}}}function le(t){let e=t._sources,s;for(;e!==void 0;){let n=e._prevSource;e._version===-1?(e._source._unsubscribe(e),n!==void 0&&(n._nextSource=e._nextSource),e._nextSource!==void 0&&(e._nextSource._prevSource=n)):s=e,e._source._node=e._rollbackNode,e._rollbackNode!==void 0&&(e._rollbackNode=void 0),e=n}t._sources=s}function E(t){f.call(this,void 0),this._fn=t,this._sources=void 0,this._globalVersion=$-1,this._flags=k}E.prototype=new f;E.prototype._refresh=function(){if(this._flags&=~N,this._flags&v)return!1;if((this._flags&(k|w))===w||(this._flags&=~k,this._globalVersion===$))return!0;if(this._globalVersion=$,this._flags|=v,this._version>0&&!oe(this))return this._flags&=~v,!0;let t=u;try{ae(this),u=this;let e=this._fn();(this._flags&V||this._value!==e||this._version===0)&&(this._value=e,this._flags&=~V,this._version++)}catch(e){this._value=e,this._flags|=V,this._version++}return u=t,le(this),this._flags&=~v,!0};E.prototype._subscribe=function(t){if(this._targets===void 0){this._flags|=k|w;for(let e=this._sources;e!==void 0;e=e._nextSource)e._source._subscribe(e)}f.prototype._subscribe.call(this,t)};E.prototype._unsubscribe=function(t){if(this._targets!==void 0&&(f.prototype._unsubscribe.call(this,t),this._targets===void 0)){this._flags&=~w;for(let e=this._sources;e!==void 0;e=e._nextSource)e._source._unsubscribe(e)}};E.prototype._notify=function(){if(!(this._flags&N)){this._flags|=k|N;for(let t=this._targets;t!==void 0;t=t._nextTarget)t._target._notify()}};Object.defineProperty(E.prototype,"value",{get(){if(this._flags&v)throw _(x,"SignalCycleDetected");let t=ie(this);if(this._refresh(),t!==void 0&&(t._version=this._version),this._flags&V)throw _(x,"GetComputedError",{value:this._value});return this._value}});function ue(t){return new E(t)}function ce(t){let e=t._cleanup;if(t._cleanup=void 0,typeof e=="function"){q();let s=u;u=void 0;try{e()}catch(n){throw t._flags&=~v,t._flags|=R,U(t),_(x,"CleanupEffectError",{error:n})}finally{u=s,J()}}}function U(t){for(let e=t._sources;e!==void 0;e=e._nextSource)e._source._unsubscribe(e);t._fn=void 0,t._sources=void 0,ce(t)}function Ee(t){if(u!==this)throw _(x,"EndEffectError");le(this),u=t,this._flags&=~v,this._flags&R&&U(this),J()}function M(t){this._fn=t,this._cleanup=void 0,this._sources=void 0,this._nextBatchedEffect=void 0,this._flags=w}M.prototype._callback=function(){let t=this._start();try{if(this._flags&R||this._fn===void 0)return;let e=this._fn();typeof e=="function"&&(this._cleanup=e)}finally{t()}};M.prototype._start=function(){if(this._flags&v)throw _(x,"SignalCycleDetected");this._flags|=v,this._flags&=~R,ce(this),ae(this),q();let t=u;return u=this,Ee.bind(this,t)};M.prototype._notify=function(){this._flags&N||(this._flags|=N,this._nextBatchedEffect=D,D=this)};M.prototype._dispose=function(){this._flags|=R,this._flags&v||U(this)};function I(t){let e=new M(t);try{e._callback()}catch(s){throw e._dispose(),s}return e._dispose.bind(e)}var fe="namespacedSignals",F=t=>{document.dispatchEvent(new CustomEvent(Y,{detail:Object.assign({added:[],removed:[],updated:[]},t)}))};function de(t,e=!1){let s={};for(let n in t)if(Object.hasOwn(t,n)){if(e&&n.startsWith("_"))continue;let r=t[n];r instanceof f?s[n]=r.value:s[n]=de(r)}return s}function pe(t,e,s=!1){let n={added:[],removed:[],updated:[]};for(let r in e)if(Object.hasOwn(e,r)){if(r.match(/\_\_+/))throw _(fe,"InvalidSignalKey",{key:r});let o=e[r];if(o instanceof Object&&!Array.isArray(o)){t[r]||(t[r]={});let i=pe(t[r],o,s);n.added.push(...i.added.map(a=>`${r}.${a}`)),n.removed.push(...i.removed.map(a=>`${r}.${a}`)),n.updated.push(...i.updated.map(a=>`${r}.${a}`))}else{if(Object.hasOwn(t,r)){if(s)continue;let a=t[r];if(a instanceof f){let c=a.value;a.value=o,c!==o&&n.updated.push(r);continue}}t[r]=new f(o),n.added.push(r)}}return n}function ge(t,e){for(let s in t)if(Object.hasOwn(t,s)){let n=t[s];n instanceof f?e(s,n):ge(n,(r,o)=>{e(`${s}.${r}`,o)})}}function Te(t,...e){let s={};for(let n of e){let r=n.split("."),o=t,i=s;for(let c=0;cs());this.setSignal(e,n)}value(e){return this.signal(e)?.value}setValue(e,s){let n=this.upsertIfMissing(e,s),r=n.value;n.value=s,r!==s&&F({updated:[e]})}upsertIfMissing(e,s){let n=e.split("."),r=this.#e;for(let c=0;ce.push(s)),e}values(e=!1){return de(this.#e,e)}JSON(e=!0,s=!1){let n=this.values(s);return e?JSON.stringify(n,null,2):JSON.stringify(n)}toString(){return this.JSON()}};var he=(t,e)=>`${t}${C}${e}`,G=class{#e=new L;#n=[];#s={};#a=[];#t=new Map;constructor(){let e="data-";new MutationObserver(n=>{for(let{target:r,type:o,attributeName:i,oldValue:a,addedNodes:c,removedNodes:p}of n)switch(o){case"childList":{for(let d of p){let g=d,h=this.#t.get(g);if(h){for(let[y,l]of h)l();this.#t.delete(g)}}for(let d of c){let g=d;this.#r(g)}}break;case"attributes":{{if(!i?.startsWith(e))break;let d=r,g=K(i.slice(e.length));if(a!==null&&d.dataset[g]!==a){let h=this.#t.get(d);if(h){let y=he(g,a),l=h.get(y);l&&(l(),h.delete(y))}}this.#i(d,g)}break}}}).observe(document.body,{attributes:!0,attributeOldValue:!0,childList:!0,subtree:!0})}get signals(){return this.#e}load(...e){for(let s of e){let n=this,r={get signals(){return n.#e},effect:i=>I(i),actions:this.#s,plugin:s},o;switch(s.type){case 2:{let i=s;this.#a.push(i),o=i.onGlobalInit;break}case 3:{this.#s[s.name]=s;break}case 1:{let i=s;this.#n.push(i),o=i.onGlobalInit;break}default:throw re("InvalidPluginType",r)}o&&o(r)}this.#n.sort((s,n)=>{let r=n.name.length-s.name.length;return r!==0?r:s.name.localeCompare(n.name)}),this.#l()}#l=se(()=>{this.#r(document.body)},1);#r(e){this.#o(e,s=>{let n=this.#t.get(s);if(n){for(let[,r]of n)r();this.#t.delete(s)}for(let r of Object.keys(s.dataset))this.#i(s,r)})}#i(e,s){let n=this.#n.find(l=>s.startsWith(l.name));if(!n)return;e.id.length||(e.id=ne(e));let[r,...o]=s.slice(n.name.length).split(/\_\_+/),i=r.length>0;if(i){let l=r.slice(1);r=r.startsWith("-")?l:r[0].toLowerCase()+l}let a=e.dataset[s]||"",c=a.length>0,p=this,d={get signals(){return p.#e},effect:l=>I(l),actions:this.#s,genRX:()=>this.#u(d,...n.argNames||[]),plugin:n,el:e,rawKey:s,key:r,value:a,mods:new Map},g=n.keyReq||0;if(i){if(g===2)throw S(`${n.name}KeyNotAllowed`,d)}else if(g===1)throw S(`${n.name}KeyRequired`,d);let h=n.valReq||0;if(c){if(h===2)throw S(`${n.name}ValueNotAllowed`,d)}else if(h===1)throw S(`${n.name}ValueRequired`,d);if(g===3||h===3){if(i&&c)throw S(`${n.name}KeyAndValueProvided`,d);if(!i&&!c)throw S(`${n.name}KeyOrValueRequired`,d)}for(let l of o){let[m,...T]=l.split(".");d.mods.set(K(m),new Set(T.map(ve=>ve.toLowerCase())))}let y=n.onLoad(d);if(y){let l=this.#t.get(e);l||(l=new Map,this.#t.set(e,l)),l.set(he(s,a),y)}n?.removeOnLoad&&delete e.dataset[s]}#u(e,...s){let n="",r=/(\/(\\\/|[^\/])*\/|"(\\"|[^\"])*"|'(\\'|[^'])*'|`(\\`|[^`])*`|[^;])+/gm,o=e.value.trim().match(r);if(o){let l=o.length-1,m=o[l].trim();m.startsWith("return")||(o[l]=`return (${m});`),n=o.join(`;
+`)}let i=new Map,a=new RegExp(`(?:${C})(.*?)(?:${j})`,"gm");for(let l of n.matchAll(a)){let m=l[1],T=new O("dsEscaped").with(m).value;i.set(T,m),n=n.replace(C+m+j,T)}let c=/@(\w*)\(/gm,p=n.matchAll(c),d=new Set;for(let l of p)d.add(l[1]);let g=new RegExp(`@(${Object.keys(this.#s).join("|")})\\(`,"gm");n=n.replaceAll(g,"ctx.actions.$1.fn(ctx,");let h=e.signals.paths();if(h.length){let l=new RegExp(`\\$(${h.join("|")})(\\W|$)`,"gm");n=n.replaceAll(l,"ctx.signals.signal('$1').value$2")}for(let[l,m]of i)n=n.replace(l,m);let y=`return (()=> {
+${n}
+})()`;e.fnContent=y;try{let l=new Function("ctx",...s,y);return(...m)=>{try{return l(e,...m)}catch(T){throw S("ExecuteExpression",e,{error:T.message})}}}catch(l){throw S("GenerateExpression",e,{error:l.message})}}#o(e,s){if(!e||!(e instanceof HTMLElement||e instanceof SVGElement))return null;let n=e.dataset;if("starIgnore"in n)return null;"starIgnore__self"in n||s(e);let r=e.firstElementChild;for(;r;)this.#o(r,s),r=r.nextElementSibling}};var me=new G;me.load(te,ee,Z);var _e=me;var dt=_e;export{dt as Datastar};
//# sourceMappingURL=datastar-core.js.map
diff --git a/bundles/datastar-core.js.map b/bundles/datastar-core.js.map
index f1e8b5706..43af92ae2 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/engine/types.ts", "../library/src/plugins/official/core/attributes/computed.ts", "../library/src/utils/text.ts", "../library/src/plugins/official/core/attributes/signals.ts", "../library/src/plugins/official/core/attributes/star.ts", "../library/src/utils/dom.ts", "../library/src/engine/errors.ts", "../library/src/vendored/preact-core.ts", "../library/src/engine/signals.ts", "../library/src/engine/engine.ts", "../library/src/engine/index.ts", "../library/src/bundles/datastar-core.ts"],
- "sourcesContent": ["// This is auto-generated by Datastar. DO NOT EDIT.\nconst lol = /\uD83D\uDD95JS_DS\uD83D\uDE80/.source\nexport const DSP = lol.slice(0, 5)\nexport const DSS = lol.slice(4)\n\nexport const DATASTAR = \"datastar\";\nexport const DATASTAR_EVENT = \"datastar-event\";\nexport const DATASTAR_REQUEST = \"Datastar-Request\";\n\n// #region Defaults\n\n// #region Default durations\n\n// The default duration for settling during fragment merges. Allows for CSS transitions to complete.\nexport const DefaultFragmentsSettleDurationMs = 300;\n// The default duration for retrying SSE on connection reset. This is part of the underlying retry mechanism of SSE.\nexport const DefaultSseRetryDurationMs = 1000;\n\n// #endregion\n\n\n// #region Default strings\n\n// The default attributes for element use when executing scripts. It is a set of key-value pairs delimited by a newline \\\\n character.\nexport const DefaultExecuteScriptAttributes = \"type module\";\n\n// #endregion\n\n\n// #region Default booleans\n\n// Should fragments be merged using the ViewTransition API?\nexport const DefaultFragmentsUseViewTransitions = false;\n\n// Should a given set of signals merge if they are missing?\nexport const DefaultMergeSignalsOnlyIfMissing = false;\n\n// Should script element remove itself after execution?\nexport const DefaultExecuteScriptAutoRemove = true;\n\n// #endregion\n\n\n// #region Enums\n\n// The mode in which a fragment is merged into the DOM.\nexport const FragmentMergeModes = {\n // Morphs the fragment into the existing element using idiomorph.\n Morph: \"morph\",\n // Replaces the inner HTML of the existing element.\n Inner: \"inner\",\n // Replaces the outer HTML of the existing element.\n Outer: \"outer\",\n // Prepends the fragment to the existing element.\n Prepend: \"prepend\",\n // Appends the fragment to the existing element.\n Append: \"append\",\n // Inserts the fragment before the existing element.\n Before: \"before\",\n // Inserts the fragment after the existing element.\n After: \"after\",\n // Upserts the attributes of the existing element.\n UpsertAttributes: \"upsertAttributes\",\n} as const;\n\n// Default value for FragmentMergeMode\nexport const DefaultFragmentMergeMode = FragmentMergeModes.Morph;\n\n// The type protocol on top of SSE which allows for core pushed based communication between the server and the client.\nexport const EventTypes = {\n // An event for merging HTML fragments into the DOM.\n MergeFragments: \"datastar-merge-fragments\",\n // An event for merging signals.\n MergeSignals: \"datastar-merge-signals\",\n // An event for removing HTML fragments from the DOM.\n RemoveFragments: \"datastar-remove-fragments\",\n // An event for removing signals.\n RemoveSignals: \"datastar-remove-signals\",\n // An event for executing elements in the browser.\n ExecuteScript: \"datastar-execute-script\",\n} as const;\n// #endregion\n\n// #endregion", "import type { EffectFn, Signal } from '../vendored/preact-core'\nimport type { SignalsRoot } from './signals'\n\nexport type OnRemovalFn = () => void\n\nexport enum PluginType {\n Attribute = 1,\n Watcher = 2,\n Action = 3,\n}\n\nexport interface DatastarPlugin {\n type: PluginType // The type of plugin\n name: string // The name of the plugin\n}\n\nexport enum Requirement {\n Allowed = 0,\n Must = 1,\n Denied = 2,\n Exclusive = 3,\n}\n\n// A plugin accesible via a `data-${name}` attribute on an element\nexport interface AttributePlugin extends DatastarPlugin {\n type: PluginType.Attribute\n onGlobalInit?: (ctx: InitContext) => void // Called once on registration of the plugin\n onLoad: (ctx: RuntimeContext) => OnRemovalFn | void // Return a function to be called on removal\n mods?: Set // If not provided, all modifiers are allowed\n keyReq?: Requirement // The rules for the key requirements\n valReq?: Requirement // The rules for the value requirements\n removeOnLoad?: boolean // If true, the attribute is removed after onLoad (useful for plugins you don\u2019t want reapplied)\n argNames?: string[] // argument names for the reactive expression\n}\n\n// A plugin that runs on the global scope of the DastaStar instance\nexport interface WatcherPlugin extends DatastarPlugin {\n type: PluginType.Watcher\n onGlobalInit?: (ctx: InitContext) => void\n}\n\nexport type ActionPlugins = Record\nexport type ActionMethod = (ctx: RuntimeContext, ...args: any[]) => any\n\nexport interface ActionPlugin extends DatastarPlugin {\n type: PluginType.Action\n fn: ActionMethod\n}\n\nexport type GlobalInitializer = (ctx: InitContext) => void\nexport type RemovalEntry = { id: string; fns: Array }\n\nexport type InitContext = {\n plugin: DatastarPlugin\n signals: SignalsRoot\n effect: (fn: EffectFn) => OnRemovalFn\n actions: Readonly\n apply: (target: Element) => void\n cleanup: (el: Element) => void\n}\n\nexport type HTMLorSVGElement = Element & (HTMLElement | SVGElement)\nexport type Modifiers = Map> // mod name -> tags\n\nexport type RuntimeContext = InitContext & {\n plugin: DatastarPlugin // The name of the plugin\n el: HTMLorSVGElement // The element the attribute is on\n rawKey: Readonly // no parsing data-* key\n key: Readonly // data-* key without the prefix or tags\n value: Readonly // value of data-* attribute\n mods: Modifiers // the tags and their arguments\n genRX: () => (...args: any[]) => T // a reactive expression\n fnContent?: string // the content of the function\n}\n\nexport type NestedValues = { [key: string]: NestedValues | any }\nexport type NestedSignal = {\n [key: string]: NestedSignal | Signal\n}\n\nexport type RuntimeExpressionFunction = (\n ctx: RuntimeContext,\n ...args: any[]\n) => any\n", "import {\n type AttributePlugin,\n PluginType,\n Requirement,\n} from '../../../../engine/types'\n\nconst name = 'computed'\nexport const Computed: AttributePlugin = {\n type: PluginType.Attribute,\n name,\n keyReq: Requirement.Must,\n valReq: Requirement.Must,\n onLoad: ({ key, signals, genRX }) => {\n const rx = genRX()\n signals.setComputed(key, rx)\n },\n}\n", "export const isBoolString = (str: string) => str.trim() === 'true'\n\nexport const kebabize = (str: string) =>\n str.replace(\n /[A-Z]+(?![a-z])|[A-Z]/g,\n ($, ofs) => (ofs ? '-' : '') + $.toLowerCase(),\n )\n\nexport const camelize = (str: string) =>\n str\n .replace(/(?:^\\w|[A-Z]|\\b\\w)/g, (word, index) =>\n index === 0 ? word.toLowerCase() : word.toUpperCase(),\n )\n .replace(/\\s+/g, '')\n\nexport const jsStrToObject = (raw: string) =>\n new Function(`return Object.assign({}, ${raw})`)()\n\nexport const trimDollarSignPrefix = (str: string) =>\n str.startsWith('$') ? str.slice(1) : str\n", "import {\n type AttributePlugin,\n type NestedValues,\n PluginType,\n} from '../../../../engine/types'\nimport { jsStrToObject } from '../../../../utils/text'\n\nexport const Signals: AttributePlugin = {\n type: PluginType.Attribute,\n name: 'signals',\n removeOnLoad: true,\n onLoad: (ctx) => {\n const { key, value, genRX, signals, mods } = ctx\n const ifMissing = mods.has('ifmissing')\n if (key !== '' && !ifMissing) {\n const v = value === '' ? value : genRX()()\n signals.setValue(key, v)\n } else {\n const obj = jsStrToObject(ctx.value)\n ctx.value = JSON.stringify(obj)\n const rx = genRX()\n const nv = rx()\n signals.merge(nv, ifMissing)\n }\n },\n}\n", "import {\n type AttributePlugin,\n PluginType,\n Requirement,\n} from '../../../../engine/types'\n\nexport const Star: AttributePlugin = {\n type: PluginType.Attribute,\n name: 'star',\n keyReq: Requirement.Denied,\n valReq: Requirement.Denied,\n onLoad: () => {\n alert('YOU ARE PROBABLY OVERCOMPLICATING IT')\n },\n}\n", "import { DATASTAR } from '../engine/consts'\n\nexport class Hash {\n #value = 0\n #prefix: string\n\n constructor(prefix = DATASTAR) {\n this.#prefix = prefix\n }\n\n with(x: number | string): Hash {\n if (typeof x === 'string') {\n for (const c of x.split('')) {\n this.with(c.charCodeAt(0))\n }\n } else {\n this.#value = (this.#value << 5) - this.#value + x\n }\n return this\n }\n\n reset(): Hash {\n this.#value = 0\n return this\n }\n\n get value() {\n return this.#prefix + Math.abs(this.#value).toString(36)\n }\n}\n\nexport function elUniqId(el: Element) {\n if (el.id) return el.id\n const hash = new Hash()\n\n let currentEl = el\n while (currentEl.parentNode) {\n if (currentEl.id) {\n hash.with(currentEl.id)\n break\n }\n if (currentEl === currentEl.ownerDocument.documentElement) {\n hash.with(currentEl.tagName)\n } else {\n for (\n let i = 1, e = el;\n e.previousElementSibling;\n e = e.previousElementSibling, i++\n ) {\n hash.with(i)\n }\n }\n\n currentEl = currentEl.parentNode as Element\n }\n return hash.value\n}\n\nexport function onElementRemoved(element: Element, callback: () => void) {\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n for (const removedNode of mutation.removedNodes) {\n if (removedNode === element) {\n observer.disconnect()\n callback()\n return\n }\n }\n }\n })\n observer.observe(element.parentNode as Node, { childList: true })\n}\n", "import { kebabize } from '../utils/text'\nimport { DATASTAR } from './consts'\nimport { type InitContext, PluginType, type RuntimeContext } from './types'\n\n// const url = 'https://data-star.dev/errors'\nconst url = `${window.location.origin}/errors`\n\ninterface Metadata {\n error?: string;\n [key: string]: any;\n}\n\nfunction dserr(type: string, reason: string, metadata: Metadata = {}) {\n const e = new Error()\n reason = reason[0].toUpperCase() + reason.slice(1)\n e.name = `${DATASTAR} ${type} error`\n const r = kebabize(reason).replaceAll('-', '_')\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}/${type}/${r}?${q}\\nContext: ${c}`\n return e\n}\n\nexport function internalErr(from: string, reason: string, args = {}) {\n return dserr('internal', reason, Object.assign({ from }, args))\n}\n\nexport function initErr(reason: string, ctx: InitContext, metadata = {}) {\n const errCtx = {\n plugin: {\n name: ctx.plugin.name,\n type: PluginType[ctx.plugin.type],\n },\n }\n return dserr('init', reason, Object.assign(errCtx, metadata))\n}\n\nexport function runtimeErr(reason: string, ctx: RuntimeContext, metadata = {}) {\n const errCtx = {\n plugin: {\n name: ctx.plugin.name,\n type: PluginType[ctx.plugin.type],\n },\n element: {\n id: ctx.el.id,\n tag: ctx.el.tagName,\n },\n expression: {\n rawKey: ctx.rawKey,\n key: ctx.key,\n value: ctx.value,\n validSignals: ctx.signals.paths(),\n fnContent: ctx.fnContent,\n },\n }\n return dserr('runtime', reason, Object.assign(errCtx, metadata))\n}", "import { internalErr } from '../engine/errors'\nimport type { OnRemovalFn } from '../engine/types'\n\nconst from = 'preact-signals'\n\n// An named symbol/brand for detecting Signal instances even when they weren't\n// created using the same signals library version.\nconst BRAND_SYMBOL = Symbol.for('preact-signals')\n\n// Flags for Computed and Effect.\nconst RUNNING = 1 << 0\nconst NOTIFIED = 1 << 1\nconst OUTDATED = 1 << 2\nconst DISPOSED = 1 << 3\nconst HAS_ERROR = 1 << 4\nconst TRACKING = 1 << 5\n\n// A linked list node used to track dependencies (sources) and dependents (targets).\n// Also used to remember the source's last version number that the target saw.\ntype Node = {\n // A source whose value the target depends on.\n _source: Signal\n _prevSource?: Node\n _nextSource?: Node\n\n // A target that depends on the source and should be notified when the source changes.\n _target: Computed | Effect\n _prevTarget?: Node\n _nextTarget?: Node\n\n // The version number of the source that target has last seen. We use version numbers\n // instead of storing the source value, because source values can take arbitrary amount\n // of memory, and computeds could hang on to them forever because they're lazily evaluated.\n // Use the special value -1 to mark potentially unused but recyclable nodes.\n _version: number\n\n // Used to remember & roll back the source's previous `._node` value when entering &\n // exiting a new evaluation context.\n _rollbackNode?: Node\n}\n\nfunction startBatch() {\n batchDepth++\n}\n\nfunction endBatch() {\n if (batchDepth > 1) {\n batchDepth--\n return\n }\n\n let error: unknown\n let hasError = false\n\n while (batchedEffect !== undefined) {\n let effect: Effect | undefined = batchedEffect\n batchedEffect = undefined\n\n batchIteration++\n\n while (effect !== undefined) {\n const next: Effect | undefined = effect._nextBatchedEffect\n effect._nextBatchedEffect = undefined\n effect._flags &= ~NOTIFIED\n\n if (!(effect._flags & DISPOSED) && needsToRecompute(effect)) {\n try {\n effect._callback()\n } catch (err) {\n if (!hasError) {\n error = err\n hasError = true\n }\n }\n }\n effect = next\n }\n }\n batchIteration = 0\n batchDepth--\n\n if (hasError) {\n throw internalErr(from, 'BatchError, error', { error })\n }\n}\n\n/**\n * Combine multiple value updates into one \"commit\" at the end of the provided callback.\n *\n * Batches can be nested and changes are only flushed once the outermost batch callback\n * completes.\n *\n * Accessing a signal that has been modified within a batch will reflect its updated\n * value.\n *\n * @param fn The callback function.\n * @returns The value returned by the callback.\n */\nfunction batch(fn: () => T): T {\n if (batchDepth > 0) {\n return fn()\n }\n /*@__INLINE__**/ startBatch()\n try {\n return fn()\n } finally {\n endBatch()\n }\n}\n\n// Currently evaluated computed or effect.\nlet evalContext: Computed | Effect | undefined = undefined\n\n/**\n * Run a callback function that can access signal values without\n * subscribing to the signal updates.\n *\n * @param fn The callback function.\n * @returns The value returned by the callback.\n */\nfunction untracked(fn: () => T): T {\n const prevContext = evalContext\n evalContext = undefined\n try {\n return fn()\n } finally {\n evalContext = prevContext\n }\n}\n\n// Effects collected into a batch.\nlet batchedEffect: Effect | undefined = undefined\nlet batchDepth = 0\nlet batchIteration = 0\n\n// A global version number for signals, used for fast-pathing repeated\n// computed.peek()/computed.value calls when nothing has changed globally.\nlet globalVersion = 0\n\nfunction addDependency(signal: Signal): Node | undefined {\n if (evalContext === undefined) {\n return undefined\n }\n\n let node = signal._node\n if (node === undefined || node._target !== evalContext) {\n /**\n * `signal` is a new dependency. Create a new dependency node, and set it\n * as the tail of the current context's dependency list. e.g:\n *\n * { A <-> B }\n * \u2191 \u2191\n * tail node (new)\n * \u2193\n * { A <-> B <-> C }\n * \u2191\n * tail (evalContext._sources)\n */\n node = {\n _version: 0,\n _source: signal,\n _prevSource: evalContext._sources,\n _nextSource: undefined,\n _target: evalContext,\n _prevTarget: undefined,\n _nextTarget: undefined,\n _rollbackNode: node,\n }\n\n if (evalContext._sources !== undefined) {\n evalContext._sources._nextSource = node\n }\n evalContext._sources = node\n signal._node = node\n\n // Subscribe to change notifications from this dependency if we're in an effect\n // OR evaluating a computed signal that in turn has subscribers.\n if (evalContext._flags & TRACKING) {\n signal._subscribe(node)\n }\n return node\n }\n if (node._version === -1) {\n // `signal` is an existing dependency from a previous evaluation. Reuse it.\n node._version = 0\n\n /**\n * If `node` is not already the current tail of the dependency list (i.e.\n * there is a next node in the list), then make the `node` the new tail. e.g:\n *\n * { A <-> B <-> C <-> D }\n * \u2191 \u2191\n * node \u250C\u2500\u2500\u2500 tail (evalContext._sources)\n * \u2514\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2500\u2500\u2510\n * \u2193 \u2193\n * { A <-> C <-> D <-> B }\n * \u2191\n * tail (evalContext._sources)\n */\n if (node._nextSource !== undefined) {\n node._nextSource._prevSource = node._prevSource\n\n if (node._prevSource !== undefined) {\n node._prevSource._nextSource = node._nextSource\n }\n\n node._prevSource = evalContext._sources\n node._nextSource = undefined\n\n evalContext._sources!._nextSource = node\n evalContext._sources = node\n }\n\n // We can assume that the currently evaluated effect / computed signal is already\n // subscribed to change notifications from `signal` if needed.\n return node\n }\n return undefined\n}\n\n/**\n * The base class for plain and computed signals.\n */\n// @ts-ignore: \"Cannot redeclare exported variable 'Signal'.\"\n//\n// A function with the same name is defined later, so we need to ignore TypeScript's\n// warning about a redeclared variable.\n//\n// The class is declared here, but later implemented with ES5-style protoTYPEOF_\n// This enables better control of the transpiled output size.\ndeclare class Signal {\n /** @internal */\n _value: unknown\n\n /**\n * @internal\n * Version numbers should always be >= 0, because the special value -1 is used\n * by Nodes to signify potentially unused but recyclable nodes.\n */\n _version: number\n\n /** @internal */\n _node?: Node\n\n /** @internal */\n _targets?: Node\n\n constructor(value?: T)\n\n /** @internal */\n _refresh(): boolean\n\n /** @internal */\n _subscribe(node: Node): void\n\n /** @internal */\n _unsubscribe(node: Node): void\n\n subscribe(fn: (value: T) => void): () => void\n\n valueOf(): T\n\n toString(): string\n\n toJSON(): T\n\n peek(): T\n\n brand: typeof BRAND_SYMBOL\n\n get value(): T\n set value(value: T)\n}\n\n/** @internal */\n// @ts-ignore: \"Cannot redeclare exported variable 'Signal'.\"\n//\n// A class with the same name has already been declared, so we need to ignore\n// TypeScript's warning about a redeclared variable.\n//\n// The previously declared class is implemented here with ES5-style protoTYPEOF_\n// This enables better control of the transpiled output size.\n// biome-ignore lint/suspicious/noRedeclare: \nfunction Signal(this: Signal, value?: unknown) {\n this._value = value\n this._version = 0\n this._node = undefined\n this._targets = undefined\n}\n\nSignal.prototype.brand = BRAND_SYMBOL\n\nSignal.prototype._refresh = () => true\n\nSignal.prototype._subscribe = function (node) {\n if (this._targets !== node && node._prevTarget === undefined) {\n node._nextTarget = this._targets\n if (this._targets !== undefined) {\n this._targets._prevTarget = node\n }\n this._targets = node\n }\n}\n\nSignal.prototype._unsubscribe = function (node) {\n // Only run the unsubscribe step if the signal has any subscribers to begin with.\n if (this._targets !== undefined) {\n const prev = node._prevTarget\n const next = node._nextTarget\n if (prev !== undefined) {\n prev._nextTarget = next\n node._prevTarget = undefined\n }\n if (next !== undefined) {\n next._prevTarget = prev\n node._nextTarget = undefined\n }\n if (node === this._targets) {\n this._targets = next\n }\n }\n}\n\nSignal.prototype.subscribe = function (fn) {\n return effect(() => {\n const value = this.value\n\n const prevContext = evalContext\n evalContext = undefined\n try {\n fn(value)\n } finally {\n evalContext = prevContext\n }\n })\n}\n\nSignal.prototype.valueOf = function () {\n return this.value\n}\n\nSignal.prototype.toString = function () {\n return `${this.value}`\n}\n\nSignal.prototype.toJSON = function () {\n return this.value\n}\n\nSignal.prototype.peek = function () {\n const prevContext = evalContext\n evalContext = undefined\n try {\n return this.value\n } finally {\n evalContext = prevContext\n }\n}\n\nObject.defineProperty(Signal.prototype, 'value', {\n get(this: Signal) {\n const node = addDependency(this)\n if (node !== undefined) {\n node._version = this._version\n }\n return this._value\n },\n set(this: Signal, value) {\n if (value !== this._value) {\n if (batchIteration > 100) {\n throw internalErr(from, 'SignalCycleDetected')\n }\n\n this._value = value\n this._version++\n globalVersion++\n\n /**@__INLINE__*/ startBatch()\n try {\n for (\n let node = this._targets;\n node !== undefined;\n node = node._nextTarget\n ) {\n node._target._notify()\n }\n } finally {\n endBatch()\n }\n }\n },\n})\n\n/**\n * Create a new plain signal.\n *\n * @param value The initial value for the signal.\n * @returns A new signal.\n */\nexport function signal(value: T): Signal\nexport function signal(): Signal\nexport function signal(value?: T): Signal {\n return new Signal(value)\n}\n\nfunction needsToRecompute(target: Computed | Effect): boolean {\n // Check the dependencies for changed values. The dependency list is already\n // in order of use. Therefore if multiple dependencies have changed values, only\n // the first used dependency is re-evaluated at this point.\n for (\n let node = target._sources;\n node !== undefined;\n node = node._nextSource\n ) {\n // If there's a new version of the dependency before or after refreshing,\n // or the dependency has something blocking it from refreshing at all (e.g. a\n // dependency cycle), then we need to recompute.\n if (\n node._source._version !== node._version ||\n !node._source._refresh() ||\n node._source._version !== node._version\n ) {\n return true\n }\n }\n // If none of the dependencies have changed values since last recompute then\n // there's no need to recompute.\n return false\n}\n\nfunction prepareSources(target: Computed | Effect) {\n /**\n * 1. Mark all current sources as re-usable nodes (version: -1)\n * 2. Set a rollback node if the current node is being used in a different context\n * 3. Point 'target._sources' to the tail of the doubly-linked list, e.g:\n *\n * { undefined <- A <-> B <-> C -> undefined }\n * \u2191 \u2191\n * \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n * target._sources = A; (node is head) \u2502\n * \u2193 \u2502\n * target._sources = C; (node is tail) \u2500\u2518\n */\n for (\n let node = target._sources;\n node !== undefined;\n node = node._nextSource\n ) {\n const rollbackNode = node._source._node\n if (rollbackNode !== undefined) {\n node._rollbackNode = rollbackNode\n }\n node._source._node = node\n node._version = -1\n\n if (node._nextSource === undefined) {\n target._sources = node\n break\n }\n }\n}\n\nfunction cleanupSources(target: Computed | Effect) {\n let node = target._sources\n let head: Node | undefined = undefined\n\n /**\n * At this point 'target._sources' points to the tail of the doubly-linked list.\n * It contains all existing sources + new sources in order of use.\n * Iterate backwards until we find the head node while dropping old dependencies.\n */\n while (node !== undefined) {\n const prev = node._prevSource\n\n /**\n * The node was not re-used, unsubscribe from its change notifications and remove itself\n * from the doubly-linked list. e.g:\n *\n * { A <-> B <-> C }\n * \u2193\n * { A <-> C }\n */\n if (node._version === -1) {\n node._source._unsubscribe(node)\n\n if (prev !== undefined) {\n prev._nextSource = node._nextSource\n }\n if (node._nextSource !== undefined) {\n node._nextSource._prevSource = prev\n }\n } else {\n /**\n * The new head is the last node seen which wasn't removed/unsubscribed\n * from the doubly-linked list. e.g:\n *\n * { A <-> B <-> C }\n * \u2191 \u2191 \u2191\n * \u2502 \u2502 \u2514 head = node\n * \u2502 \u2514 head = node\n * \u2514 head = node\n */\n head = node\n }\n\n node._source._node = node._rollbackNode\n if (node._rollbackNode !== undefined) {\n node._rollbackNode = undefined\n }\n\n node = prev\n }\n\n target._sources = head\n}\n\nexport declare class Computed extends Signal {\n _fn: () => T\n _sources?: Node\n _globalVersion: number\n _flags: number\n\n constructor(fn: () => T)\n\n _notify(): void\n get value(): T\n}\n\n// biome-ignore lint/suspicious/noRedeclare: \nexport function Computed(this: Computed, fn: () => unknown) {\n Signal.call(this, undefined)\n\n this._fn = fn\n this._sources = undefined\n this._globalVersion = globalVersion - 1\n this._flags = OUTDATED\n}\n\nComputed.prototype = new Signal() as Computed\n\nComputed.prototype._refresh = function () {\n this._flags &= ~NOTIFIED\n\n if (this._flags & RUNNING) {\n return false\n }\n\n // If this computed signal has subscribed to updates from its dependencies\n // (TRACKING flag set) and none of them have notified about changes (OUTDATED\n // flag not set), then the computed value can't have changed.\n if ((this._flags & (OUTDATED | TRACKING)) === TRACKING) {\n return true\n }\n this._flags &= ~OUTDATED\n\n if (this._globalVersion === globalVersion) {\n return true\n }\n this._globalVersion = globalVersion\n\n // Mark this computed signal running before checking the dependencies for value\n // changes, so that the RUNNING flag can be used to notice cyclical dependencies.\n this._flags |= RUNNING\n if (this._version > 0 && !needsToRecompute(this)) {\n this._flags &= ~RUNNING\n return true\n }\n\n const prevContext = evalContext\n try {\n prepareSources(this)\n evalContext = this\n const value = this._fn()\n if (\n this._flags & HAS_ERROR ||\n this._value !== value ||\n this._version === 0\n ) {\n this._value = value\n this._flags &= ~HAS_ERROR\n this._version++\n }\n } catch (err) {\n this._value = err\n this._flags |= HAS_ERROR\n this._version++\n }\n evalContext = prevContext\n cleanupSources(this)\n this._flags &= ~RUNNING\n return true\n}\n\nComputed.prototype._subscribe = function (node) {\n if (this._targets === undefined) {\n this._flags |= OUTDATED | TRACKING\n\n // A computed signal subscribes lazily to its dependencies when it\n // gets its first subscriber.\n for (\n let node = this._sources;\n node !== undefined;\n node = node._nextSource\n ) {\n node._source._subscribe(node)\n }\n }\n Signal.prototype._subscribe.call(this, node)\n}\n\nComputed.prototype._unsubscribe = function (node) {\n // Only run the unsubscribe step if the computed signal has any subscribers.\n if (this._targets !== undefined) {\n Signal.prototype._unsubscribe.call(this, node)\n\n // Computed signal unsubscribes from its dependencies when it loses its last subscriber.\n // This makes it possible for unreferences subgraphs of computed signals to get garbage collected.\n if (this._targets === undefined) {\n this._flags &= ~TRACKING\n\n for (\n let node = this._sources;\n node !== undefined;\n node = node._nextSource\n ) {\n node._source._unsubscribe(node)\n }\n }\n }\n}\n\nComputed.prototype._notify = function () {\n if (!(this._flags & NOTIFIED)) {\n this._flags |= OUTDATED | NOTIFIED\n\n for (\n let node = this._targets;\n node !== undefined;\n node = node._nextTarget\n ) {\n node._target._notify()\n }\n }\n}\n\nObject.defineProperty(Computed.prototype, 'value', {\n get(this: Computed) {\n if (this._flags & RUNNING) {\n // Cycle detected\n throw internalErr(from, 'SignalCycleDetected')\n }\n const node = addDependency(this)\n this._refresh()\n if (node !== undefined) {\n node._version = this._version\n }\n if (this._flags & HAS_ERROR) {\n throw internalErr(from, 'GetComputedError', { value: this._value })\n }\n return this._value\n },\n})\n\n/**\n * An interface for read-only signals.\n */\ninterface ReadonlySignal {\n readonly value: T\n peek(): T\n\n subscribe(fn: (value: T) => void): () => void\n valueOf(): T\n toString(): string\n toJSON(): T\n brand: typeof BRAND_SYMBOL\n}\n\n/**\n * Create a new signal that is computed based on the values of other signals.\n *\n * The returned computed signal is read-only, and its value is automatically\n * updated when any signals accessed from within the callback function change.\n *\n * @param fn The effect callback.\n * @returns A new read-only signal.\n */\nfunction computed(fn: () => T): ReadonlySignal {\n return new Computed(fn)\n}\n\nfunction cleanupEffect(effect: Effect) {\n const cleanup = effect._cleanup\n effect._cleanup = undefined\n\n if (typeof cleanup === 'function') {\n /*@__INLINE__**/ startBatch()\n\n // Run cleanup functions always outside of any context.\n const prevContext = evalContext\n evalContext = undefined\n try {\n cleanup!()\n } catch (error) {\n effect._flags &= ~RUNNING\n effect._flags |= DISPOSED\n disposeEffect(effect)\n throw internalErr(from, 'CleanupEffectError', { error })\n } finally {\n evalContext = prevContext\n endBatch()\n }\n }\n}\n\nfunction disposeEffect(effect: Effect) {\n for (\n let node = effect._sources;\n node !== undefined;\n node = node._nextSource\n ) {\n node._source._unsubscribe(node)\n }\n effect._fn = undefined\n effect._sources = undefined\n\n cleanupEffect(effect)\n}\n\nfunction endEffect(this: Effect, prevContext?: Computed | Effect) {\n if (evalContext !== this) {\n throw internalErr(from, 'EndEffectError')\n }\n cleanupSources(this)\n evalContext = prevContext\n\n this._flags &= ~RUNNING\n if (this._flags & DISPOSED) {\n disposeEffect(this)\n }\n endBatch()\n}\n\nexport type EffectFn = () => OnRemovalFn | void | Promise\n\ndeclare class Effect {\n _fn?: EffectFn\n _cleanup?: () => void\n _sources?: Node\n _nextBatchedEffect?: Effect\n _flags: number\n\n constructor(fn: EffectFn)\n\n _callback(): void\n _start(): () => void\n _notify(): void\n _dispose(): void\n}\n\n// biome-ignore lint/suspicious/noRedeclare: \nfunction Effect(this: Effect, fn: EffectFn) {\n this._fn = fn\n this._cleanup = undefined\n this._sources = undefined\n this._nextBatchedEffect = undefined\n this._flags = TRACKING\n}\n\nEffect.prototype._callback = function () {\n const finish = this._start()\n try {\n if (this._flags & DISPOSED) return\n if (this._fn === undefined) return\n\n const cleanup = this._fn()\n if (typeof cleanup === 'function') {\n this._cleanup = cleanup!\n }\n } finally {\n finish()\n }\n}\n\nEffect.prototype._start = function () {\n if (this._flags & RUNNING) {\n throw internalErr(from, 'SignalCycleDetected')\n }\n this._flags |= RUNNING\n this._flags &= ~DISPOSED\n cleanupEffect(this)\n prepareSources(this)\n\n /*@__INLINE__**/ startBatch()\n const prevContext = evalContext\n evalContext = this\n return endEffect.bind(this, prevContext)\n}\n\nEffect.prototype._notify = function () {\n if (!(this._flags & NOTIFIED)) {\n this._flags |= NOTIFIED\n this._nextBatchedEffect = batchedEffect\n batchedEffect = this\n }\n}\n\nEffect.prototype._dispose = function () {\n this._flags |= DISPOSED\n\n if (!(this._flags & RUNNING)) {\n disposeEffect(this)\n }\n}\n\n/**\n * Create an effect to run arbitrary code in response to signal changes.\n *\n * An effect tracks which signals are accessed within the given callback\n * function `fn`, and re-runs the callback when those signals change.\n *\n * The callback may return a cleanup function. The cleanup function gets\n * run once, either when the callback is next called or when the effect\n * gets disposed, whichever happens first.\n *\n * @param fn The effect callback.\n * @returns A function for disposing the effect.\n */\nfunction effect(fn: EffectFn): () => void {\n const effect = new Effect(fn)\n try {\n effect._callback()\n } catch (error) {\n effect._dispose()\n // Throw the error, since it is already a Datastar error.\n throw error\n }\n // Return a bound function instead of a wrapper like `() => effect._dispose()`,\n // because bound functions seem to be just as fast and take up a lot less memory.\n return effect._dispose.bind(effect)\n}\n\nexport { batch, computed, effect, Signal, untracked }\nexport type { ReadonlySignal }\n", "import { type Computed, Signal, computed } from '../vendored/preact-core'\nimport { internalErr } from './errors'\nimport type { NestedSignal, NestedValues } from './types'\n\nconst from = 'namespacedSignals'\n\n// If onlyPublic is true, only signals not starting with an underscore are included\nfunction nestedValues(\n signal: NestedSignal,\n onlyPublic = false,\n): Record {\n const kv: Record = {}\n for (const key in signal) {\n if (Object.hasOwn(signal, key)) {\n if (onlyPublic && key.startsWith('_')) {\n continue\n }\n const value = signal[key]\n if (value instanceof Signal) {\n kv[key] = value.value\n } else {\n kv[key] = nestedValues(value)\n }\n }\n }\n return kv\n}\n\nfunction mergeNested(\n target: NestedValues,\n values: NestedValues,\n onlyIfMissing = false,\n): void {\n for (const key in values) {\n if (Object.hasOwn(values, key)) {\n if (key.match(/\\_\\_+/)) {\n throw internalErr(from, 'InvalidSignalKey', { key })\n }\n\n const value = values[key]\n if (value instanceof Object && !Array.isArray(value)) {\n if (!target[key]) {\n target[key] = {}\n }\n mergeNested(\n target[key] as NestedValues,\n value as NestedValues,\n onlyIfMissing,\n )\n } else {\n const hasKey = Object.hasOwn(target, key)\n if (hasKey) {\n if (onlyIfMissing) continue\n const t = target[key]\n if (t instanceof Signal) {\n t.value = value\n continue\n }\n }\n target[key] = new Signal(value)\n }\n }\n }\n}\n\nfunction walkNestedSignal(\n signal: NestedSignal,\n cb: (dotDeliminatedPath: string, signal: Signal) => void,\n): void {\n for (const key in signal) {\n if (Object.hasOwn(signal, key)) {\n const value = signal[key]\n if (value instanceof Signal) {\n cb(key, value)\n } else {\n walkNestedSignal(value, (path, value) => {\n cb(`${key}.${path}`, value)\n })\n }\n }\n }\n}\n\n// Recursive function to subset a nested object, each key is a dot-delimited path\nfunction nestedSubset(original: NestedValues, ...keys: string[]): NestedValues {\n const subset: NestedValues = {}\n for (const key of keys) {\n const parts = key.split('.')\n let subOriginal = original\n let subSubset = subset\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]\n if (!subOriginal[part]) {\n return {}\n }\n if (!subSubset[part]) {\n subSubset[part] = {}\n }\n subOriginal = subOriginal[part] as NestedValues\n subSubset = subSubset[part] as NestedValues\n }\n const last = parts[parts.length - 1]\n subSubset[last] = subOriginal[last]\n }\n return subset\n}\n\n// Recursively walk a NestedValue with a callback and dot-delimited path\nexport function walkNestedValues(\n nv: NestedValues,\n cb: (path: string, value: any) => void,\n) {\n for (const key in nv) {\n if (Object.hasOwn(nv, key)) {\n const value = nv[key]\n if (value instanceof Object && !Array.isArray(value)) {\n walkNestedValues(value, (path, value) => {\n cb(`${key}.${path}`, value)\n })\n } else {\n cb(key, value)\n }\n }\n }\n}\n\nexport class SignalsRoot {\n #signals: NestedSignal = {}\n\n exists(dotDelimitedPath: string): boolean {\n return !!this.signal(dotDelimitedPath)\n }\n\n signal(dotDelimitedPath: string): Signal | null {\n const parts = dotDelimitedPath.split('.')\n let subSignals = this.#signals\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]\n if (!subSignals[part]) {\n return null\n }\n subSignals = subSignals[part] as NestedSignal\n }\n const last = parts[parts.length - 1]\n const signal = subSignals[last]\n if (!signal)\n throw internalErr(from, 'SignalNotFound', { path: dotDelimitedPath })\n return signal as Signal\n }\n\n setSignal>(dotDelimitedPath: string, signal: T) {\n const parts = dotDelimitedPath.split('.')\n let subSignals = this.#signals\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]\n if (!subSignals[part]) {\n subSignals[part] = {}\n }\n subSignals = subSignals[part] as NestedSignal\n }\n const last = parts[parts.length - 1]\n subSignals[last] = signal\n }\n\n setComputed(dotDelimitedPath: string, fn: () => T) {\n const signal = computed(() => fn()) as Computed\n this.setSignal(dotDelimitedPath, signal)\n }\n\n value(dotDelimitedPath: string): T {\n const signal = this.signal(dotDelimitedPath) as Signal\n return signal?.value\n }\n\n setValue(dotDelimitedPath: string, value: T) {\n const s = this.upsertIfMissing(dotDelimitedPath, value)\n s.value = value\n }\n\n upsertIfMissing(dotDelimitedPath: string, defaultValue: T) {\n const parts = dotDelimitedPath.split('.')\n let subSignals = this.#signals\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]\n if (!subSignals[part]) {\n subSignals[part] = {}\n }\n subSignals = subSignals[part] as NestedSignal\n }\n const last = parts[parts.length - 1]\n\n const current = subSignals[last]\n if (current instanceof Signal) {\n return current as Signal\n }\n\n const signal = new Signal(defaultValue)\n subSignals[last] = signal\n\n return signal\n }\n\n remove(...dotDelimitedPaths: string[]) {\n for (const path of dotDelimitedPaths) {\n const parts = path.split('.')\n let subSignals = this.#signals\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]\n if (!subSignals[part]) {\n return\n }\n subSignals = subSignals[part] as NestedSignal\n }\n const last = parts[parts.length - 1]\n delete subSignals[last]\n }\n }\n\n merge(other: NestedValues, onlyIfMissing = false) {\n mergeNested(this.#signals, other, onlyIfMissing)\n }\n\n subset(...keys: string[]): NestedValues {\n return nestedSubset(this.values(), ...keys)\n }\n\n walk(cb: (name: string, signal: Signal) => void) {\n walkNestedSignal(this.#signals, cb)\n }\n\n paths() {\n const signalNames = new Array()\n this.walk((path) => signalNames.push(path))\n return signalNames\n }\n\n values(onlyPublic = false): NestedValues {\n return nestedValues(this.#signals, onlyPublic)\n }\n\n JSON(shouldIndent = true, onlyPublic = false) {\n const values = this.values(onlyPublic)\n if (!shouldIndent) {\n return JSON.stringify(values)\n }\n return JSON.stringify(values, null, 2)\n }\n\n public toString() {\n return this.JSON()\n }\n}\n", "import { Hash, elUniqId } from '../utils/dom'\nimport { camelize } from '../utils/text'\nimport { effect } from '../vendored/preact-core'\nimport { DSP, DSS } from './consts'\nimport { initErr, runtimeErr } from './errors'\nimport { SignalsRoot } from './signals'\nimport {\n type ActionPlugin,\n type ActionPlugins,\n type AttributePlugin,\n type DatastarPlugin,\n type GlobalInitializer,\n type HTMLorSVGElement,\n type InitContext,\n type OnRemovalFn,\n PluginType,\n type RemovalEntry,\n Requirement,\n type RuntimeContext,\n type RuntimeExpressionFunction,\n type WatcherPlugin,\n} from './types'\n\nexport class Engine {\n #signals = new SignalsRoot()\n #plugins: AttributePlugin[] = []\n #actions: ActionPlugins = {}\n #watchers: WatcherPlugin[] = []\n #removals = new Map()\n\n get signals() {\n return this.#signals\n }\n\n public load(...pluginsToLoad: DatastarPlugin[]) {\n for (const plugin of pluginsToLoad) {\n const that = this // I hate javascript\n const ctx: InitContext = {\n get signals() {\n return that.#signals\n },\n effect: (cb: () => void): OnRemovalFn => effect(cb),\n actions: this.#actions,\n apply: this.apply.bind(this),\n cleanup: this.#cleanup.bind(this),\n plugin,\n }\n\n let globalInitializer: GlobalInitializer | undefined\n switch (plugin.type) {\n case PluginType.Watcher: {\n const wp = plugin as WatcherPlugin\n this.#watchers.push(wp)\n globalInitializer = wp.onGlobalInit\n break\n }\n case PluginType.Action: {\n this.#actions[plugin.name] = plugin as ActionPlugin\n break\n }\n case PluginType.Attribute: {\n const ap = plugin as AttributePlugin\n this.#plugins.push(ap)\n globalInitializer = ap.onGlobalInit\n break\n }\n default: {\n throw initErr('InvalidPluginType', ctx)\n }\n }\n if (globalInitializer) {\n globalInitializer(ctx)\n }\n }\n\n // Sort attribute plugins by descending length then alphabetically\n this.#plugins.sort((a, b) => {\n const lenDiff = b.name.length - a.name.length\n if (lenDiff !== 0) return lenDiff\n return a.name.localeCompare(b.name)\n })\n }\n\n // Apply all plugins to the element and its children\n public apply(rootElement: Element) {\n this.#walkDownDOM(rootElement, (el) => {\n // Cleanup any previous plugins\n this.#cleanup(el)\n\n // Apply the plugins to the element in order of application\n // since DOMStringMap is ordered, we can be deterministic\n for (const rawKey of Object.keys(el.dataset)) {\n // Find the plugin that matches, since the plugins are sorted by length descending and alphabetically\n // the first match will be the most specific\n const plugin = this.#plugins.find((p) => rawKey.startsWith(p.name))\n\n // Skip if no plugin is found\n if (!plugin) continue\n\n // Ensure the element has an id\n if (!el.id.length) el.id = elUniqId(el)\n\n // Extract the key and value from the dataset\n let [key, ...rawModifiers] = rawKey\n .slice(plugin.name.length)\n .split(/\\_\\_+/)\n\n const hasKey = key.length > 0\n if (hasKey) {\n // Keys starting with a dash are not converted to camel case in the dataset\n const keySlice1 = key.slice(1)\n key = key.startsWith('-')\n ? keySlice1\n : key[0].toLowerCase() + keySlice1\n }\n const value = `${el.dataset[rawKey]}` || ''\n const hasValue = value.length > 0\n\n // Create the runtime context\n const that = this // I hate javascript\n const ctx: RuntimeContext = {\n get signals() {\n return that.#signals\n },\n effect: (cb: () => void): OnRemovalFn => effect(cb),\n apply: this.apply.bind(this),\n cleanup: this.#cleanup.bind(this),\n actions: this.#actions,\n genRX: () => this.#genRX(ctx, ...(plugin.argNames || [])),\n plugin,\n el,\n rawKey,\n key,\n value,\n mods: new Map(),\n }\n\n // Check the requirements\n const keyReq = plugin.keyReq || Requirement.Allowed\n if (hasKey) {\n if (keyReq === Requirement.Denied) {\n throw runtimeErr(`${plugin.name}KeyNotAllowed`, ctx)\n }\n } else if (keyReq === Requirement.Must) {\n throw runtimeErr(`${plugin.name}KeyRequired`, ctx)\n }\n const valReq = plugin.valReq || Requirement.Allowed\n if (hasValue) {\n if (valReq === Requirement.Denied) {\n throw runtimeErr(`${plugin.name}ValueNotAllowed`, ctx)\n }\n } else if (valReq === Requirement.Must) {\n throw runtimeErr(`${plugin.name}ValueRequired`, ctx)\n }\n\n // Check for exclusive requirements\n if (\n keyReq === Requirement.Exclusive ||\n valReq === Requirement.Exclusive\n ) {\n if (hasKey && hasValue) {\n throw runtimeErr(`${plugin.name}KeyAndValueProvided`, ctx)\n }\n if (!hasKey && !hasValue) {\n throw runtimeErr(`${plugin.name}KeyOrValueRequired`, ctx)\n }\n }\n\n for (const rawMod of rawModifiers) {\n const [label, ...mod] = rawMod.split('.')\n ctx.mods.set(\n camelize(label),\n new Set(mod.map((t) => t.toLowerCase())),\n )\n }\n\n // Load the plugin and store any cleanup functions\n const removal = plugin.onLoad(ctx)\n if (removal) {\n if (!this.#removals.has(el)) {\n this.#removals.set(el, {\n id: el.id,\n fns: [],\n })\n }\n this.#removals.get(el)?.fns.push(removal)\n }\n\n // Remove the attribute if required\n if (plugin?.removeOnLoad) delete el.dataset[rawKey]\n }\n })\n }\n\n #genRX(\n ctx: RuntimeContext,\n ...argNames: string[]\n ): RuntimeExpressionFunction {\n let userExpression = ''\n\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 //\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 = /(\\/(\\\\\\/|[^\\/])*\\/|\"(\\\\\"|[^\\\"])*\"|'(\\\\'|[^'])*'|`(\\\\`|[^`])*`|[^;])+/gm\n const statements = ctx.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 userExpression = statements.join(';\\n')\n }\n\n // Ignore any escaped values\n const escaped = new Map()\n const escapeRe = new RegExp(`(?:${DSP})(.*?)(?:${DSS})`, 'gm')\n for (const match of userExpression.matchAll(escapeRe)) {\n const k = match[1]\n const v = new Hash('dsEscaped').with(k).value\n escaped.set(v, k)\n userExpression = userExpression.replace(DSP + k + DSS, v)\n }\n\n const fnCall = /@(\\w*)\\(/gm\n const matches = userExpression.matchAll(fnCall)\n const methodsCalled = new Set()\n for (const match of matches) {\n methodsCalled.add(match[1])\n }\n\n // Replace any action calls\n const actionsRe = new RegExp(\n `@(${Object.keys(this.#actions).join('|')})\\\\(`,\n 'gm',\n )\n\n // Add ctx to action calls\n userExpression = userExpression.replaceAll(\n actionsRe,\n 'ctx.actions.$1.fn(ctx,',\n )\n\n // Replace any signal calls\n const signalNames = ctx.signals.paths()\n if (signalNames.length) {\n // Match any valid `$signalName` followed by a non-word character or end of string\n const signalsRe = new RegExp(`\\\\$(${signalNames.join('|')})(\\\\W|$)`, 'gm')\n userExpression = userExpression.replaceAll(\n signalsRe,\n `ctx.signals.signal('$1').value$2`,\n )\n }\n\n // Replace any escaped values\n for (const [k, v] of escaped) {\n userExpression = userExpression.replace(k, v)\n }\n\n const fnContent = `return (()=> {\\n${userExpression}\\n})()` // Wrap in IIFE\n ctx.fnContent = fnContent\n\n try {\n const fn = new Function('ctx', ...argNames, fnContent)\n return (...args: any[]) => {\n try {\n return fn(ctx, ...args)\n } catch (error: any) {\n throw runtimeErr('ExecuteExpression', ctx, {\n error: error.message,\n })\n }\n }\n } catch (error: any) {\n throw runtimeErr('GenerateExpression', ctx, {\n error: error.message,\n })\n }\n }\n\n #walkDownDOM(\n element: Element | null,\n callback: (el: HTMLorSVGElement) => void,\n ) {\n if (\n !element ||\n !(element instanceof HTMLElement || element instanceof SVGElement)\n ) {\n return null\n }\n const dataset = element.dataset\n if ('starIgnore' in dataset) {\n return null\n }\n if (!('starIgnore__self' in dataset)) {\n callback(element)\n }\n let el = element.firstElementChild\n while (el) {\n this.#walkDownDOM(el, callback)\n el = el.nextElementSibling\n }\n }\n\n // Clenup all plugins associated with the element\n #cleanup(el: Element) {\n const removalSet = this.#removals.get(el)\n if (removalSet) {\n for (const removal of removalSet.fns) {\n removal()\n }\n this.#removals.delete(el)\n }\n }\n}\n", "import { DSP } from '../engine/consts'\n// @ts-ignore\nconst _ = DSP // This is to force the import of DSP first in the compiled code\n\nimport { Computed } from '../plugins/official/core/attributes/computed'\nimport { Signals } from '../plugins/official/core/attributes/signals'\nimport { Star } from '../plugins/official/core/attributes/star'\nimport { Engine } from './engine'\n\nconst DS = new Engine()\nDS.load(Star, Signals, Computed)\nexport const Datastar = DS\n", "import { Datastar as DS } from '../engine'\n\nDS.apply(document.body)\nexport const Datastar = DS\n"],
- "mappings": "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",
- "names": ["lol", "DSP", "DSS", "DATASTAR", "FragmentMergeModes", "DefaultFragmentMergeMode", "PluginType", "name", "Computed", "key", "signals", "genRX", "rx", "kebabize", "str", "$", "ofs", "camelize", "word", "index", "jsStrToObject", "raw", "Signals", "ctx", "key", "value", "genRX", "signals", "mods", "ifMissing", "v", "obj", "jsStrToObject", "nv", "Star", "Hash", "#value", "#prefix", "prefix", "DATASTAR", "x", "c", "elUniqId", "el", "hash", "currentEl", "i", "e", "url", "dserr", "type", "reason", "metadata", "e", "DATASTAR", "r", "kebabize", "q", "c", "internalErr", "from", "args", "initErr", "ctx", "errCtx", "PluginType", "runtimeErr", "from", "BRAND_SYMBOL", "RUNNING", "NOTIFIED", "OUTDATED", "DISPOSED", "HAS_ERROR", "TRACKING", "startBatch", "batchDepth", "endBatch", "error", "hasError", "batchedEffect", "effect", "batchIteration", "next", "needsToRecompute", "err", "internalErr", "evalContext", "batchedEffect", "batchDepth", "batchIteration", "globalVersion", "addDependency", "signal", "evalContext", "node", "TRACKING", "Signal", "value", "BRAND_SYMBOL", "prev", "next", "fn", "effect", "prevContext", "internalErr", "from", "startBatch", "endBatch", "needsToRecompute", "target", "node", "prepareSources", "rollbackNode", "cleanupSources", "head", "prev", "Computed", "fn", "Signal", "globalVersion", "OUTDATED", "NOTIFIED", "RUNNING", "TRACKING", "prevContext", "evalContext", "value", "HAS_ERROR", "err", "internalErr", "from", "addDependency", "computed", "cleanupEffect", "effect", "cleanup", "startBatch", "error", "DISPOSED", "disposeEffect", "endBatch", "endEffect", "Effect", "finish", "batchedEffect", "from", "nestedValues", "signal", "onlyPublic", "kv", "key", "value", "Signal", "mergeNested", "target", "values", "onlyIfMissing", "internalErr", "t", "walkNestedSignal", "cb", "path", "nestedSubset", "original", "keys", "subset", "parts", "subOriginal", "subSubset", "i", "part", "last", "SignalsRoot", "#signals", "dotDelimitedPath", "parts", "subSignals", "i", "part", "last", "signal", "internalErr", "from", "fn", "computed", "value", "defaultValue", "current", "Signal", "dotDelimitedPaths", "path", "other", "onlyIfMissing", "mergeNested", "keys", "nestedSubset", "cb", "walkNestedSignal", "signalNames", "onlyPublic", "nestedValues", "shouldIndent", "values", "Engine", "#signals", "SignalsRoot", "#plugins", "#actions", "#watchers", "#removals", "pluginsToLoad", "plugin", "that", "ctx", "cb", "effect", "#cleanup", "globalInitializer", "wp", "ap", "initErr", "a", "b", "lenDiff", "rootElement", "#walkDownDOM", "el", "rawKey", "p", "elUniqId", "key", "rawModifiers", "hasKey", "keySlice1", "value", "hasValue", "#genRX", "keyReq", "runtimeErr", "valReq", "rawMod", "label", "mod", "camelize", "t", "removal", "argNames", "userExpression", "statementRe", "statements", "lastIdx", "last", "escaped", "escapeRe", "DSP", "DSS", "match", "k", "v", "Hash", "fnCall", "matches", "methodsCalled", "actionsRe", "signalNames", "signalsRe", "fnContent", "fn", "args", "error", "element", "callback", "dataset", "removalSet", "DS", "Engine", "Star", "Signals", "Computed", "Datastar", "Datastar"]
+ "sources": ["../library/src/engine/consts.ts", "../library/src/engine/types.ts", "../library/src/plugins/official/core/attributes/computed.ts", "../library/src/utils/text.ts", "../library/src/plugins/official/core/attributes/signals.ts", "../library/src/plugins/official/core/attributes/star.ts", "../library/src/utils/dom.ts", "../library/src/utils/timing.ts", "../library/src/engine/errors.ts", "../library/src/vendored/preact-core.ts", "../library/src/engine/signals.ts", "../library/src/engine/engine.ts", "../library/src/engine/index.ts", "../library/src/bundles/datastar-core.ts"],
+ "sourcesContent": ["// This is auto-generated by Datastar. DO NOT EDIT.\nconst lol = /\uD83D\uDD95JS_DS\uD83D\uDE80/.source\nexport const DSP = lol.slice(0, 5)\nexport const DSS = lol.slice(4)\n\nexport const DATASTAR = \"datastar\";\nexport const DATASTAR_EVENT = \"datastar-event\";\nexport const DATASTAR_REQUEST = \"Datastar-Request\";\n\n// #region Defaults\n\n// #region Default durations\n\n// The default duration for settling during fragment merges. Allows for CSS transitions to complete.\nexport const DefaultFragmentsSettleDurationMs = 300;\n// The default duration for retrying SSE on connection reset. This is part of the underlying retry mechanism of SSE.\nexport const DefaultSseRetryDurationMs = 1000;\n\n// #endregion\n\n\n// #region Default strings\n\n// The default attributes for element use when executing scripts. It is a set of key-value pairs delimited by a newline \\\\n character.\nexport const DefaultExecuteScriptAttributes = \"type module\";\n\n// #endregion\n\n\n// #region Default booleans\n\n// Should fragments be merged using the ViewTransition API?\nexport const DefaultFragmentsUseViewTransitions = false;\n\n// Should a given set of signals merge if they are missing?\nexport const DefaultMergeSignalsOnlyIfMissing = false;\n\n// Should script element remove itself after execution?\nexport const DefaultExecuteScriptAutoRemove = true;\n\n// #endregion\n\n\n// #region Enums\n\n// The mode in which a fragment is merged into the DOM.\nexport const FragmentMergeModes = {\n // Morphs the fragment into the existing element using idiomorph.\n Morph: \"morph\",\n // Replaces the inner HTML of the existing element.\n Inner: \"inner\",\n // Replaces the outer HTML of the existing element.\n Outer: \"outer\",\n // Prepends the fragment to the existing element.\n Prepend: \"prepend\",\n // Appends the fragment to the existing element.\n Append: \"append\",\n // Inserts the fragment before the existing element.\n Before: \"before\",\n // Inserts the fragment after the existing element.\n After: \"after\",\n // Upserts the attributes of the existing element.\n UpsertAttributes: \"upsertAttributes\",\n} as const;\n\n// Default value for FragmentMergeMode\nexport const DefaultFragmentMergeMode = FragmentMergeModes.Morph;\n\n// The type protocol on top of SSE which allows for core pushed based communication between the server and the client.\nexport const EventTypes = {\n // An event for merging HTML fragments into the DOM.\n MergeFragments: \"datastar-merge-fragments\",\n // An event for merging signals.\n MergeSignals: \"datastar-merge-signals\",\n // An event for removing HTML fragments from the DOM.\n RemoveFragments: \"datastar-remove-fragments\",\n // An event for removing signals.\n RemoveSignals: \"datastar-remove-signals\",\n // An event for executing elements in the browser.\n ExecuteScript: \"datastar-execute-script\",\n} as const;\n// #endregion\n\n// #endregion", "import type { EffectFn, Signal } from '../vendored/preact-core'\nimport { DATASTAR } from './consts'\nimport type { SignalsRoot } from './signals'\n\nexport type OnRemovalFn = () => void\n\nexport enum PluginType {\n Attribute = 1,\n Watcher = 2,\n Action = 3,\n}\n\nexport interface DatastarPlugin {\n type: PluginType // The type of plugin\n name: string // The name of the plugin\n}\n\nexport enum Requirement {\n Allowed = 0,\n Must = 1,\n Denied = 2,\n Exclusive = 3,\n}\n\nexport interface DatastarSignalEvent {\n added: Array\n removed: Array\n updated: Array\n}\nexport const DATASTAR_SIGNAL_EVENT = `${DATASTAR}-signals`\nexport interface CustomEventMap {\n [DATASTAR_SIGNAL_EVENT]: CustomEvent\n}\nexport type WatcherFn = (\n this: Document,\n ev: CustomEventMap[K],\n) => void\ndeclare global {\n interface Document {\n dispatchEvent(ev: CustomEventMap[K]): void\n addEventListener(\n type: K,\n listener: WatcherFn,\n ): void\n removeEventListener(\n type: K,\n listener: WatcherFn,\n ): void\n }\n}\n\n// A plugin accesible via a `data-${name}` attribute on an element\nexport interface AttributePlugin extends DatastarPlugin {\n type: PluginType.Attribute\n onGlobalInit?: (ctx: InitContext) => void // Called once on registration of the plugin\n onLoad: (ctx: RuntimeContext) => OnRemovalFn | void // Return a function to be called on removal\n mods?: Set // If not provided, all modifiers are allowed\n keyReq?: Requirement // The rules for the key requirements\n valReq?: Requirement // The rules for the value requirements\n removeOnLoad?: boolean // If true, the attribute is removed after onLoad (useful for plugins you don\u2019t want reapplied)\n argNames?: string[] // argument names for the reactive expression\n}\n\n// A plugin that runs on the global scope of the DastaStar instance\nexport interface WatcherPlugin extends DatastarPlugin {\n type: PluginType.Watcher\n onGlobalInit?: (ctx: InitContext) => void\n}\n\nexport type ActionPlugins = Record\nexport type ActionMethod = (ctx: RuntimeContext, ...args: any[]) => any\n\nexport interface ActionPlugin extends DatastarPlugin {\n type: PluginType.Action\n fn: ActionMethod\n}\n\nexport type GlobalInitializer = (ctx: InitContext) => void\n// export type RemovalEntry = { id: string; fns: Array }\n\nexport type InitContext = {\n plugin: DatastarPlugin\n signals: SignalsRoot\n effect: (fn: EffectFn) => OnRemovalFn\n actions: Readonly\n}\n\nexport type HTMLorSVGElement = Element & (HTMLElement | SVGElement)\nexport type Modifiers = Map> // mod name -> tags\n\nexport type RuntimeContext = InitContext & {\n plugin: DatastarPlugin // The name of the plugin\n el: HTMLorSVGElement // The element the attribute is on\n rawKey: Readonly // no parsing data-* key\n key: Readonly // data-* key without the prefix or tags\n value: Readonly // value of data-* attribute\n mods: Modifiers // the tags and their arguments\n genRX: () => (...args: any[]) => T // a reactive expression\n fnContent?: string // the content of the function\n}\n\nexport type NestedValues = { [key: string]: NestedValues | any }\nexport type NestedSignal = {\n [key: string]: NestedSignal | Signal\n}\n\nexport type RuntimeExpressionFunction = (\n ctx: RuntimeContext,\n ...args: any[]\n) => any\n", "import {\n type AttributePlugin,\n PluginType,\n Requirement,\n} from '../../../../engine/types'\n\nconst name = 'computed'\nexport const Computed: AttributePlugin = {\n type: PluginType.Attribute,\n name,\n keyReq: Requirement.Must,\n valReq: Requirement.Must,\n onLoad: ({ key, signals, genRX }) => {\n const rx = genRX()\n signals.setComputed(key, rx)\n },\n}\n", "export const isBoolString = (str: string) => str.trim() === 'true'\n\nexport const kebabize = (str: string) =>\n str.replace(\n /[A-Z]+(?![a-z])|[A-Z]/g,\n ($, ofs) => (ofs ? '-' : '') + $.toLowerCase(),\n )\n\nexport const camelize = (str: string) =>\n kebabize(str).replace(/-./g, (x) => x[1].toUpperCase())\n\nexport const jsStrToObject = (raw: string) =>\n new Function(`return Object.assign({}, ${raw})`)()\n\nexport const trimDollarSignPrefix = (str: string) =>\n str.startsWith('$') ? str.slice(1) : str\n", "import {\n type AttributePlugin,\n type NestedValues,\n PluginType,\n} from '../../../../engine/types'\nimport { jsStrToObject } from '../../../../utils/text'\n\nexport const Signals: AttributePlugin = {\n type: PluginType.Attribute,\n name: 'signals',\n removeOnLoad: true,\n onLoad: (ctx) => {\n const { key, value, genRX, signals, mods } = ctx\n const ifMissing = mods.has('ifmissing')\n if (key !== '' && !ifMissing) {\n const v = value === '' ? value : genRX()()\n signals.setValue(key, v)\n } else {\n const obj = jsStrToObject(ctx.value)\n ctx.value = JSON.stringify(obj)\n const rx = genRX()\n const nv = rx()\n signals.merge(nv, ifMissing)\n }\n },\n}\n", "import {\n type AttributePlugin,\n PluginType,\n Requirement,\n} from '../../../../engine/types'\n\nexport const Star: AttributePlugin = {\n type: PluginType.Attribute,\n name: 'star',\n keyReq: Requirement.Denied,\n valReq: Requirement.Denied,\n onLoad: () => {\n alert('YOU ARE PROBABLY OVERCOMPLICATING IT')\n },\n}\n", "import { DATASTAR } from '../engine/consts'\n\nexport class Hash {\n #value = 0\n #prefix: string\n\n constructor(prefix = DATASTAR) {\n this.#prefix = prefix\n }\n\n with(x: number | string): Hash {\n if (typeof x === 'string') {\n for (const c of x.split('')) {\n this.with(c.charCodeAt(0))\n }\n } else {\n this.#value = (this.#value << 5) - this.#value + x\n }\n return this\n }\n\n reset(): Hash {\n this.#value = 0\n return this\n }\n\n get value() {\n return this.#prefix + Math.abs(this.#value).toString(36)\n }\n}\n\nexport function elUniqId(el: Element) {\n if (el.id) return el.id\n const hash = new Hash()\n\n let currentEl = el\n while (currentEl.parentNode) {\n if (currentEl.id) {\n hash.with(currentEl.id)\n break\n }\n if (currentEl === currentEl.ownerDocument.documentElement) {\n hash.with(currentEl.tagName)\n } else {\n for (\n let i = 1, e = el;\n e.previousElementSibling;\n e = e.previousElementSibling, i++\n ) {\n hash.with(i)\n }\n }\n\n currentEl = currentEl.parentNode as Element\n }\n return hash.value\n}\n\nexport function onElementRemoved(element: Element, callback: () => void) {\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n for (const removedNode of mutation.removedNodes) {\n if (removedNode === element) {\n observer.disconnect()\n callback()\n return\n }\n }\n }\n })\n observer.observe(element.parentNode as Node, { childList: true })\n}\n", "export type TimerHandler = (...args: any[]) => void\n\nexport function delay(\n callback: TimerHandler,\n wait: number,\n): TimerHandler {\n return (...args: any[]) => {\n setTimeout(() => {\n callback(...args)\n }, wait)\n }\n}\n\nexport function debounce(\n callback: TimerHandler,\n wait: number,\n leading = false,\n trailing = true,\n): TimerHandler {\n let timer = -1\n\n const resetTimer = () => timer && clearTimeout(timer)\n\n return (...args: any[]) => {\n resetTimer()\n\n if (leading && !timer) {\n callback(...args)\n }\n\n timer = setTimeout(() => {\n if (trailing) {\n callback(...args)\n }\n resetTimer()\n }, wait)\n }\n}\n\nexport function throttle(\n callback: TimerHandler,\n wait: number,\n leading = true,\n trailing = false,\n): TimerHandler {\n let waiting = false\n\n return (...args: any[]) => {\n if (waiting) return\n\n if (leading) {\n callback(...args)\n }\n\n waiting = true\n setTimeout(() => {\n waiting = false\n if (trailing) {\n callback(...args)\n }\n }, wait)\n }\n}\n", "import { kebabize } from '../utils/text'\nimport { DATASTAR } from './consts'\nimport { type InitContext, PluginType, type RuntimeContext } from './types'\n\nconst url = `${window.location.origin}/errors`\n\ninterface Metadata {\n error?: string\n [key: string]: any\n}\n\nfunction dserr(type: string, reason: string, metadata: Metadata = {}) {\n const e = new Error()\n reason = reason[0].toUpperCase() + reason.slice(1)\n e.name = `${DATASTAR} ${type} error`\n const r = kebabize(reason).replaceAll('-', '_')\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}/${type}/${r}?${q}\\nContext: ${c}`\n return e\n}\n\nexport function internalErr(from: string, reason: string, args = {}) {\n return dserr('internal', reason, Object.assign({ from }, args))\n}\n\nexport function initErr(reason: string, ctx: InitContext, metadata = {}) {\n const errCtx = {\n plugin: {\n name: ctx.plugin.name,\n type: PluginType[ctx.plugin.type],\n },\n }\n return dserr('init', reason, Object.assign(errCtx, metadata))\n}\n\nexport function runtimeErr(reason: string, ctx: RuntimeContext, metadata = {}) {\n const errCtx = {\n plugin: {\n name: ctx.plugin.name,\n type: PluginType[ctx.plugin.type],\n },\n element: {\n id: ctx.el.id,\n tag: ctx.el.tagName,\n },\n expression: {\n rawKey: ctx.rawKey,\n key: ctx.key,\n value: ctx.value,\n validSignals: ctx.signals.paths(),\n fnContent: ctx.fnContent,\n },\n }\n return dserr('runtime', reason, Object.assign(errCtx, metadata))\n}\n", "import { internalErr } from '../engine/errors'\nimport type { OnRemovalFn } from '../engine/types'\n\nconst from = 'preact-signals'\n\n// An named symbol/brand for detecting Signal instances even when they weren't\n// created using the same signals library version.\nconst BRAND_SYMBOL = Symbol.for('preact-signals')\n\n// Flags for Computed and Effect.\nconst RUNNING = 1 << 0\nconst NOTIFIED = 1 << 1\nconst OUTDATED = 1 << 2\nconst DISPOSED = 1 << 3\nconst HAS_ERROR = 1 << 4\nconst TRACKING = 1 << 5\n\n// A linked list node used to track dependencies (sources) and dependents (targets).\n// Also used to remember the source's last version number that the target saw.\ntype Node = {\n // A source whose value the target depends on.\n _source: Signal\n _prevSource?: Node\n _nextSource?: Node\n\n // A target that depends on the source and should be notified when the source changes.\n _target: Computed | Effect\n _prevTarget?: Node\n _nextTarget?: Node\n\n // The version number of the source that target has last seen. We use version numbers\n // instead of storing the source value, because source values can take arbitrary amount\n // of memory, and computeds could hang on to them forever because they're lazily evaluated.\n // Use the special value -1 to mark potentially unused but recyclable nodes.\n _version: number\n\n // Used to remember & roll back the source's previous `._node` value when entering &\n // exiting a new evaluation context.\n _rollbackNode?: Node\n}\n\nfunction startBatch() {\n batchDepth++\n}\n\nfunction endBatch() {\n if (batchDepth > 1) {\n batchDepth--\n return\n }\n\n let error: unknown\n let hasError = false\n\n while (batchedEffect !== undefined) {\n let effect: Effect | undefined = batchedEffect\n batchedEffect = undefined\n\n batchIteration++\n\n while (effect !== undefined) {\n const next: Effect | undefined = effect._nextBatchedEffect\n effect._nextBatchedEffect = undefined\n effect._flags &= ~NOTIFIED\n\n if (!(effect._flags & DISPOSED) && needsToRecompute(effect)) {\n try {\n effect._callback()\n } catch (err) {\n if (!hasError) {\n error = err\n hasError = true\n }\n }\n }\n effect = next\n }\n }\n batchIteration = 0\n batchDepth--\n\n if (hasError) {\n throw internalErr(from, 'BatchError, error', { error })\n }\n}\n\n/**\n * Combine multiple value updates into one \"commit\" at the end of the provided callback.\n *\n * Batches can be nested and changes are only flushed once the outermost batch callback\n * completes.\n *\n * Accessing a signal that has been modified within a batch will reflect its updated\n * value.\n *\n * @param fn The callback function.\n * @returns The value returned by the callback.\n */\nfunction batch(fn: () => T): T {\n if (batchDepth > 0) {\n return fn()\n }\n /*@__INLINE__**/ startBatch()\n try {\n return fn()\n } finally {\n endBatch()\n }\n}\n\n// Currently evaluated computed or effect.\nlet evalContext: Computed | Effect | undefined = undefined\n\n/**\n * Run a callback function that can access signal values without\n * subscribing to the signal updates.\n *\n * @param fn The callback function.\n * @returns The value returned by the callback.\n */\nfunction untracked(fn: () => T): T {\n const prevContext = evalContext\n evalContext = undefined\n try {\n return fn()\n } finally {\n evalContext = prevContext\n }\n}\n\n// Effects collected into a batch.\nlet batchedEffect: Effect | undefined = undefined\nlet batchDepth = 0\nlet batchIteration = 0\n\n// A global version number for signals, used for fast-pathing repeated\n// computed.peek()/computed.value calls when nothing has changed globally.\nlet globalVersion = 0\n\nfunction addDependency(signal: Signal): Node | undefined {\n if (evalContext === undefined) {\n return undefined\n }\n\n let node = signal._node\n if (node === undefined || node._target !== evalContext) {\n /**\n * `signal` is a new dependency. Create a new dependency node, and set it\n * as the tail of the current context's dependency list. e.g:\n *\n * { A <-> B }\n * \u2191 \u2191\n * tail node (new)\n * \u2193\n * { A <-> B <-> C }\n * \u2191\n * tail (evalContext._sources)\n */\n node = {\n _version: 0,\n _source: signal,\n _prevSource: evalContext._sources,\n _nextSource: undefined,\n _target: evalContext,\n _prevTarget: undefined,\n _nextTarget: undefined,\n _rollbackNode: node,\n }\n\n if (evalContext._sources !== undefined) {\n evalContext._sources._nextSource = node\n }\n evalContext._sources = node\n signal._node = node\n\n // Subscribe to change notifications from this dependency if we're in an effect\n // OR evaluating a computed signal that in turn has subscribers.\n if (evalContext._flags & TRACKING) {\n signal._subscribe(node)\n }\n return node\n }\n if (node._version === -1) {\n // `signal` is an existing dependency from a previous evaluation. Reuse it.\n node._version = 0\n\n /**\n * If `node` is not already the current tail of the dependency list (i.e.\n * there is a next node in the list), then make the `node` the new tail. e.g:\n *\n * { A <-> B <-> C <-> D }\n * \u2191 \u2191\n * node \u250C\u2500\u2500\u2500 tail (evalContext._sources)\n * \u2514\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2500\u2500\u2510\n * \u2193 \u2193\n * { A <-> C <-> D <-> B }\n * \u2191\n * tail (evalContext._sources)\n */\n if (node._nextSource !== undefined) {\n node._nextSource._prevSource = node._prevSource\n\n if (node._prevSource !== undefined) {\n node._prevSource._nextSource = node._nextSource\n }\n\n node._prevSource = evalContext._sources\n node._nextSource = undefined\n\n evalContext._sources!._nextSource = node\n evalContext._sources = node\n }\n\n // We can assume that the currently evaluated effect / computed signal is already\n // subscribed to change notifications from `signal` if needed.\n return node\n }\n return undefined\n}\n\n/**\n * The base class for plain and computed signals.\n */\n// @ts-ignore: \"Cannot redeclare exported variable 'Signal'.\"\n//\n// A function with the same name is defined later, so we need to ignore TypeScript's\n// warning about a redeclared variable.\n//\n// The class is declared here, but later implemented with ES5-style protoTYPEOF_\n// This enables better control of the transpiled output size.\ndeclare class Signal {\n /** @internal */\n _value: unknown\n\n /**\n * @internal\n * Version numbers should always be >= 0, because the special value -1 is used\n * by Nodes to signify potentially unused but recyclable nodes.\n */\n _version: number\n\n /** @internal */\n _node?: Node\n\n /** @internal */\n _targets?: Node\n\n constructor(value?: T)\n\n /** @internal */\n _refresh(): boolean\n\n /** @internal */\n _subscribe(node: Node): void\n\n /** @internal */\n _unsubscribe(node: Node): void\n\n subscribe(fn: (value: T) => void): () => void\n\n valueOf(): T\n\n toString(): string\n\n toJSON(): T\n\n peek(): T\n\n brand: typeof BRAND_SYMBOL\n\n get value(): T\n set value(value: T)\n}\n\n/** @internal */\n// @ts-ignore: \"Cannot redeclare exported variable 'Signal'.\"\n//\n// A class with the same name has already been declared, so we need to ignore\n// TypeScript's warning about a redeclared variable.\n//\n// The previously declared class is implemented here with ES5-style protoTYPEOF_\n// This enables better control of the transpiled output size.\n// biome-ignore lint/suspicious/noRedeclare: \nfunction Signal(this: Signal, value?: unknown) {\n this._value = value\n this._version = 0\n this._node = undefined\n this._targets = undefined\n}\n\nSignal.prototype.brand = BRAND_SYMBOL\n\nSignal.prototype._refresh = () => true\n\nSignal.prototype._subscribe = function (node) {\n if (this._targets !== node && node._prevTarget === undefined) {\n node._nextTarget = this._targets\n if (this._targets !== undefined) {\n this._targets._prevTarget = node\n }\n this._targets = node\n }\n}\n\nSignal.prototype._unsubscribe = function (node) {\n // Only run the unsubscribe step if the signal has any subscribers to begin with.\n if (this._targets !== undefined) {\n const prev = node._prevTarget\n const next = node._nextTarget\n if (prev !== undefined) {\n prev._nextTarget = next\n node._prevTarget = undefined\n }\n if (next !== undefined) {\n next._prevTarget = prev\n node._nextTarget = undefined\n }\n if (node === this._targets) {\n this._targets = next\n }\n }\n}\n\nSignal.prototype.subscribe = function (fn) {\n return effect(() => {\n const value = this.value\n\n const prevContext = evalContext\n evalContext = undefined\n try {\n fn(value)\n } finally {\n evalContext = prevContext\n }\n })\n}\n\nSignal.prototype.valueOf = function () {\n return this.value\n}\n\nSignal.prototype.toString = function () {\n return `${this.value}`\n}\n\nSignal.prototype.toJSON = function () {\n return this.value\n}\n\nSignal.prototype.peek = function () {\n const prevContext = evalContext\n evalContext = undefined\n try {\n return this.value\n } finally {\n evalContext = prevContext\n }\n}\n\nObject.defineProperty(Signal.prototype, 'value', {\n get(this: Signal) {\n const node = addDependency(this)\n if (node !== undefined) {\n node._version = this._version\n }\n return this._value\n },\n set(this: Signal, value) {\n if (value !== this._value) {\n if (batchIteration > 100) {\n throw internalErr(from, 'SignalCycleDetected')\n }\n\n this._value = value\n this._version++\n globalVersion++\n\n /**@__INLINE__*/ startBatch()\n try {\n for (\n let node = this._targets;\n node !== undefined;\n node = node._nextTarget\n ) {\n node._target._notify()\n }\n } finally {\n endBatch()\n }\n }\n },\n})\n\n/**\n * Create a new plain signal.\n *\n * @param value The initial value for the signal.\n * @returns A new signal.\n */\nexport function signal(value: T): Signal\nexport function signal(): Signal\nexport function signal(value?: T): Signal {\n return new Signal(value)\n}\n\nfunction needsToRecompute(target: Computed | Effect): boolean {\n // Check the dependencies for changed values. The dependency list is already\n // in order of use. Therefore if multiple dependencies have changed values, only\n // the first used dependency is re-evaluated at this point.\n for (\n let node = target._sources;\n node !== undefined;\n node = node._nextSource\n ) {\n // If there's a new version of the dependency before or after refreshing,\n // or the dependency has something blocking it from refreshing at all (e.g. a\n // dependency cycle), then we need to recompute.\n if (\n node._source._version !== node._version ||\n !node._source._refresh() ||\n node._source._version !== node._version\n ) {\n return true\n }\n }\n // If none of the dependencies have changed values since last recompute then\n // there's no need to recompute.\n return false\n}\n\nfunction prepareSources(target: Computed | Effect) {\n /**\n * 1. Mark all current sources as re-usable nodes (version: -1)\n * 2. Set a rollback node if the current node is being used in a different context\n * 3. Point 'target._sources' to the tail of the doubly-linked list, e.g:\n *\n * { undefined <- A <-> B <-> C -> undefined }\n * \u2191 \u2191\n * \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n * target._sources = A; (node is head) \u2502\n * \u2193 \u2502\n * target._sources = C; (node is tail) \u2500\u2518\n */\n for (\n let node = target._sources;\n node !== undefined;\n node = node._nextSource\n ) {\n const rollbackNode = node._source._node\n if (rollbackNode !== undefined) {\n node._rollbackNode = rollbackNode\n }\n node._source._node = node\n node._version = -1\n\n if (node._nextSource === undefined) {\n target._sources = node\n break\n }\n }\n}\n\nfunction cleanupSources(target: Computed | Effect) {\n let node = target._sources\n let head: Node | undefined = undefined\n\n /**\n * At this point 'target._sources' points to the tail of the doubly-linked list.\n * It contains all existing sources + new sources in order of use.\n * Iterate backwards until we find the head node while dropping old dependencies.\n */\n while (node !== undefined) {\n const prev = node._prevSource\n\n /**\n * The node was not re-used, unsubscribe from its change notifications and remove itself\n * from the doubly-linked list. e.g:\n *\n * { A <-> B <-> C }\n * \u2193\n * { A <-> C }\n */\n if (node._version === -1) {\n node._source._unsubscribe(node)\n\n if (prev !== undefined) {\n prev._nextSource = node._nextSource\n }\n if (node._nextSource !== undefined) {\n node._nextSource._prevSource = prev\n }\n } else {\n /**\n * The new head is the last node seen which wasn't removed/unsubscribed\n * from the doubly-linked list. e.g:\n *\n * { A <-> B <-> C }\n * \u2191 \u2191 \u2191\n * \u2502 \u2502 \u2514 head = node\n * \u2502 \u2514 head = node\n * \u2514 head = node\n */\n head = node\n }\n\n node._source._node = node._rollbackNode\n if (node._rollbackNode !== undefined) {\n node._rollbackNode = undefined\n }\n\n node = prev\n }\n\n target._sources = head\n}\n\nexport declare class Computed extends Signal {\n _fn: () => T\n _sources?: Node\n _globalVersion: number\n _flags: number\n\n constructor(fn: () => T)\n\n _notify(): void\n get value(): T\n}\n\n// biome-ignore lint/suspicious/noRedeclare: \nexport function Computed(this: Computed, fn: () => unknown) {\n Signal.call(this, undefined)\n\n this._fn = fn\n this._sources = undefined\n this._globalVersion = globalVersion - 1\n this._flags = OUTDATED\n}\n\nComputed.prototype = new Signal() as Computed\n\nComputed.prototype._refresh = function () {\n this._flags &= ~NOTIFIED\n\n if (this._flags & RUNNING) {\n return false\n }\n\n // If this computed signal has subscribed to updates from its dependencies\n // (TRACKING flag set) and none of them have notified about changes (OUTDATED\n // flag not set), then the computed value can't have changed.\n if ((this._flags & (OUTDATED | TRACKING)) === TRACKING) {\n return true\n }\n this._flags &= ~OUTDATED\n\n if (this._globalVersion === globalVersion) {\n return true\n }\n this._globalVersion = globalVersion\n\n // Mark this computed signal running before checking the dependencies for value\n // changes, so that the RUNNING flag can be used to notice cyclical dependencies.\n this._flags |= RUNNING\n if (this._version > 0 && !needsToRecompute(this)) {\n this._flags &= ~RUNNING\n return true\n }\n\n const prevContext = evalContext\n try {\n prepareSources(this)\n evalContext = this\n const value = this._fn()\n if (\n this._flags & HAS_ERROR ||\n this._value !== value ||\n this._version === 0\n ) {\n this._value = value\n this._flags &= ~HAS_ERROR\n this._version++\n }\n } catch (err) {\n this._value = err\n this._flags |= HAS_ERROR\n this._version++\n }\n evalContext = prevContext\n cleanupSources(this)\n this._flags &= ~RUNNING\n return true\n}\n\nComputed.prototype._subscribe = function (node) {\n if (this._targets === undefined) {\n this._flags |= OUTDATED | TRACKING\n\n // A computed signal subscribes lazily to its dependencies when it\n // gets its first subscriber.\n for (\n let node = this._sources;\n node !== undefined;\n node = node._nextSource\n ) {\n node._source._subscribe(node)\n }\n }\n Signal.prototype._subscribe.call(this, node)\n}\n\nComputed.prototype._unsubscribe = function (node) {\n // Only run the unsubscribe step if the computed signal has any subscribers.\n if (this._targets !== undefined) {\n Signal.prototype._unsubscribe.call(this, node)\n\n // Computed signal unsubscribes from its dependencies when it loses its last subscriber.\n // This makes it possible for unreferences subgraphs of computed signals to get garbage collected.\n if (this._targets === undefined) {\n this._flags &= ~TRACKING\n\n for (\n let node = this._sources;\n node !== undefined;\n node = node._nextSource\n ) {\n node._source._unsubscribe(node)\n }\n }\n }\n}\n\nComputed.prototype._notify = function () {\n if (!(this._flags & NOTIFIED)) {\n this._flags |= OUTDATED | NOTIFIED\n\n for (\n let node = this._targets;\n node !== undefined;\n node = node._nextTarget\n ) {\n node._target._notify()\n }\n }\n}\n\nObject.defineProperty(Computed.prototype, 'value', {\n get(this: Computed) {\n if (this._flags & RUNNING) {\n // Cycle detected\n throw internalErr(from, 'SignalCycleDetected')\n }\n const node = addDependency(this)\n this._refresh()\n if (node !== undefined) {\n node._version = this._version\n }\n if (this._flags & HAS_ERROR) {\n throw internalErr(from, 'GetComputedError', { value: this._value })\n }\n return this._value\n },\n})\n\n/**\n * An interface for read-only signals.\n */\ninterface ReadonlySignal {\n readonly value: T\n peek(): T\n\n subscribe(fn: (value: T) => void): () => void\n valueOf(): T\n toString(): string\n toJSON(): T\n brand: typeof BRAND_SYMBOL\n}\n\n/**\n * Create a new signal that is computed based on the values of other signals.\n *\n * The returned computed signal is read-only, and its value is automatically\n * updated when any signals accessed from within the callback function change.\n *\n * @param fn The effect callback.\n * @returns A new read-only signal.\n */\nfunction computed(fn: () => T): ReadonlySignal {\n return new Computed(fn)\n}\n\nfunction cleanupEffect(effect: Effect) {\n const cleanup = effect._cleanup\n effect._cleanup = undefined\n\n if (typeof cleanup === 'function') {\n /*@__INLINE__**/ startBatch()\n\n // Run cleanup functions always outside of any context.\n const prevContext = evalContext\n evalContext = undefined\n try {\n cleanup!()\n } catch (error) {\n effect._flags &= ~RUNNING\n effect._flags |= DISPOSED\n disposeEffect(effect)\n throw internalErr(from, 'CleanupEffectError', { error })\n } finally {\n evalContext = prevContext\n endBatch()\n }\n }\n}\n\nfunction disposeEffect(effect: Effect) {\n for (\n let node = effect._sources;\n node !== undefined;\n node = node._nextSource\n ) {\n node._source._unsubscribe(node)\n }\n effect._fn = undefined\n effect._sources = undefined\n\n cleanupEffect(effect)\n}\n\nfunction endEffect(this: Effect, prevContext?: Computed | Effect) {\n if (evalContext !== this) {\n throw internalErr(from, 'EndEffectError')\n }\n cleanupSources(this)\n evalContext = prevContext\n\n this._flags &= ~RUNNING\n if (this._flags & DISPOSED) {\n disposeEffect(this)\n }\n endBatch()\n}\n\nexport type EffectFn = () => OnRemovalFn | void | Promise\n\ndeclare class Effect {\n _fn?: EffectFn\n _cleanup?: () => void\n _sources?: Node\n _nextBatchedEffect?: Effect\n _flags: number\n\n constructor(fn: EffectFn)\n\n _callback(): void\n _start(): () => void\n _notify(): void\n _dispose(): void\n}\n\n// biome-ignore lint/suspicious/noRedeclare: \nfunction Effect(this: Effect, fn: EffectFn) {\n this._fn = fn\n this._cleanup = undefined\n this._sources = undefined\n this._nextBatchedEffect = undefined\n this._flags = TRACKING\n}\n\nEffect.prototype._callback = function () {\n const finish = this._start()\n try {\n if (this._flags & DISPOSED) return\n if (this._fn === undefined) return\n\n const cleanup = this._fn()\n if (typeof cleanup === 'function') {\n this._cleanup = cleanup!\n }\n } finally {\n finish()\n }\n}\n\nEffect.prototype._start = function () {\n if (this._flags & RUNNING) {\n throw internalErr(from, 'SignalCycleDetected')\n }\n this._flags |= RUNNING\n this._flags &= ~DISPOSED\n cleanupEffect(this)\n prepareSources(this)\n\n /*@__INLINE__**/ startBatch()\n const prevContext = evalContext\n evalContext = this\n return endEffect.bind(this, prevContext)\n}\n\nEffect.prototype._notify = function () {\n if (!(this._flags & NOTIFIED)) {\n this._flags |= NOTIFIED\n this._nextBatchedEffect = batchedEffect\n batchedEffect = this\n }\n}\n\nEffect.prototype._dispose = function () {\n this._flags |= DISPOSED\n\n if (!(this._flags & RUNNING)) {\n disposeEffect(this)\n }\n}\n\n/**\n * Create an effect to run arbitrary code in response to signal changes.\n *\n * An effect tracks which signals are accessed within the given callback\n * function `fn`, and re-runs the callback when those signals change.\n *\n * The callback may return a cleanup function. The cleanup function gets\n * run once, either when the callback is next called or when the effect\n * gets disposed, whichever happens first.\n *\n * @param fn The effect callback.\n * @returns A function for disposing the effect.\n */\nfunction effect(fn: EffectFn): () => void {\n const effect = new Effect(fn)\n try {\n effect._callback()\n } catch (error) {\n effect._dispose()\n // Throw the error, since it is already a Datastar error.\n throw error\n }\n // Return a bound function instead of a wrapper like `() => effect._dispose()`,\n // because bound functions seem to be just as fast and take up a lot less memory.\n return effect._dispose.bind(effect)\n}\n\nexport { batch, computed, effect, Signal, untracked }\nexport type { ReadonlySignal }\n", "import { type Computed, Signal, computed } from '../vendored/preact-core'\nimport { internalErr } from './errors'\nimport {\n DATASTAR_SIGNAL_EVENT,\n type DatastarSignalEvent,\n type NestedSignal,\n type NestedValues,\n} from './types'\n\nconst from = 'namespacedSignals'\n\nconst dispatchSignalEvent = (evt: Partial) => {\n document.dispatchEvent(\n new CustomEvent(DATASTAR_SIGNAL_EVENT, {\n detail: Object.assign({ added: [], removed: [], updated: [] }, evt),\n }),\n )\n}\n// If onlyPublic is true, only signals not starting with an underscore are included\nfunction nestedValues(\n signal: NestedSignal,\n onlyPublic = false,\n): Record {\n const kv: Record = {}\n for (const key in signal) {\n if (Object.hasOwn(signal, key)) {\n if (onlyPublic && key.startsWith('_')) {\n continue\n }\n const value = signal[key]\n if (value instanceof Signal) {\n kv[key] = value.value\n } else {\n kv[key] = nestedValues(value)\n }\n }\n }\n return kv\n}\n\nfunction mergeNested(\n target: NestedValues,\n values: NestedValues,\n onlyIfMissing = false,\n) {\n const evt: DatastarSignalEvent = {\n added: [],\n removed: [],\n updated: [],\n }\n for (const key in values) {\n if (Object.hasOwn(values, key)) {\n if (key.match(/\\_\\_+/)) {\n throw internalErr(from, 'InvalidSignalKey', { key })\n }\n\n const value = values[key]\n if (value instanceof Object && !Array.isArray(value)) {\n if (!target[key]) {\n target[key] = {}\n }\n const subEvt = mergeNested(\n target[key] as NestedValues,\n value as NestedValues,\n onlyIfMissing,\n )\n evt.added.push(...subEvt.added.map((k) => `${key}.${k}`))\n evt.removed.push(...subEvt.removed.map((k) => `${key}.${k}`))\n evt.updated.push(...subEvt.updated.map((k) => `${key}.${k}`))\n } else {\n const hasKey = Object.hasOwn(target, key)\n if (hasKey) {\n if (onlyIfMissing) continue\n const t = target[key]\n if (t instanceof Signal) {\n const oldValue = t.value\n t.value = value\n if (oldValue !== value) {\n evt.updated.push(key)\n }\n continue\n }\n }\n\n target[key] = new Signal(value)\n evt.added.push(key)\n }\n }\n }\n return evt\n}\n\nfunction walkNestedSignal(\n signal: NestedSignal,\n cb: (dotDeliminatedPath: string, signal: Signal) => void,\n): void {\n for (const key in signal) {\n if (Object.hasOwn(signal, key)) {\n const value = signal[key]\n if (value instanceof Signal) {\n cb(key, value)\n } else {\n walkNestedSignal(value, (path, value) => {\n cb(`${key}.${path}`, value)\n })\n }\n }\n }\n}\n\n// Recursive function to subset a nested object, each key is a dot-delimited path\nfunction nestedSubset(original: NestedValues, ...keys: string[]): NestedValues {\n const subset: NestedValues = {}\n for (const key of keys) {\n const parts = key.split('.')\n let subOriginal = original\n let subSubset = subset\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]\n if (!subOriginal[part]) {\n return {}\n }\n if (!subSubset[part]) {\n subSubset[part] = {}\n }\n subOriginal = subOriginal[part] as NestedValues\n subSubset = subSubset[part] as NestedValues\n }\n const last = parts[parts.length - 1]\n subSubset[last] = subOriginal[last]\n }\n return subset\n}\n\n// Recursively walk a NestedValue with a callback and dot-delimited path\nexport function walkNestedValues(\n nv: NestedValues,\n cb: (path: string, value: any) => void,\n) {\n for (const key in nv) {\n if (Object.hasOwn(nv, key)) {\n const value = nv[key]\n if (value instanceof Object && !Array.isArray(value)) {\n walkNestedValues(value, (path, value) => {\n cb(`${key}.${path}`, value)\n })\n } else {\n cb(key, value)\n }\n }\n }\n}\n\nexport class SignalsRoot {\n #signals: NestedSignal = {}\n\n exists(dotDelimitedPath: string): boolean {\n return !!this.signal(dotDelimitedPath)\n }\n\n signal(dotDelimitedPath: string): Signal | null {\n const parts = dotDelimitedPath.split('.')\n let subSignals = this.#signals\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]\n if (!subSignals[part]) {\n return null\n }\n subSignals = subSignals[part] as NestedSignal\n }\n const last = parts[parts.length - 1]\n const signal = subSignals[last]\n if (!signal)\n throw internalErr(from, 'SignalNotFound', { path: dotDelimitedPath })\n return signal as Signal\n }\n\n setSignal>(dotDelimitedPath: string, signal: T) {\n const parts = dotDelimitedPath.split('.')\n let subSignals = this.#signals\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]\n if (!subSignals[part]) {\n subSignals[part] = {}\n }\n subSignals = subSignals[part] as NestedSignal\n }\n const last = parts[parts.length - 1]\n subSignals[last] = signal\n }\n\n setComputed(dotDelimitedPath: string, fn: () => T) {\n const signal = computed(() => fn()) as Computed\n this.setSignal(dotDelimitedPath, signal)\n }\n\n value(dotDelimitedPath: string): T {\n const signal = this.signal(dotDelimitedPath) as Signal\n return signal?.value\n }\n\n setValue(dotDelimitedPath: string, value: T) {\n const s = this.upsertIfMissing(dotDelimitedPath, value)\n const oldValue = s.value\n s.value = value\n if (oldValue !== value) {\n dispatchSignalEvent({ updated: [dotDelimitedPath] })\n }\n }\n\n upsertIfMissing(dotDelimitedPath: string, defaultValue: T) {\n const parts = dotDelimitedPath.split('.')\n let subSignals = this.#signals\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]\n if (!subSignals[part]) {\n subSignals[part] = {}\n }\n subSignals = subSignals[part] as NestedSignal\n }\n const last = parts[parts.length - 1]\n\n const current = subSignals[last]\n if (current instanceof Signal) {\n return current as Signal\n }\n\n const signal = new Signal(defaultValue)\n subSignals[last] = signal\n\n dispatchSignalEvent({ added: [dotDelimitedPath] })\n\n return signal\n }\n\n remove(...dotDelimitedPaths: string[]) {\n if (!dotDelimitedPaths.length) {\n this.#signals = {}\n return\n }\n const removed = Array()\n for (const path of dotDelimitedPaths) {\n const parts = path.split('.')\n let subSignals = this.#signals\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]\n if (!subSignals[part]) {\n return\n }\n subSignals = subSignals[part] as NestedSignal\n }\n const last = parts[parts.length - 1]\n delete subSignals[last]\n removed.push(path)\n }\n dispatchSignalEvent({ removed })\n }\n\n merge(other: NestedValues, onlyIfMissing = false) {\n const evt = mergeNested(this.#signals, other, onlyIfMissing)\n if (evt.added.length || evt.removed.length || evt.updated.length) {\n dispatchSignalEvent(evt)\n }\n }\n\n subset(...keys: string[]): NestedValues {\n return nestedSubset(this.values(), ...keys)\n }\n\n walk(cb: (name: string, signal: Signal) => void) {\n walkNestedSignal(this.#signals, cb)\n }\n\n paths() {\n const signalNames = new Array()\n this.walk((path) => signalNames.push(path))\n return signalNames\n }\n\n values(onlyPublic = false): NestedValues {\n return nestedValues(this.#signals, onlyPublic)\n }\n\n JSON(shouldIndent = true, onlyPublic = false) {\n const values = this.values(onlyPublic)\n if (!shouldIndent) {\n return JSON.stringify(values)\n }\n return JSON.stringify(values, null, 2)\n }\n\n public toString() {\n return this.JSON()\n }\n}\n", "import { Hash, elUniqId } from '../utils/dom'\nimport { camelize } from '../utils/text'\nimport { debounce } from '../utils/timing'\nimport { effect } from '../vendored/preact-core'\nimport { DSP, DSS } from './consts'\nimport { initErr, runtimeErr } from './errors'\nimport { SignalsRoot } from './signals'\nimport {\n type ActionPlugin,\n type ActionPlugins,\n type AttributePlugin,\n type DatastarPlugin,\n type GlobalInitializer,\n type HTMLorSVGElement,\n type InitContext,\n type OnRemovalFn,\n PluginType,\n Requirement,\n type RuntimeContext,\n type RuntimeExpressionFunction,\n type WatcherPlugin,\n} from './types'\n\nconst removalKey = (k: string, v: string) => `${k}${DSP}${v}`\n\nexport class Engine {\n #signals = new SignalsRoot()\n #plugins: AttributePlugin[] = []\n #actions: ActionPlugins = {}\n #watchers: WatcherPlugin[] = []\n\n // Map of cleanup functions by element, keyed by the raw dataset key and value\n #removals = new Map>()\n\n constructor() {\n const dsPrefix = 'data-'\n\n const ob = new MutationObserver((mutations) => {\n for (const {\n target,\n type,\n attributeName,\n oldValue,\n addedNodes,\n removedNodes,\n } of mutations) {\n switch (type) {\n case 'childList':\n {\n for (const node of removedNodes) {\n const el = node as HTMLorSVGElement\n const elRemovals = this.#removals.get(el)\n if (!elRemovals) continue\n\n for (const [_, removalFn] of elRemovals) {\n removalFn()\n }\n this.#removals.delete(el)\n }\n\n for (const node of addedNodes) {\n const el = node as HTMLorSVGElement\n this.#apply(el)\n }\n }\n break\n case 'attributes': {\n {\n if (!attributeName?.startsWith(dsPrefix)) {\n break\n }\n\n const el = target as HTMLorSVGElement\n const rawKey = camelize(attributeName.slice(dsPrefix.length))\n\n // If the value is not null and has changed, cleanup the old value\n if (oldValue !== null && el.dataset[rawKey] !== oldValue) {\n const elRemovals = this.#removals.get(el)\n if (elRemovals) {\n const rk = removalKey(rawKey, oldValue)\n const removalFn = elRemovals.get(rk)\n if (removalFn) {\n removalFn()\n elRemovals.delete(rk)\n }\n }\n }\n\n this.#applyAttributePlugin(el, rawKey)\n }\n break\n }\n }\n }\n })\n\n ob.observe(document.body, {\n attributes: true,\n attributeOldValue: true,\n childList: true,\n subtree: true,\n })\n }\n\n get signals() {\n return this.#signals\n }\n\n public load(...pluginsToLoad: DatastarPlugin[]) {\n for (const plugin of pluginsToLoad) {\n const that = this // I hate javascript\n const ctx: InitContext = {\n get signals() {\n return that.#signals\n },\n effect: (cb: () => void): OnRemovalFn => effect(cb),\n actions: this.#actions,\n plugin,\n }\n\n let globalInitializer: GlobalInitializer | undefined\n switch (plugin.type) {\n case PluginType.Watcher: {\n const wp = plugin as WatcherPlugin\n this.#watchers.push(wp)\n globalInitializer = wp.onGlobalInit\n break\n }\n case PluginType.Action: {\n this.#actions[plugin.name] = plugin as ActionPlugin\n break\n }\n case PluginType.Attribute: {\n const ap = plugin as AttributePlugin\n this.#plugins.push(ap)\n globalInitializer = ap.onGlobalInit\n break\n }\n default: {\n throw initErr('InvalidPluginType', ctx)\n }\n }\n if (globalInitializer) {\n globalInitializer(ctx)\n }\n }\n\n // Sort attribute plugins by descending length then alphabetically\n this.#plugins.sort((a, b) => {\n const lenDiff = b.name.length - a.name.length\n if (lenDiff !== 0) return lenDiff\n return a.name.localeCompare(b.name)\n })\n\n this.#debouncedApply()\n }\n\n #debouncedApply = debounce(() => {\n this.#apply(document.body)\n }, 1)\n\n // Apply all plugins to the element and its children\n #apply(rootElement: Element) {\n this.#walkDownDOM(rootElement, (el) => {\n // Cleanup any existing removal functions\n const elRemovals = this.#removals.get(el)\n if (elRemovals) {\n for (const [, removalFn] of elRemovals) {\n removalFn()\n }\n this.#removals.delete(el)\n }\n\n // Apply the plugins to the element in order of application\n // since DOMStringMap is ordered, we can be deterministic\n for (const rawKey of Object.keys(el.dataset)) {\n this.#applyAttributePlugin(el, rawKey)\n }\n })\n }\n\n #applyAttributePlugin(el: HTMLorSVGElement, rawKey: string) {\n // Find the plugin that matches, since the plugins are sorted by length descending and alphabetically\n // the first match will be the most specific\n const plugin = this.#plugins.find((p) => rawKey.startsWith(p.name))\n\n // Skip if no plugin is found\n if (!plugin) return\n\n // Ensure the element has an id\n if (!el.id.length) el.id = elUniqId(el)\n\n // Extract the key and value from the dataset\n let [key, ...rawModifiers] = rawKey.slice(plugin.name.length).split(/\\_\\_+/)\n\n const hasKey = key.length > 0\n if (hasKey) {\n // Keys starting with a dash are not converted to camel case in the dataset\n const keySlice1 = key.slice(1)\n key = key.startsWith('-') ? keySlice1 : key[0].toLowerCase() + keySlice1\n }\n const value = el.dataset[rawKey] || ''\n const hasValue = value.length > 0\n\n // Create the runtime context\n const that = this // I hate javascript\n const ctx: RuntimeContext = {\n get signals() {\n return that.#signals\n },\n effect: (cb: () => void): OnRemovalFn => effect(cb),\n actions: this.#actions,\n genRX: () => this.#genRX(ctx, ...(plugin.argNames || [])),\n plugin,\n el,\n rawKey,\n key,\n value,\n mods: new Map(),\n }\n\n // Check the requirements\n const keyReq = plugin.keyReq || Requirement.Allowed\n if (hasKey) {\n if (keyReq === Requirement.Denied) {\n throw runtimeErr(`${plugin.name}KeyNotAllowed`, ctx)\n }\n } else if (keyReq === Requirement.Must) {\n throw runtimeErr(`${plugin.name}KeyRequired`, ctx)\n }\n const valReq = plugin.valReq || Requirement.Allowed\n if (hasValue) {\n if (valReq === Requirement.Denied) {\n throw runtimeErr(`${plugin.name}ValueNotAllowed`, ctx)\n }\n } else if (valReq === Requirement.Must) {\n throw runtimeErr(`${plugin.name}ValueRequired`, ctx)\n }\n\n // Check for exclusive requirements\n if (keyReq === Requirement.Exclusive || valReq === Requirement.Exclusive) {\n if (hasKey && hasValue) {\n throw runtimeErr(`${plugin.name}KeyAndValueProvided`, ctx)\n }\n if (!hasKey && !hasValue) {\n throw runtimeErr(`${plugin.name}KeyOrValueRequired`, ctx)\n }\n }\n\n for (const rawMod of rawModifiers) {\n const [label, ...mod] = rawMod.split('.')\n ctx.mods.set(camelize(label), new Set(mod.map((t) => t.toLowerCase())))\n }\n\n // Load the plugin and store any cleanup functions\n const removalFn = plugin.onLoad(ctx)\n if (removalFn) {\n let elRemovals = this.#removals.get(el)\n if (!elRemovals) {\n elRemovals = new Map()\n this.#removals.set(el, elRemovals)\n }\n elRemovals.set(removalKey(rawKey, value), removalFn)\n }\n\n // Remove the attribute if required\n if (plugin?.removeOnLoad) delete el.dataset[rawKey]\n }\n\n #genRX(\n ctx: RuntimeContext,\n ...argNames: string[]\n ): RuntimeExpressionFunction {\n let userExpression = ''\n\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 //\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 /(\\/(\\\\\\/|[^\\/])*\\/|\"(\\\\\"|[^\\\"])*\"|'(\\\\'|[^'])*'|`(\\\\`|[^`])*`|[^;])+/gm\n const statements = ctx.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 userExpression = statements.join(';\\n')\n }\n\n // Ignore any escaped values\n const escaped = new Map()\n const escapeRe = new RegExp(`(?:${DSP})(.*?)(?:${DSS})`, 'gm')\n for (const match of userExpression.matchAll(escapeRe)) {\n const k = match[1]\n const v = new Hash('dsEscaped').with(k).value\n escaped.set(v, k)\n userExpression = userExpression.replace(DSP + k + DSS, v)\n }\n\n const fnCall = /@(\\w*)\\(/gm\n const matches = userExpression.matchAll(fnCall)\n const methodsCalled = new Set()\n for (const match of matches) {\n methodsCalled.add(match[1])\n }\n\n // Replace any action calls\n const actionsRe = new RegExp(\n `@(${Object.keys(this.#actions).join('|')})\\\\(`,\n 'gm',\n )\n\n // Add ctx to action calls\n userExpression = userExpression.replaceAll(\n actionsRe,\n 'ctx.actions.$1.fn(ctx,',\n )\n\n // Replace any signal calls\n const signalNames = ctx.signals.paths()\n if (signalNames.length) {\n // Match any valid `$signalName` followed by a non-word character or end of string\n const signalsRe = new RegExp(`\\\\$(${signalNames.join('|')})(\\\\W|$)`, 'gm')\n userExpression = userExpression.replaceAll(\n signalsRe,\n `ctx.signals.signal('$1').value$2`,\n )\n }\n\n // Replace any escaped values\n for (const [k, v] of escaped) {\n userExpression = userExpression.replace(k, v)\n }\n\n const fnContent = `return (()=> {\\n${userExpression}\\n})()` // Wrap in IIFE\n ctx.fnContent = fnContent\n\n try {\n const fn = new Function('ctx', ...argNames, fnContent)\n return (...args: any[]) => {\n try {\n return fn(ctx, ...args)\n } catch (error: any) {\n throw runtimeErr('ExecuteExpression', ctx, {\n error: error.message,\n })\n }\n }\n } catch (error: any) {\n throw runtimeErr('GenerateExpression', ctx, {\n error: error.message,\n })\n }\n }\n\n #walkDownDOM(\n element: Element | null,\n callback: (el: HTMLorSVGElement) => void,\n ) {\n if (\n !element ||\n !(element instanceof HTMLElement || element instanceof SVGElement)\n ) {\n return null\n }\n const dataset = element.dataset\n if ('starIgnore' in dataset) {\n return null\n }\n if (!('starIgnore__self' in dataset)) {\n callback(element)\n }\n let el = element.firstElementChild\n while (el) {\n this.#walkDownDOM(el, callback)\n el = el.nextElementSibling\n }\n }\n}\n", "import { DSP } from '../engine/consts'\n// @ts-ignore\nconst _ = DSP // This is to force the import of DSP first in the compiled code\n\nimport { Computed } from '../plugins/official/core/attributes/computed'\nimport { Signals } from '../plugins/official/core/attributes/signals'\nimport { Star } from '../plugins/official/core/attributes/star'\nimport { Engine } from './engine'\n\nconst DS = new Engine()\nDS.load(Star, Signals, Computed)\nexport const Datastar = DS\n", "import { Datastar as DS } from '../engine'\n\nexport const Datastar = DS\n"],
+ "mappings": "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",
+ "names": ["lol", "DSP", "DSS", "DATASTAR", "FragmentMergeModes", "DefaultFragmentMergeMode", "PluginType", "DATASTAR_SIGNAL_EVENT", "DATASTAR", "name", "Computed", "key", "signals", "genRX", "rx", "kebabize", "str", "$", "ofs", "camelize", "x", "jsStrToObject", "raw", "Signals", "ctx", "key", "value", "genRX", "signals", "mods", "ifMissing", "v", "obj", "jsStrToObject", "nv", "Star", "Hash", "#value", "#prefix", "prefix", "DATASTAR", "x", "c", "elUniqId", "el", "hash", "currentEl", "i", "e", "debounce", "callback", "wait", "leading", "trailing", "timer", "resetTimer", "args", "url", "dserr", "type", "reason", "metadata", "e", "DATASTAR", "kebabize", "q", "c", "internalErr", "from", "args", "initErr", "ctx", "errCtx", "PluginType", "runtimeErr", "from", "BRAND_SYMBOL", "RUNNING", "NOTIFIED", "OUTDATED", "DISPOSED", "HAS_ERROR", "TRACKING", "startBatch", "batchDepth", "endBatch", "error", "hasError", "batchedEffect", "effect", "batchIteration", "next", "needsToRecompute", "err", "internalErr", "evalContext", "batchedEffect", "batchDepth", "batchIteration", "globalVersion", "addDependency", "signal", "evalContext", "node", "TRACKING", "Signal", "value", "BRAND_SYMBOL", "prev", "next", "fn", "effect", "prevContext", "internalErr", "from", "startBatch", "endBatch", "needsToRecompute", "target", "node", "prepareSources", "rollbackNode", "cleanupSources", "head", "prev", "Computed", "fn", "Signal", "globalVersion", "OUTDATED", "NOTIFIED", "RUNNING", "TRACKING", "prevContext", "evalContext", "value", "HAS_ERROR", "err", "internalErr", "from", "addDependency", "computed", "cleanupEffect", "effect", "cleanup", "startBatch", "error", "DISPOSED", "disposeEffect", "endBatch", "endEffect", "Effect", "finish", "batchedEffect", "from", "dispatchSignalEvent", "evt", "DATASTAR_SIGNAL_EVENT", "nestedValues", "signal", "onlyPublic", "kv", "key", "value", "Signal", "mergeNested", "target", "values", "onlyIfMissing", "internalErr", "subEvt", "k", "t", "oldValue", "walkNestedSignal", "cb", "path", "nestedSubset", "original", "keys", "subset", "parts", "subOriginal", "subSubset", "i", "part", "last", "SignalsRoot", "#signals", "dotDelimitedPath", "parts", "subSignals", "part", "last", "signal", "internalErr", "from", "fn", "computed", "value", "s", "oldValue", "dispatchSignalEvent", "defaultValue", "i", "current", "Signal", "dotDelimitedPaths", "removed", "path", "other", "onlyIfMissing", "evt", "mergeNested", "keys", "nestedSubset", "cb", "walkNestedSignal", "signalNames", "onlyPublic", "nestedValues", "shouldIndent", "values", "removalKey", "k", "v", "DSP", "Engine", "#signals", "SignalsRoot", "#plugins", "#actions", "#watchers", "#removals", "dsPrefix", "mutations", "target", "type", "attributeName", "oldValue", "addedNodes", "removedNodes", "node", "el", "elRemovals", "_", "removalFn", "#apply", "rawKey", "camelize", "rk", "#applyAttributePlugin", "pluginsToLoad", "plugin", "that", "ctx", "cb", "effect", "globalInitializer", "wp", "ap", "initErr", "a", "b", "lenDiff", "#debouncedApply", "debounce", "rootElement", "#walkDownDOM", "p", "elUniqId", "key", "rawModifiers", "hasKey", "keySlice1", "value", "hasValue", "#genRX", "keyReq", "runtimeErr", "valReq", "rawMod", "label", "mod", "t", "argNames", "userExpression", "statementRe", "statements", "lastIdx", "last", "escaped", "escapeRe", "DSS", "match", "Hash", "fnCall", "matches", "methodsCalled", "actionsRe", "signalNames", "signalsRe", "fnContent", "fn", "args", "error", "element", "callback", "dataset", "DS", "Engine", "Star", "Signals", "Computed", "Datastar", "Datastar"]
}
diff --git a/bundles/datastar.js b/bundles/datastar.js
index 0ad0bf56a..5c8be1e40 100644
--- a/bundles/datastar.js
+++ b/bundles/datastar.js
@@ -1,13 +1,13 @@
// Datastar v1.0.0-beta.2
-var je=/🖕JS_DS🚀/.source,pe=je.slice(0,5),ke=je.slice(4),L="datastar";var Be="Datastar-Request",me=300;var Ge="type module",ge=!1,Ke=!1,Je=!0,O={Morph:"morph",Inner:"inner",Outer:"outer",Prepend:"prepend",Append:"append",Before:"before",After:"after",UpsertAttributes:"upsertAttributes"},ze=O.Morph,k={MergeFragments:"datastar-merge-fragments",MergeSignals:"datastar-merge-signals",RemoveFragments:"datastar-remove-fragments",RemoveSignals:"datastar-remove-signals",ExecuteScript:"datastar-execute-script"};var m=(r=>(r[r.Attribute=1]="Attribute",r[r.Watcher=2]="Watcher",r[r.Action=3]="Action",r))(m||{});var Rn="computed",Xe={type:1,name:Rn,keyReq:1,valReq:1,onLoad:({key:t,signals:e,genRX:n})=>{let r=n();e.setComputed(t,r)}};var U=t=>t.trim()==="true",j=t=>t.replace(/[A-Z]+(?![a-z])|[A-Z]/g,(e,n)=>(n?"-":"")+e.toLowerCase()),Ye=t=>t.replace(/(?:^\w|[A-Z]|\b\w)/g,(e,n)=>n===0?e.toLowerCase():e.toUpperCase()).replace(/\s+/g,""),he=t=>new Function(`return Object.assign({}, ${t})`)(),B=t=>t.startsWith("$")?t.slice(1):t;var Ze={type:1,name:"signals",removeOnLoad:!0,onLoad:t=>{let{key:e,value:n,genRX:r,signals:i,mods:o}=t,s=o.has("ifmissing");if(e!==""&&!s){let a=n===""?n:r()();i.setValue(e,a)}else{let a=he(t.value);t.value=JSON.stringify(a);let c=r()();i.merge(c,s)}}};var Qe={type:1,name:"star",keyReq:2,valReq:2,onLoad:()=>{alert("YOU ARE PROBABLY OVERCOMPLICATING IT")}};var ie=class{#e=0;#t;constructor(e=L){this.#t=e}with(e){if(typeof e=="string")for(let n of e.split(""))this.with(n.charCodeAt(0));else this.#e=(this.#e<<5)-this.#e+e;return this}reset(){return this.#e=0,this}get value(){return this.#t+Math.abs(this.#e).toString(36)}};function et(t){if(t.id)return t.id;let e=new ie,n=t;for(;n.parentNode;){if(n.id){e.with(n.id);break}if(n===n.ownerDocument.documentElement)e.with(n.tagName);else for(let r=1,i=t;i.previousElementSibling;i=i.previousElementSibling,r++)e.with(r);n=n.parentNode}return e.value}function tt(t,e){let n=new MutationObserver(r=>{for(let i of r)for(let o of i.removedNodes)if(o===t){n.disconnect(),e();return}});n.observe(t.parentNode,{childList:!0})}var xn=`${window.location.origin}/errors`;function De(t,e,n={}){let r=new Error;e=e[0].toUpperCase()+e.slice(1),r.name=`${L} ${t} error`;let i=j(e).replaceAll("-","_"),o=new URLSearchParams({metadata:JSON.stringify(n)}).toString(),s=JSON.stringify(n,null,2);return r.message=`${e}
-More info: ${xn}/${t}/${i}?${o}
-Context: ${s}`,r}function x(t,e,n={}){return De("internal",e,Object.assign({from:t},n))}function V(t,e,n={}){let r={plugin:{name:e.plugin.name,type:m[e.plugin.type]}};return De("init",t,Object.assign(r,n))}function y(t,e,n={}){let r={plugin:{name:e.plugin.name,type:m[e.plugin.type]},element:{id:e.el.id,tag:e.el.tagName},expression:{rawKey:e.rawKey,key:e.key,value:e.value,validSignals:e.signals.paths(),fnContent:e.fnContent}};return De("runtime",t,Object.assign(r,n))}var K="preact-signals",Pn=Symbol.for("preact-signals"),H=1,Y=2,se=4,Q=8,ye=16,Z=32;function Oe(){ve++}function Ve(){if(ve>1){ve--;return}let t,e=!1;for(;oe!==void 0;){let n=oe;for(oe=void 0,Le++;n!==void 0;){let r=n._nextBatchedEffect;if(n._nextBatchedEffect=void 0,n._flags&=~Y,!(n._flags&Q)&&rt(n))try{n._callback()}catch(i){e||(t=i,e=!0)}n=r}}if(Le=0,ve--,e)throw x(K,"BatchError, error",{error:t})}var S;var oe,ve=0,Le=0,be=0;function nt(t){if(S===void 0)return;let e=t._node;if(e===void 0||e._target!==S)return e={_version:0,_source:t,_prevSource:S._sources,_nextSource:void 0,_target:S,_prevTarget:void 0,_nextTarget:void 0,_rollbackNode:e},S._sources!==void 0&&(S._sources._nextSource=e),S._sources=e,t._node=e,S._flags&Z&&t._subscribe(e),e;if(e._version===-1)return e._version=0,e._nextSource!==void 0&&(e._nextSource._prevSource=e._prevSource,e._prevSource!==void 0&&(e._prevSource._nextSource=e._nextSource),e._prevSource=S._sources,e._nextSource=void 0,S._sources._nextSource=e,S._sources=e),e}function R(t){this._value=t,this._version=0,this._node=void 0,this._targets=void 0}R.prototype.brand=Pn;R.prototype._refresh=()=>!0;R.prototype._subscribe=function(t){this._targets!==t&&t._prevTarget===void 0&&(t._nextTarget=this._targets,this._targets!==void 0&&(this._targets._prevTarget=t),this._targets=t)};R.prototype._unsubscribe=function(t){if(this._targets!==void 0){let e=t._prevTarget,n=t._nextTarget;e!==void 0&&(e._nextTarget=n,t._prevTarget=void 0),n!==void 0&&(n._prevTarget=e,t._nextTarget=void 0),t===this._targets&&(this._targets=n)}};R.prototype.subscribe=function(t){return Ee(()=>{let e=this.value,n=S;S=void 0;try{t(e)}finally{S=n}})};R.prototype.valueOf=function(){return this.value};R.prototype.toString=function(){return`${this.value}`};R.prototype.toJSON=function(){return this.value};R.prototype.peek=function(){let t=S;S=void 0;try{return this.value}finally{S=t}};Object.defineProperty(R.prototype,"value",{get(){let t=nt(this);return t!==void 0&&(t._version=this._version),this._value},set(t){if(t!==this._value){if(Le>100)throw x(K,"SignalCycleDetected");this._value=t,this._version++,be++,Oe();try{for(let e=this._targets;e!==void 0;e=e._nextTarget)e._target._notify()}finally{Ve()}}}});function rt(t){for(let e=t._sources;e!==void 0;e=e._nextSource)if(e._source._version!==e._version||!e._source._refresh()||e._source._version!==e._version)return!0;return!1}function it(t){for(let e=t._sources;e!==void 0;e=e._nextSource){let n=e._source._node;if(n!==void 0&&(e._rollbackNode=n),e._source._node=e,e._version=-1,e._nextSource===void 0){t._sources=e;break}}}function ot(t){let e=t._sources,n;for(;e!==void 0;){let r=e._prevSource;e._version===-1?(e._source._unsubscribe(e),r!==void 0&&(r._nextSource=e._nextSource),e._nextSource!==void 0&&(e._nextSource._prevSource=r)):n=e,e._source._node=e._rollbackNode,e._rollbackNode!==void 0&&(e._rollbackNode=void 0),e=r}t._sources=n}function J(t){R.call(this,void 0),this._fn=t,this._sources=void 0,this._globalVersion=be-1,this._flags=se}J.prototype=new R;J.prototype._refresh=function(){if(this._flags&=~Y,this._flags&H)return!1;if((this._flags&(se|Z))===Z||(this._flags&=~se,this._globalVersion===be))return!0;if(this._globalVersion=be,this._flags|=H,this._version>0&&!rt(this))return this._flags&=~H,!0;let t=S;try{it(this),S=this;let e=this._fn();(this._flags&ye||this._value!==e||this._version===0)&&(this._value=e,this._flags&=~ye,this._version++)}catch(e){this._value=e,this._flags|=ye,this._version++}return S=t,ot(this),this._flags&=~H,!0};J.prototype._subscribe=function(t){if(this._targets===void 0){this._flags|=se|Z;for(let e=this._sources;e!==void 0;e=e._nextSource)e._source._subscribe(e)}R.prototype._subscribe.call(this,t)};J.prototype._unsubscribe=function(t){if(this._targets!==void 0&&(R.prototype._unsubscribe.call(this,t),this._targets===void 0)){this._flags&=~Z;for(let e=this._sources;e!==void 0;e=e._nextSource)e._source._unsubscribe(e)}};J.prototype._notify=function(){if(!(this._flags&Y)){this._flags|=se|Y;for(let t=this._targets;t!==void 0;t=t._nextTarget)t._target._notify()}};Object.defineProperty(J.prototype,"value",{get(){if(this._flags&H)throw x(K,"SignalCycleDetected");let t=nt(this);if(this._refresh(),t!==void 0&&(t._version=this._version),this._flags&ye)throw x(K,"GetComputedError",{value:this._value});return this._value}});function st(t){return new J(t)}function at(t){let e=t._cleanup;if(t._cleanup=void 0,typeof e=="function"){Oe();let n=S;S=void 0;try{e()}catch(r){throw t._flags&=~H,t._flags|=Q,Fe(t),x(K,"CleanupEffectError",{error:r})}finally{S=n,Ve()}}}function Fe(t){for(let e=t._sources;e!==void 0;e=e._nextSource)e._source._unsubscribe(e);t._fn=void 0,t._sources=void 0,at(t)}function Mn(t){if(S!==this)throw x(K,"EndEffectError");ot(this),S=t,this._flags&=~H,this._flags&Q&&Fe(this),Ve()}function ae(t){this._fn=t,this._cleanup=void 0,this._sources=void 0,this._nextBatchedEffect=void 0,this._flags=Z}ae.prototype._callback=function(){let t=this._start();try{if(this._flags&Q||this._fn===void 0)return;let e=this._fn();typeof e=="function"&&(this._cleanup=e)}finally{t()}};ae.prototype._start=function(){if(this._flags&H)throw x(K,"SignalCycleDetected");this._flags|=H,this._flags&=~Q,at(this),it(this),Oe();let t=S;return S=this,Mn.bind(this,t)};ae.prototype._notify=function(){this._flags&Y||(this._flags|=Y,this._nextBatchedEffect=oe,oe=this)};ae.prototype._dispose=function(){this._flags|=Q,this._flags&H||Fe(this)};function Ee(t){let e=new ae(t);try{e._callback()}catch(n){throw e._dispose(),n}return e._dispose.bind(e)}var lt="namespacedSignals";function ut(t,e=!1){let n={};for(let r in t)if(Object.hasOwn(t,r)){if(e&&r.startsWith("_"))continue;let i=t[r];i instanceof R?n[r]=i.value:n[r]=ut(i)}return n}function ct(t,e,n=!1){for(let r in e)if(Object.hasOwn(e,r)){if(r.match(/\_\_+/))throw x(lt,"InvalidSignalKey",{key:r});let i=e[r];if(i instanceof Object&&!Array.isArray(i))t[r]||(t[r]={}),ct(t[r],i,n);else{if(Object.hasOwn(t,r)){if(n)continue;let s=t[r];if(s instanceof R){s.value=i;continue}}t[r]=new R(i)}}}function ft(t,e){for(let n in t)if(Object.hasOwn(t,n)){let r=t[n];r instanceof R?e(n,r):ft(r,(i,o)=>{e(`${n}.${i}`,o)})}}function Nn(t,...e){let n={};for(let r of e){let i=r.split("."),o=t,s=n;for(let u=0;un());this.setSignal(e,r)}value(e){return this.signal(e)?.value}setValue(e,n){let r=this.upsertIfMissing(e,n);r.value=n}upsertIfMissing(e,n){let r=e.split("."),i=this.#e;for(let u=0;ue.push(n)),e}values(e=!1){return ut(this.#e,e)}JSON(e=!0,n=!1){let r=this.values(n);return e?JSON.stringify(r,null,2):JSON.stringify(r)}toString(){return this.JSON()}};var Te=class{#e=new Se;#t=[];#r={};#s=[];#n=new Map;get signals(){return this.#e}load(...e){for(let n of e){let r=this,i={get signals(){return r.#e},effect:s=>Ee(s),actions:this.#r,apply:this.apply.bind(this),cleanup:this.#i.bind(this),plugin:n},o;switch(n.type){case 2:{let s=n;this.#s.push(s),o=s.onGlobalInit;break}case 3:{this.#r[n.name]=n;break}case 1:{let s=n;this.#t.push(s),o=s.onGlobalInit;break}default:throw V("InvalidPluginType",i)}o&&o(i)}this.#t.sort((n,r)=>{let i=r.name.length-n.name.length;return i!==0?i:n.name.localeCompare(r.name)})}apply(e){this.#o(e,n=>{this.#i(n);for(let r of Object.keys(n.dataset)){let i=this.#t.find(h=>r.startsWith(h.name));if(!i)continue;n.id.length||(n.id=et(n));let[o,...s]=r.slice(i.name.length).split(/\_\_+/),a=o.length>0;if(a){let h=o.slice(1);o=o.startsWith("-")?h:o[0].toLowerCase()+h}let u=`${n.dataset[r]}`||"",c=u.length>0,l=this,f={get signals(){return l.#e},effect:h=>Ee(h),apply:this.apply.bind(this),cleanup:this.#i.bind(this),actions:this.#r,genRX:()=>this.#a(f,...i.argNames||[]),plugin:i,el:n,rawKey:r,key:o,value:u,mods:new Map},g=i.keyReq||0;if(a){if(g===2)throw y(`${i.name}KeyNotAllowed`,f)}else if(g===1)throw y(`${i.name}KeyRequired`,f);let A=i.valReq||0;if(c){if(A===2)throw y(`${i.name}ValueNotAllowed`,f)}else if(A===1)throw y(`${i.name}ValueRequired`,f);if(g===3||A===3){if(a&&c)throw y(`${i.name}KeyAndValueProvided`,f);if(!a&&!c)throw y(`${i.name}KeyOrValueRequired`,f)}for(let h of s){let[p,...b]=h.split(".");f.mods.set(Ye(p),new Set(b.map(w=>w.toLowerCase())))}let v=i.onLoad(f);v&&(this.#n.has(n)||this.#n.set(n,{id:n.id,fns:[]}),this.#n.get(n)?.fns.push(v)),i?.removeOnLoad&&delete n.dataset[r]}})}#a(e,...n){let r="",i=/(\/(\\\/|[^\/])*\/|"(\\"|[^\"])*"|'(\\'|[^'])*'|`(\\`|[^`])*`|[^;])+/gm,o=e.value.trim().match(i);if(o){let v=o.length-1,h=o[v].trim();h.startsWith("return")||(o[v]=`return (${h});`),r=o.join(`;
-`)}let s=new Map,a=new RegExp(`(?:${pe})(.*?)(?:${ke})`,"gm");for(let v of r.matchAll(a)){let h=v[1],p=new ie("dsEscaped").with(h).value;s.set(p,h),r=r.replace(pe+h+ke,p)}let u=/@(\w*)\(/gm,c=r.matchAll(u),l=new Set;for(let v of c)l.add(v[1]);let f=new RegExp(`@(${Object.keys(this.#r).join("|")})\\(`,"gm");r=r.replaceAll(f,"ctx.actions.$1.fn(ctx,");let g=e.signals.paths();if(g.length){let v=new RegExp(`\\$(${g.join("|")})(\\W|$)`,"gm");r=r.replaceAll(v,"ctx.signals.signal('$1').value$2")}for(let[v,h]of s)r=r.replace(v,h);let A=`return (()=> {
+var Be=/🖕JS_DS🚀/.source,re=Be.slice(0,5),Ie=Be.slice(4),C="datastar";var Ke="Datastar-Request",me=300;var Je="type module",ge=!1,ze=!1,Xe=!0,V={Morph:"morph",Inner:"inner",Outer:"outer",Prepend:"prepend",Append:"append",Before:"before",After:"after",UpsertAttributes:"upsertAttributes"},Ye=V.Morph,D={MergeFragments:"datastar-merge-fragments",MergeSignals:"datastar-merge-signals",RemoveFragments:"datastar-remove-fragments",RemoveSignals:"datastar-remove-signals",ExecuteScript:"datastar-execute-script"};var g=(r=>(r[r.Attribute=1]="Attribute",r[r.Watcher=2]="Watcher",r[r.Action=3]="Action",r))(g||{});var ie=`${C}-signals`;var Mn="computed",Qe={type:1,name:Mn,keyReq:1,valReq:1,onLoad:({key:t,signals:e,genRX:n})=>{let r=n();e.setComputed(t,r)}};var G=t=>t.trim()==="true",U=t=>t.replace(/[A-Z]+(?![a-z])|[A-Z]/g,(e,n)=>(n?"-":"")+e.toLowerCase()),Ve=t=>U(t).replace(/-./g,e=>e[1].toUpperCase()),he=t=>new Function(`return Object.assign({}, ${t})`)(),j=t=>t.startsWith("$")?t.slice(1):t;var Ze={type:1,name:"signals",removeOnLoad:!0,onLoad:t=>{let{key:e,value:n,genRX:r,signals:i,mods:o}=t,s=o.has("ifmissing");if(e!==""&&!s){let a=n===""?n:r()();i.setValue(e,a)}else{let a=he(t.value);t.value=JSON.stringify(a);let f=r()();i.merge(f,s)}}};var et={type:1,name:"star",keyReq:2,valReq:2,onLoad:()=>{alert("YOU ARE PROBABLY OVERCOMPLICATING IT")}};var oe=class{#e=0;#n;constructor(e=C){this.#n=e}with(e){if(typeof e=="string")for(let n of e.split(""))this.with(n.charCodeAt(0));else this.#e=(this.#e<<5)-this.#e+e;return this}reset(){return this.#e=0,this}get value(){return this.#n+Math.abs(this.#e).toString(36)}};function tt(t){if(t.id)return t.id;let e=new oe,n=t;for(;n.parentNode;){if(n.id){e.with(n.id);break}if(n===n.ownerDocument.documentElement)e.with(n.tagName);else for(let r=1,i=t;i.previousElementSibling;i=i.previousElementSibling,r++)e.with(r);n=n.parentNode}return e.value}function nt(t,e){let n=new MutationObserver(r=>{for(let i of r)for(let o of i.removedNodes)if(o===t){n.disconnect(),e();return}});n.observe(t.parentNode,{childList:!0})}function rt(t,e){return(...n)=>{setTimeout(()=>{t(...n)},e)}}function ye(t,e,n=!1,r=!0){let i=-1,o=()=>i&&clearTimeout(i);return(...s)=>{o(),n&&!i&&t(...s),i=setTimeout(()=>{r&&t(...s),o()},e)}}function it(t,e,n=!0,r=!1){let i=!1;return(...o)=>{i||(n&&t(...o),i=!0,setTimeout(()=>{i=!1,r&&t(...o)},e))}}var Pn=`${window.location.origin}/errors`;function ke(t,e,n={}){let r=new Error;e=e[0].toUpperCase()+e.slice(1),r.name=`${C} ${t} error`;let i=U(e).replaceAll("-","_"),o=new URLSearchParams({metadata:JSON.stringify(n)}).toString(),s=JSON.stringify(n,null,2);return r.message=`${e}
+More info: ${Pn}/${t}/${i}?${o}
+Context: ${s}`,r}function x(t,e,n={}){return ke("internal",e,Object.assign({from:t},n))}function k(t,e,n={}){let r={plugin:{name:e.plugin.name,type:g[e.plugin.type]}};return ke("init",t,Object.assign(r,n))}function y(t,e,n={}){let r={plugin:{name:e.plugin.name,type:g[e.plugin.type]},element:{id:e.el.id,tag:e.el.tagName},expression:{rawKey:e.rawKey,key:e.key,value:e.value,validSignals:e.signals.paths(),fnContent:e.fnContent}};return ke("runtime",t,Object.assign(r,n))}var B="preact-signals",Nn=Symbol.for("preact-signals"),H=1,X=2,ae=4,Q=8,ve=16,Y=32;function Fe(){Ee++}function He(){if(Ee>1){Ee--;return}let t,e=!1;for(;se!==void 0;){let n=se;for(se=void 0,Oe++;n!==void 0;){let r=n._nextBatchedEffect;if(n._nextBatchedEffect=void 0,n._flags&=~X,!(n._flags&Q)&&st(n))try{n._callback()}catch(i){e||(t=i,e=!0)}n=r}}if(Oe=0,Ee--,e)throw x(B,"BatchError, error",{error:t})}var S;var se,Ee=0,Oe=0,Se=0;function ot(t){if(S===void 0)return;let e=t._node;if(e===void 0||e._target!==S)return e={_version:0,_source:t,_prevSource:S._sources,_nextSource:void 0,_target:S,_prevTarget:void 0,_nextTarget:void 0,_rollbackNode:e},S._sources!==void 0&&(S._sources._nextSource=e),S._sources=e,t._node=e,S._flags&Y&&t._subscribe(e),e;if(e._version===-1)return e._version=0,e._nextSource!==void 0&&(e._nextSource._prevSource=e._prevSource,e._prevSource!==void 0&&(e._prevSource._nextSource=e._nextSource),e._prevSource=S._sources,e._nextSource=void 0,S._sources._nextSource=e,S._sources=e),e}function A(t){this._value=t,this._version=0,this._node=void 0,this._targets=void 0}A.prototype.brand=Nn;A.prototype._refresh=()=>!0;A.prototype._subscribe=function(t){this._targets!==t&&t._prevTarget===void 0&&(t._nextTarget=this._targets,this._targets!==void 0&&(this._targets._prevTarget=t),this._targets=t)};A.prototype._unsubscribe=function(t){if(this._targets!==void 0){let e=t._prevTarget,n=t._nextTarget;e!==void 0&&(e._nextTarget=n,t._prevTarget=void 0),n!==void 0&&(n._prevTarget=e,t._nextTarget=void 0),t===this._targets&&(this._targets=n)}};A.prototype.subscribe=function(t){return be(()=>{let e=this.value,n=S;S=void 0;try{t(e)}finally{S=n}})};A.prototype.valueOf=function(){return this.value};A.prototype.toString=function(){return`${this.value}`};A.prototype.toJSON=function(){return this.value};A.prototype.peek=function(){let t=S;S=void 0;try{return this.value}finally{S=t}};Object.defineProperty(A.prototype,"value",{get(){let t=ot(this);return t!==void 0&&(t._version=this._version),this._value},set(t){if(t!==this._value){if(Oe>100)throw x(B,"SignalCycleDetected");this._value=t,this._version++,Se++,Fe();try{for(let e=this._targets;e!==void 0;e=e._nextTarget)e._target._notify()}finally{He()}}}});function st(t){for(let e=t._sources;e!==void 0;e=e._nextSource)if(e._source._version!==e._version||!e._source._refresh()||e._source._version!==e._version)return!0;return!1}function at(t){for(let e=t._sources;e!==void 0;e=e._nextSource){let n=e._source._node;if(n!==void 0&&(e._rollbackNode=n),e._source._node=e,e._version=-1,e._nextSource===void 0){t._sources=e;break}}}function lt(t){let e=t._sources,n;for(;e!==void 0;){let r=e._prevSource;e._version===-1?(e._source._unsubscribe(e),r!==void 0&&(r._nextSource=e._nextSource),e._nextSource!==void 0&&(e._nextSource._prevSource=r)):n=e,e._source._node=e._rollbackNode,e._rollbackNode!==void 0&&(e._rollbackNode=void 0),e=r}t._sources=n}function K(t){A.call(this,void 0),this._fn=t,this._sources=void 0,this._globalVersion=Se-1,this._flags=ae}K.prototype=new A;K.prototype._refresh=function(){if(this._flags&=~X,this._flags&H)return!1;if((this._flags&(ae|Y))===Y||(this._flags&=~ae,this._globalVersion===Se))return!0;if(this._globalVersion=Se,this._flags|=H,this._version>0&&!st(this))return this._flags&=~H,!0;let t=S;try{at(this),S=this;let e=this._fn();(this._flags&ve||this._value!==e||this._version===0)&&(this._value=e,this._flags&=~ve,this._version++)}catch(e){this._value=e,this._flags|=ve,this._version++}return S=t,lt(this),this._flags&=~H,!0};K.prototype._subscribe=function(t){if(this._targets===void 0){this._flags|=ae|Y;for(let e=this._sources;e!==void 0;e=e._nextSource)e._source._subscribe(e)}A.prototype._subscribe.call(this,t)};K.prototype._unsubscribe=function(t){if(this._targets!==void 0&&(A.prototype._unsubscribe.call(this,t),this._targets===void 0)){this._flags&=~Y;for(let e=this._sources;e!==void 0;e=e._nextSource)e._source._unsubscribe(e)}};K.prototype._notify=function(){if(!(this._flags&X)){this._flags|=ae|X;for(let t=this._targets;t!==void 0;t=t._nextTarget)t._target._notify()}};Object.defineProperty(K.prototype,"value",{get(){if(this._flags&H)throw x(B,"SignalCycleDetected");let t=ot(this);if(this._refresh(),t!==void 0&&(t._version=this._version),this._flags&ve)throw x(B,"GetComputedError",{value:this._value});return this._value}});function ut(t){return new K(t)}function ct(t){let e=t._cleanup;if(t._cleanup=void 0,typeof e=="function"){Fe();let n=S;S=void 0;try{e()}catch(r){throw t._flags&=~H,t._flags|=Q,We(t),x(B,"CleanupEffectError",{error:r})}finally{S=n,He()}}}function We(t){for(let e=t._sources;e!==void 0;e=e._nextSource)e._source._unsubscribe(e);t._fn=void 0,t._sources=void 0,ct(t)}function Cn(t){if(S!==this)throw x(B,"EndEffectError");lt(this),S=t,this._flags&=~H,this._flags&Q&&We(this),He()}function le(t){this._fn=t,this._cleanup=void 0,this._sources=void 0,this._nextBatchedEffect=void 0,this._flags=Y}le.prototype._callback=function(){let t=this._start();try{if(this._flags&Q||this._fn===void 0)return;let e=this._fn();typeof e=="function"&&(this._cleanup=e)}finally{t()}};le.prototype._start=function(){if(this._flags&H)throw x(B,"SignalCycleDetected");this._flags|=H,this._flags&=~Q,ct(this),at(this),Fe();let t=S;return S=this,Cn.bind(this,t)};le.prototype._notify=function(){this._flags&X||(this._flags|=X,this._nextBatchedEffect=se,se=this)};le.prototype._dispose=function(){this._flags|=Q,this._flags&H||We(this)};function be(t){let e=new le(t);try{e._callback()}catch(n){throw e._dispose(),n}return e._dispose.bind(e)}var ft="namespacedSignals",Te=t=>{document.dispatchEvent(new CustomEvent(ie,{detail:Object.assign({added:[],removed:[],updated:[]},t)}))};function dt(t,e=!1){let n={};for(let r in t)if(Object.hasOwn(t,r)){if(e&&r.startsWith("_"))continue;let i=t[r];i instanceof A?n[r]=i.value:n[r]=dt(i)}return n}function pt(t,e,n=!1){let r={added:[],removed:[],updated:[]};for(let i in e)if(Object.hasOwn(e,i)){if(i.match(/\_\_+/))throw x(ft,"InvalidSignalKey",{key:i});let o=e[i];if(o instanceof Object&&!Array.isArray(o)){t[i]||(t[i]={});let s=pt(t[i],o,n);r.added.push(...s.added.map(a=>`${i}.${a}`)),r.removed.push(...s.removed.map(a=>`${i}.${a}`)),r.updated.push(...s.updated.map(a=>`${i}.${a}`))}else{if(Object.hasOwn(t,i)){if(n)continue;let a=t[i];if(a instanceof A){let l=a.value;a.value=o,l!==o&&r.updated.push(i);continue}}t[i]=new A(o),r.added.push(i)}}return r}function mt(t,e){for(let n in t)if(Object.hasOwn(t,n)){let r=t[n];r instanceof A?e(n,r):mt(r,(i,o)=>{e(`${n}.${i}`,o)})}}function Dn(t,...e){let n={};for(let r of e){let i=r.split("."),o=t,s=n;for(let l=0;ln());this.setSignal(e,r)}value(e){return this.signal(e)?.value}setValue(e,n){let r=this.upsertIfMissing(e,n),i=r.value;r.value=n,i!==n&&Te({updated:[e]})}upsertIfMissing(e,n){let r=e.split("."),i=this.#e;for(let l=0;le.push(n)),e}values(e=!1){return dt(this.#e,e)}JSON(e=!0,n=!1){let r=this.values(n);return e?JSON.stringify(r,null,2):JSON.stringify(r)}toString(){return this.JSON()}};var gt=(t,e)=>`${t}${re}${e}`,_e=class{#e=new Ae;#n=[];#r={};#a=[];#t=new Map;constructor(){let e="data-";new MutationObserver(r=>{for(let{target:i,type:o,attributeName:s,oldValue:a,addedNodes:l,removedNodes:f}of r)switch(o){case"childList":{for(let u of f){let d=u,m=this.#t.get(d);if(m){for(let[v,c]of m)c();this.#t.delete(d)}}for(let u of l){let d=u;this.#i(d)}}break;case"attributes":{{if(!s?.startsWith(e))break;let u=i,d=Ve(s.slice(e.length));if(a!==null&&u.dataset[d]!==a){let m=this.#t.get(u);if(m){let v=gt(d,a),c=m.get(v);c&&(c(),m.delete(v))}}this.#o(u,d)}break}}}).observe(document.body,{attributes:!0,attributeOldValue:!0,childList:!0,subtree:!0})}get signals(){return this.#e}load(...e){for(let n of e){let r=this,i={get signals(){return r.#e},effect:s=>be(s),actions:this.#r,plugin:n},o;switch(n.type){case 2:{let s=n;this.#a.push(s),o=s.onGlobalInit;break}case 3:{this.#r[n.name]=n;break}case 1:{let s=n;this.#n.push(s),o=s.onGlobalInit;break}default:throw k("InvalidPluginType",i)}o&&o(i)}this.#n.sort((n,r)=>{let i=r.name.length-n.name.length;return i!==0?i:n.name.localeCompare(r.name)}),this.#l()}#l=ye(()=>{this.#i(document.body)},1);#i(e){this.#s(e,n=>{let r=this.#t.get(n);if(r){for(let[,i]of r)i();this.#t.delete(n)}for(let i of Object.keys(n.dataset))this.#o(n,i)})}#o(e,n){let r=this.#n.find(c=>n.startsWith(c.name));if(!r)return;e.id.length||(e.id=tt(e));let[i,...o]=n.slice(r.name.length).split(/\_\_+/),s=i.length>0;if(s){let c=i.slice(1);i=i.startsWith("-")?c:i[0].toLowerCase()+c}let a=e.dataset[n]||"",l=a.length>0,f=this,u={get signals(){return f.#e},effect:c=>be(c),actions:this.#r,genRX:()=>this.#u(u,...r.argNames||[]),plugin:r,el:e,rawKey:n,key:i,value:a,mods:new Map},d=r.keyReq||0;if(s){if(d===2)throw y(`${r.name}KeyNotAllowed`,u)}else if(d===1)throw y(`${r.name}KeyRequired`,u);let m=r.valReq||0;if(l){if(m===2)throw y(`${r.name}ValueNotAllowed`,u)}else if(m===1)throw y(`${r.name}ValueRequired`,u);if(d===3||m===3){if(s&&l)throw y(`${r.name}KeyAndValueProvided`,u);if(!s&&!l)throw y(`${r.name}KeyOrValueRequired`,u)}for(let c of o){let[h,...T]=c.split(".");u.mods.set(Ve(h),new Set(T.map(w=>w.toLowerCase())))}let v=r.onLoad(u);if(v){let c=this.#t.get(e);c||(c=new Map,this.#t.set(e,c)),c.set(gt(n,a),v)}r?.removeOnLoad&&delete e.dataset[n]}#u(e,...n){let r="",i=/(\/(\\\/|[^\/])*\/|"(\\"|[^\"])*"|'(\\'|[^'])*'|`(\\`|[^`])*`|[^;])+/gm,o=e.value.trim().match(i);if(o){let c=o.length-1,h=o[c].trim();h.startsWith("return")||(o[c]=`return (${h});`),r=o.join(`;
+`)}let s=new Map,a=new RegExp(`(?:${re})(.*?)(?:${Ie})`,"gm");for(let c of r.matchAll(a)){let h=c[1],T=new oe("dsEscaped").with(h).value;s.set(T,h),r=r.replace(re+h+Ie,T)}let l=/@(\w*)\(/gm,f=r.matchAll(l),u=new Set;for(let c of f)u.add(c[1]);let d=new RegExp(`@(${Object.keys(this.#r).join("|")})\\(`,"gm");r=r.replaceAll(d,"ctx.actions.$1.fn(ctx,");let m=e.signals.paths();if(m.length){let c=new RegExp(`\\$(${m.join("|")})(\\W|$)`,"gm");r=r.replaceAll(c,"ctx.signals.signal('$1').value$2")}for(let[c,h]of s)r=r.replace(c,h);let v=`return (()=> {
${r}
-})()`;e.fnContent=A;try{let v=new Function("ctx",...n,A);return(...h)=>{try{return v(e,...h)}catch(p){throw y("ExecuteExpression",e,{error:p.message})}}}catch(v){throw y("GenerateExpression",e,{error:v.message})}}#o(e,n){if(!e||!(e instanceof HTMLElement||e instanceof SVGElement))return null;let r=e.dataset;if("starIgnore"in r)return null;"starIgnore__self"in r||n(e);let i=e.firstElementChild;for(;i;)this.#o(i,n),i=i.nextElementSibling}#i(e){let n=this.#n.get(e);if(n){for(let r of n.fns)r();this.#n.delete(e)}}};var dt=new Te;dt.load(Qe,Ze,Xe);var Ae=dt;async function Cn(t,e){let n=t.getReader(),r;for(;!(r=await n.read()).done;)e(r.value)}function In(t){let e,n,r,i=!1;return function(s){e===void 0?(e=s,n=0,r=-1):e=Dn(e,s);let a=e.length,u=0;for(;n0){let u=i.decode(s.subarray(0,a)),c=a+(s[a+1]===32?2:1),l=i.decode(s.subarray(c));switch(u){case"data":r.data=r.data?`${r.data}
-${l}`:l;break;case"event":r.event=l;break;case"id":t(r.id=l);break;case"retry":{let f=Number.parseInt(l,10);Number.isNaN(f)||e(r.retry=f);break}}}}}function Dn(t,e){let n=new Uint8Array(t.length+e.length);return n.set(t),n.set(e,t.length),n}function pt(){return{data:"",event:"",id:"",retry:void 0}}var Ln="text/event-stream",mt="last-event-id";function gt(t,e,{signal:n,headers:r,onopen:i,onmessage:o,onclose:s,onerror:a,openWhenHidden:u,fetch:c,retryInterval:l=1e3,retryScaler:f=2,retryMaxWaitMs:g=3e4,retryMaxCount:A=10,...v}){return new Promise((h,p)=>{let b=0,w={...r};w.accept||(w.accept=Ln);let I;function _(){I.abort(),document.hidden||M()}u||document.addEventListener("visibilitychange",_);let E=0;function T(){document.removeEventListener("visibilitychange",_),window.clearTimeout(E),I.abort()}n?.addEventListener("abort",()=>{T(),h()});let P=c??window.fetch,d=i??function(){};async function M(){I=new AbortController;try{let N=await P(e,{...v,headers:w,signal:I.signal});await d(N),await Cn(N.body,In(kn(C=>{C?w[mt]=C:delete w[mt]},C=>{l=C},o))),s?.(),T(),h()}catch(N){if(!I.signal.aborted)try{let C=a?.(N)??l;window.clearTimeout(E),E=window.setTimeout(M,C),l*=f,l=Math.min(l,g),b++,b>=A?(T(),p(y("SseMaxRetries",t,{retryMaxCount:A}))):console.error(`Datastar failed to reach ${v.method}: ${e.toString()} retry in ${C}ms`)}catch(C){T(),p(C)}}}M()})}var ee=`${L}-sse`,He=`${L}-settling`,z=`${L}-swapping`,_e="started",we="finished",ht="error";function q(t,e){document.addEventListener(ee,n=>{if(n.detail.type!==t)return;let{argsRaw:r}=n.detail;e(r)})}function Re(t,e){document.dispatchEvent(new CustomEvent(ee,{detail:{type:t,argsRaw:e}}))}var yt=t=>`${t}`.includes("text/event-stream"),W=async(t,e,n,r)=>{let{el:{id:i},el:o,signals:s}=t,{headers:a,contentType:u,includeLocal:c,selector:l,openWhenHidden:f,retryInterval:g,retryScaler:A,retryMaxWaitMs:v,retryMaxCount:h,abort:p}=Object.assign({headers:{},contentType:"json",includeLocal:!1,selector:null,openWhenHidden:!1,retryInterval:1e3,retryScaler:2,retryMaxWaitMs:3e4,retryMaxCount:10,abort:void 0},r),b=e.toLowerCase(),w=()=>{};try{if(Re(_e,{elId:i}),!n?.length)throw y("SseNoUrlProvided",t,{action:b});let I={};I[Be]=!0,u==="json"&&(I["Content-Type"]="application/json");let _=Object.assign({},I,a),E={method:e,headers:_,openWhenHidden:f,retryInterval:g,retryScaler:A,retryMaxWaitMs:v,retryMaxCount:h,signal:p,onopen:async d=>{if(d.status>=400){let M=d.status.toString();Re(ht,{status:M})}},onmessage:d=>{if(!d.event.startsWith(L))return;let M=d.event,N={},C=d.data.split(`
-`);for(let $ of C){let fe=$.indexOf(" "),Ue=$.slice(0,fe),de=N[Ue];de||(de=[],N[Ue]=de);let wn=$.slice(fe+1).trim();de.push(wn)}let F={};for(let[$,fe]of Object.entries(N))F[$]=fe.join(`
-`);Re(M,F)},onerror:d=>{if(yt(d))throw y("InvalidContentType",t,{url:n});d&&console.error(d.message)}},T=new URL(n,window.location.origin),P=new URLSearchParams(T.search);if(u==="json"){let d=s.JSON(!1,!c);e==="GET"?P.set(L,d):E.body=d}else if(u==="form"){let d=l?document.querySelector(l):o.closest("form");if(d===null)throw l?y("SseFormNotFound",t,{action:b,selector:l}):y("SseClosestFormNotFound",t,{action:b});if(o!==d){let N=C=>C.preventDefault();d.addEventListener("submit",N),w=()=>d.removeEventListener("submit",N)}if(!d.checkValidity()){d.reportValidity(),w();return}let M=new FormData(d);if(e==="GET"){let N=new URLSearchParams(M);for(let[C,F]of N)P.set(C,F)}else E.body=M}else throw y("SseInvalidContentType",t,{action:b,contentType:u});T.search=P.toString();try{await gt(t,T.toString(),E)}catch(d){if(!yt(d))throw y("SseFetchFailed",t,{method:e,url:n,error:d})}}finally{Re(we,{elId:i}),w()}};var vt={type:3,name:"delete",fn:async(t,e,n)=>W(t,"DELETE",e,{...n})};var bt={type:3,name:"get",fn:async(t,e,n)=>W(t,"GET",e,{...n})};var Et={type:3,name:"patch",fn:async(t,e,n)=>W(t,"PATCH",e,{...n})};var St={type:3,name:"post",fn:async(t,e,n)=>W(t,"POST",e,{...n})};var Tt={type:3,name:"put",fn:async(t,e,n)=>W(t,"PUT",e,{...n})};var At={type:1,name:"indicator",keyReq:3,valReq:3,onLoad:({value:t,signals:e,el:n,key:r})=>{let i=r||B(t),o=e.upsertIfMissing(i,!1),s=a=>{let{type:u,argsRaw:{elId:c}}=a.detail;if(c===n.id)switch(u){case _e:o.value=!0;break;case we:o.value=!1;break}};return document.addEventListener(ee,s),()=>{document.removeEventListener(ee,s)}}};var _t={type:2,name:k.ExecuteScript,onGlobalInit:async t=>{q(k.ExecuteScript,({autoRemove:e=`${Je}`,attributes:n=Ge,script:r})=>{let i=U(e);if(!r?.length)throw V("NoScriptProvided",t);let o=document.createElement("script");for(let s of n.split(`
-`)){let a=s.indexOf(" "),u=a?s.slice(0,a):s,c=a?s.slice(a):"";o.setAttribute(u.trim(),c.trim())}o.text=r,document.head.appendChild(o),i&&o.remove()})}};var le=document,te=!!le.startViewTransition;var ne="idiomorph",Pe=new WeakSet;function Pt(t,e,n={}){t instanceof Document&&(t=t.documentElement);let r;typeof e=="string"?r=qn(e):r=e;let i=Wn(r),o=Vn(t,i,n);return Mt(t,i,o)}function Mt(t,e,n){if(n.head.block){let r=t.querySelector("head"),i=e.querySelector("head");if(r&&i){let o=Ct(i,r,n);Promise.all(o).then(()=>{Mt(t,e,Object.assign(n,{head:{block:!1,ignore:!0}}))});return}}if(n.morphStyle==="innerHTML")return Nt(e,t,n),t.children;if(n.morphStyle==="outerHTML"||n.morphStyle==null){let r=Un(e,t,n);if(!r)throw x(ne,"NoBestMatchFound",{old:t,new:e});let i=r?.previousSibling,o=r?.nextSibling,s=Me(t,r,n);return r?$n(i,s,o):[]}throw x(ne,"InvalidMorphStyle",{style:n.morphStyle})}function Me(t,e,n){if(!(n.ignoreActive&&t===document.activeElement))if(e==null){if(n.callbacks.beforeNodeRemoved(t)===!1)return;t.remove(),n.callbacks.afterNodeRemoved(t);return}else{if(Ne(t,e))return n.callbacks.beforeNodeMorphed(t,e)===!1?void 0:(t instanceof HTMLHeadElement&&n.head.ignore||(e instanceof HTMLHeadElement&&t instanceof HTMLHeadElement&&n.head.style!==O.Morph?Ct(e,t,n):(On(e,t),Nt(e,t,n))),n.callbacks.afterNodeMorphed(t,e),t);if(n.callbacks.beforeNodeRemoved(t)===!1||n.callbacks.beforeNodeAdded(e)===!1)return;if(!t.parentElement)throw x(ne,"NoParentElementFound",{oldNode:t});return t.parentElement.replaceChild(e,t),n.callbacks.afterNodeAdded(e),n.callbacks.afterNodeRemoved(t),e}}function Nt(t,e,n){let r=t.firstChild,i=e.firstChild,o;for(;r;){if(o=r,r=o.nextSibling,i==null){if(n.callbacks.beforeNodeAdded(o)===!1)return;e.appendChild(o),n.callbacks.afterNodeAdded(o),X(n,o);continue}if(It(o,i,n)){Me(i,o,n),i=i.nextSibling,X(n,o);continue}let s=Fn(t,e,o,i,n);if(s){i=wt(i,s,n),Me(s,o,n),X(n,o);continue}let a=Hn(t,o,i,n);if(a){i=wt(i,a,n),Me(a,o,n),X(n,o);continue}if(n.callbacks.beforeNodeAdded(o)===!1)return;e.insertBefore(o,i),n.callbacks.afterNodeAdded(o),X(n,o)}for(;i!==null;){let s=i;i=i.nextSibling,kt(s,n)}}function On(t,e){let n=t.nodeType;if(n===1){for(let r of t.attributes)e.getAttribute(r.name)!==r.value&&e.setAttribute(r.name,r.value);for(let r of e.attributes)t.hasAttribute(r.name)||e.removeAttribute(r.name)}if((n===Node.COMMENT_NODE||n===Node.TEXT_NODE)&&e.nodeValue!==t.nodeValue&&(e.nodeValue=t.nodeValue),t instanceof HTMLInputElement&&e instanceof HTMLInputElement&&t.type!=="file")e.value=t.value||"",xe(t,e,"value"),xe(t,e,"checked"),xe(t,e,"disabled");else if(t instanceof HTMLOptionElement)xe(t,e,"selected");else if(t instanceof HTMLTextAreaElement&&e instanceof HTMLTextAreaElement){let r=t.value,i=e.value;r!==i&&(e.value=r),e.firstChild&&e.firstChild.nodeValue!==r&&(e.firstChild.nodeValue=r)}}function xe(t,e,n){let r=t.getAttribute(n),i=e.getAttribute(n);r!==i&&(r?e.setAttribute(n,r):e.removeAttribute(n))}function Ct(t,e,n){let r=[],i=[],o=[],s=[],a=n.head.style,u=new Map;for(let l of t.children)u.set(l.outerHTML,l);for(let l of e.children){let f=u.has(l.outerHTML),g=n.head.shouldReAppend(l),A=n.head.shouldPreserve(l);f||A?g?i.push(l):(u.delete(l.outerHTML),o.push(l)):a===O.Append?g&&(i.push(l),s.push(l)):n.head.shouldRemove(l)!==!1&&i.push(l)}s.push(...u.values());let c=[];for(let l of s){let f=document.createRange().createContextualFragment(l.outerHTML).firstChild;if(!f)throw x(ne,"NewElementCouldNotBeCreated",{newNode:l});if(n.callbacks.beforeNodeAdded(f)){if(f.hasAttribute("href")||f.hasAttribute("src")){let g,A=new Promise(v=>{g=v});f.addEventListener("load",()=>{g(void 0)}),c.push(A)}e.appendChild(f),n.callbacks.afterNodeAdded(f),r.push(f)}}for(let l of i)n.callbacks.beforeNodeRemoved(l)!==!1&&(e.removeChild(l),n.callbacks.afterNodeRemoved(l));return n.head.afterHeadMorphed(e,{added:r,kept:o,removed:i}),c}function G(){}function Vn(t,e,n){return{target:t,newContent:e,config:n,morphStyle:n.morphStyle,ignoreActive:n.ignoreActive,idMap:Kn(t,e),deadIds:new Set,callbacks:Object.assign({beforeNodeAdded:G,afterNodeAdded:G,beforeNodeMorphed:G,afterNodeMorphed:G,beforeNodeRemoved:G,afterNodeRemoved:G},n.callbacks),head:Object.assign({style:"merge",shouldPreserve:r=>r.getAttribute("im-preserve")==="true",shouldReAppend:r=>r.getAttribute("im-re-append")==="true",shouldRemove:G,afterHeadMorphed:G},n.head)}}function It(t,e,n){return!t||!e?!1:t.nodeType===e.nodeType&&t.tagName===e.tagName?t?.id?.length&&t.id===e.id?!0:ue(n,t,e)>0:!1}function Ne(t,e){return!t||!e?!1:t.nodeType===e.nodeType&&t.tagName===e.tagName}function wt(t,e,n){for(;t!==e;){let r=t;if(t=t?.nextSibling,!r)throw x(ne,"NoTemporaryNodeFound",{startInclusive:t,endExclusive:e});kt(r,n)}return X(n,e),e.nextSibling}function Fn(t,e,n,r,i){let o=ue(i,n,e),s=null;if(o>0){s=r;let a=0;for(;s!=null;){if(It(n,s,i))return s;if(a+=ue(i,s,t),a>o)return null;s=s.nextSibling}}return s}function Hn(t,e,n,r){let i=n,o=e.nextSibling,s=0;for(;i&&o;){if(ue(r,i,t)>0)return null;if(Ne(e,i))return i;if(Ne(o,i)&&(s++,o=o.nextSibling,s>=2))return null;i=i.nextSibling}return i}var Rt=new DOMParser;function qn(t){let e=t.replace(/