diff --git a/.gitignore b/.gitignore
index 17443a191..a7f6926a2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,8 @@ datastar_site
data
.task
.idea
+.DS_Store
node_modules
datastar-website
*_bin
+.DS_Store
\ No newline at end of file
diff --git a/.vscode/launch.json b/.vscode/launch.json
index f3d836887..d28343d28 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -24,7 +24,7 @@
"type": "go",
"request": "launch",
"mode": "auto",
- "program": "${workspaceFolder}/code/go/cmd/tsbuild/main.go",
+ "program": "${workspaceFolder}/code/go/cmd/build/main.go",
"cwd": "${workspaceFolder}"
}
]
diff --git a/.vscode/settings.json b/.vscode/settings.json
index f987b5cab..b14a7c6da 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -3,5 +3,6 @@
"go.coverOnSingleTestFile": true,
"go.coverOnSingleTest": true,
"editor.foldingStrategy": "indentation",
- "makefile.configureOnOpen": false
+ "makefile.configureOnOpen": false,
+ "editor.formatOnSave": true
}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fd94ba70c..731e49d3b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,45 +1,30 @@
-# Release Notes for Datastar
+# WIP Release Notes for Datastar
-## 0.20.1 - 2024-11-25
+## 0.21.0 - Unreleased
-VersionClientByteSize = 35970->35789
-VersionClientByteSizeGzip = 12647->12568
+We’ve overhauled Datastar in v0.21.0, doubling down on making nestable signals declarative. To that end, we’ve removed special characters, made the API more explicit and consistent, and fixed some restrictions to nested signals that we discovered. Signal values are now accessed in expressions using the syntax `signalName.value`, actions no longer have a prefix, and attribute keys support nested signals using dot-delimited paths.
### Added
-- SDKs
- - .NET
- - Initial SDK release! #231
- - PHP
- - Allow KV pairs
- - Author
-- DevOps
- - added `make test` & `make clean` to development Dockerfile
+
+- Added the ability to merge one-off signals using the syntax `data-signals-foo="value"`.
+- Added the ability to use dot-delimited paths to denote nested signals in applicable attribute keys (`data-signals-foo.bar="value"`).
+- Added the ability to use multiple attributes using the syntax `data-attributes="{attrName1: value1, attrName2: value2}"`.
+- Added the ability to use a single classes using the syntax `data-class-hidden="foo.value"`.
+- Added the ability to use a key instead of a value to denote a signal name in the `data-bind`, `data-indicator` and `data-ref` attributes (`data-bind-foo`, `data-indicator-foo`, `data-ref-foo`).
+- Added error codes and links to descriptions in the console for every error thrown.
### Changed
-- Client
- - Function expression optimizations #234
- - Truthy Attributes were not getting set correctly #234
- - Fix invalid headers sent via SSE #241
- - Added hooks so NPM will package the correct files
-- SDKs
- - updated README for clarity around contributing
- - Go
- - Fix inverted logic for ViewTransitions #238
- - PHP
- - tagged SDK 1.0.0-alpha.1
- - fixed retry duration
- - general cleanup
-- Website
- - Bundler getting create valid zip for Windows #228
- - General site improvements
- - Actions section in getting started
- - Fixed broken links for SDKs and CDN #225
- - Try to fix Safari bug around caching SSE connections #239
-- Devops
- - fix `make dev` to work cross-platform
- - moved development Dockerfile from Alpine to Ubuntu
-
-
-### Removed
-- DevOps
- - Removed broken Github Actions
+
+- Signals no longer have the `$` prefix and must be acessed using a `.value` suffix (`signalName.value`).
+- Action plugins no longer have the `$` prefix.
+- Renamed the `data-store` attribute to `data-signals`.
+- Renamed the `data-bind` attribute to `data-attributes`.
+- Renamed the `data-model` attribute to `data-bind`.
+- Changed the `data-*` attribute modifier delimiter from `.` to `:` (`data-on-keydown:debounce_100ms:throttle_lead="value"`).
+- The the `get()`, `post()`, `put()`, and `delete()` plugins have been replaced by a single `sse()` plugin that accepts the method as an option (`sse(url, {method="get"})`).
+- The `setAll()` and `toggleAll` plugins now accept a dot-delimited path format, instead of a regular expression.
+
+### Fixed
+
+- Fixed headers not merging correctly.
+- Fixed new lines in the SDK protocol for paths.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 5f199f009..774cc2155 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -12,9 +12,9 @@ Anything outside of this scope may not be accepted. If you have a need for a fea
Before submitting bug reports and feature requests, please search the [open issues](https://github.com/starfederation/datastar/issues) and the _#help_ channel in the [Discord server](https://discord.gg/bnRNgZjgPh) to see if it has already been addressed. When submitting a [new issue](https://github.com/starfederation/datastar/issues/new), please use a descriptive title and include a clear description and as much relevant information as possible.
-## Documentation
+## Documentation
-Datastar’s documentation is under active development. All the markdown files live in [this folder](https://github.com/starfederation/datastar/tree/develop/code/go/site/static/md). Improvements to them can be submitted via pull requests.
+Datastar’s documentation is under active development. All the markdown files live in [this folder](https://github.com/starfederation/datastar/tree/develop/site/static/md). Improvements to them can be submitted via pull requests.
## Pull Requests
diff --git a/README.md b/README.md
index 2b42a3b8d..2ca5d2027 100644
--- a/README.md
+++ b/README.md
@@ -4,20 +4,29 @@


-
+
# Datastar
-### A real-time hypermedia framework.
+### The hypermedia framework.
-Datastar helps you build real-time web applications with the simplicity of server-side rendering and the power of a full-stack SPA framework.
+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 script tag to your HTML.
+
+```html
+
+```
+
+Then start adding frontend reactivity using declarative `data-*` attributes.
+Datastar helps you build reactive web applications with the simplicity of server-side rendering and the power of a full-stack SPA framework.
Here’s what frontend reactivity looks like using Datastar:
```html
-
-
-
+
+
+
```
Visit the [Datastar Website »](https://data-star.dev/)
diff --git a/Taskfile.yml b/Taskfile.yml
index 92e5e0e8e..a216d58e4 100644
--- a/Taskfile.yml
+++ b/Taskfile.yml
@@ -14,17 +14,17 @@ tasks:
cmds:
- go install github.com/go-task/task/v3/cmd/task@latest
- go install github.com/a-h/templ/cmd/templ@latest
- - cmd: test -f code/go/site/tailwindcli || wget -O code/go/site/tailwindcli https://github.com/dobicinaitis/tailwind-cli-extra/releases/download/v1.7.21/tailwindcss-extra-linux-x64
+ - cmd: test -f site/tailwindcli || wget -O site/tailwindcli https://github.com/dobicinaitis/tailwind-cli-extra/releases/download/v1.7.21/tailwindcss-extra-linux-x64
platforms: [linux/amd64]
- - cmd: test -f code/go/site/tailwindcli || wget -O code/go/site/tailwindcli https://github.com/dobicinaitis/tailwind-cli-extra/releases/download/v1.7.21/tailwindcss-extra-linux-arm64
+ - cmd: test -f site/tailwindcli || wget -O site/tailwindcli https://github.com/dobicinaitis/tailwind-cli-extra/releases/download/v1.7.21/tailwindcss-extra-linux-arm64
platforms: [linux/arm64]
- - cmd: test -f code/go/site/tailwindcli || wget -O code/go/site/tailwindcli https://github.com/dobicinaitis/tailwind-cli-extra/releases/download/v1.7.21/tailwindcss-extra-macos-arm64
+ - cmd: test -f site/tailwindcli || wget -O site/tailwindcli https://github.com/dobicinaitis/tailwind-cli-extra/releases/download/v1.7.21/tailwindcss-extra-macos-arm64
platforms: [darwin/arm64]
- - cmd: test -f code/go/site/tailwindcli || wget -O code/go/site/tailwindcli https://github.com/dobicinaitis/tailwind-cli-extra/releases/download/v1.7.21/tailwindcss-extra-macos-x64
+ - cmd: test -f site/tailwindcli || wget -O site/tailwindcli https://github.com/dobicinaitis/tailwind-cli-extra/releases/download/v1.7.21/tailwindcss-extra-macos-x64
platforms: [darwin/amd64]
- - cmd: test -f code/go/site/tailwindcli || wget -O code/go/site/tailwindcli https://github.com/dobicinaitis/tailwind-cli-extra/releases/download/v1.7.21/tailwindcss-extra-windows-x64.exe
+ - cmd: test -f site/tailwindcli || wget -O site/tailwindcli https://github.com/dobicinaitis/tailwind-cli-extra/releases/download/v1.7.21/tailwindcss-extra-windows-x64.exe
platforms: [windows]
- - chmod +x code/go/site/tailwindcli
+ - chmod +x site/tailwindcli
- go install github.com/valyala/quicktemplate/qtc@latest
version:
@@ -39,7 +39,7 @@ tasks:
cmds:
- qtc
- tsbuild:
+ build:
deps:
- qtc
sources:
@@ -50,20 +50,20 @@ tasks:
generates:
- "bundles/**/*"
cmds:
- - go run code/go/cmd/tsbuild/main.go
- - cp -r bundles/* code/go/site/static/js/
- - mkdir -p code/ts/library/dist/
- - cp -r bundles/* code/ts/library/dist/
- - mkdir -p code/go/site/static/librarySource
- - rm -rf code/go/site/static/librarySource/*
- - cp -r code/ts/library/src/* code/go/site/static/librarySource/
+ - go run build/cmd/build/main.go
+ - cp -r bundles/* site/static/js/
+ - mkdir -p library/dist/
+ - cp -r bundles/* library/dist/
+ - mkdir -p site/static/librarySource
+ - rm -rf site/static/librarySource/*
+ - cp -r library/src/* site/static/librarySource/
libpub:
dir: code/ts/library
requires:
vars: [VERSION]
deps:
- - tsbuild
+ - build
cmds:
- git push origin
- git tag v{{.VERSION}}
@@ -77,7 +77,7 @@ tasks:
- task: deploy
css:
- dir: code/go/site
+ dir: site
sources:
- "**/*.templ"
- "**/*.md"
@@ -105,15 +105,15 @@ tasks:
support:
sources:
- - code/go/**/*.templ
- - code/go/**/*.go
- - code/go/**/*.md
- - code/go/site/static/**/*
+ - "**/*.templ"
+ - "**/*.go"
+ - "**/*.md"
+ - site/static/**/*
generates:
- ./datastar-website
deps:
- kill
- - tsbuild
+ - build
- templ
- css
@@ -124,7 +124,7 @@ tasks:
- support
cmds:
- go mod tidy
- - go build -o ./datastar-website code/go/cmd/site/main.go
+ - go build -o ./datastar-website "site/cmd/site/main.go"
deploy:
method: none
@@ -134,7 +134,7 @@ tasks:
- fly deploy --local-only
test:
- dir: code/go/site/smoketests
+ dir: site/smoketests
deps:
- support
cmds:
diff --git a/VERSION b/VERSION
index 9d2632160..2c835f025 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-0.20.1
\ No newline at end of file
+0.21.0-beta1
\ No newline at end of file
diff --git a/code/go/.gitignore b/build/.gitignore
similarity index 100%
rename from code/go/.gitignore
rename to build/.gitignore
diff --git a/code/go/cmd/tsbuild/main.go b/build/cmd/build/main.go
similarity index 70%
rename from code/go/cmd/tsbuild/main.go
rename to build/cmd/build/main.go
index 994e2d42d..ed79cdec3 100644
--- a/code/go/cmd/tsbuild/main.go
+++ b/build/cmd/build/main.go
@@ -4,7 +4,7 @@ import (
"log"
"time"
- "github.com/starfederation/datastar/code/go/tsbuild"
+ build "github.com/starfederation/datastar/build"
)
func main() {
@@ -14,7 +14,7 @@ func main() {
log.Printf("Datastar built in %s", time.Since(start))
}()
- if err := tsbuild.Build(); err != nil {
+ if err := build.Build(); err != nil {
log.Fatal(err)
}
diff --git a/code/go/tsbuild/consts.go b/build/consts.go
similarity index 97%
rename from code/go/tsbuild/consts.go
rename to build/consts.go
index b3477a7d9..c9d7b00ac 100644
--- a/code/go/tsbuild/consts.go
+++ b/build/consts.go
@@ -1,4 +1,4 @@
-package tsbuild
+package build
import (
"time"
@@ -84,7 +84,7 @@ var Consts = &ConstTemplateData{
},
{
Name: toolbelt.ToCasedString("mergeSignalsOnlyIfMissing"),
- Description: "Should a given set of signals merge if they are missing from the store?",
+ Description: "Should a given set of signals merge if they are missing?",
Value: false,
},
{
@@ -187,7 +187,7 @@ var Consts = &ConstTemplateData{
},
{
Name: toolbelt.ToCasedString("MergeSignals"),
- Description: "An event for merging signals into the store.",
+ Description: "An event for merging signals.",
Value: "datastar-merge-signals",
},
{
@@ -197,7 +197,7 @@ var Consts = &ConstTemplateData{
},
{
Name: toolbelt.ToCasedString("RemoveSignals"),
- Description: "An event for removing signals from the store.",
+ Description: "An event for removing signals.",
Value: "datastar-remove-signals",
},
{
diff --git a/code/go/tsbuild/consts_datastar_client.qtpl b/build/consts_datastar_client.qtpl
similarity index 100%
rename from code/go/tsbuild/consts_datastar_client.qtpl
rename to build/consts_datastar_client.qtpl
diff --git a/code/go/tsbuild/consts_datastar_readme.qtpl b/build/consts_datastar_readme.qtpl
similarity index 60%
rename from code/go/tsbuild/consts_datastar_readme.qtpl
rename to build/consts_datastar_readme.qtpl
index 58b02e5fe..90ca21d4d 100644
--- a/code/go/tsbuild/consts_datastar_readme.qtpl
+++ b/build/consts_datastar_readme.qtpl
@@ -6,20 +6,29 @@


-
+
# Datastar
-### A real-time hypermedia framework.
+### The hypermedia framework.
-Datastar helps you build real-time web applications with the simplicity of server-side rendering and the power of a full-stack SPA framework.
+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 script tag to your HTML.
+
+```html
+
+```
+
+Then start adding frontend reactivity using declarative `data-*` attributes.
+Datastar helps you build reactive web applications with the simplicity of server-side rendering and the power of a full-stack SPA framework.
Here’s what frontend reactivity looks like using Datastar:
```html
-
-
-
+
+
+
```
Visit the [Datastar Website »](https://data-star.dev/)
diff --git a/code/go/tsbuild/consts_dotnet.qtpl b/build/consts_dotnet.qtpl
similarity index 100%
rename from code/go/tsbuild/consts_dotnet.qtpl
rename to build/consts_dotnet.qtpl
diff --git a/code/go/tsbuild/consts_go.qtpl b/build/consts_go.qtpl
similarity index 100%
rename from code/go/tsbuild/consts_go.qtpl
rename to build/consts_go.qtpl
diff --git a/code/go/tsbuild/consts_php.qtpl b/build/consts_php.qtpl
similarity index 100%
rename from code/go/tsbuild/consts_php.qtpl
rename to build/consts_php.qtpl
diff --git a/code/go/tsbuild/run.go b/build/run.go
similarity index 80%
rename from code/go/tsbuild/run.go
rename to build/run.go
index a8e1c4b79..79839b363 100644
--- a/code/go/tsbuild/run.go
+++ b/build/run.go
@@ -1,4 +1,4 @@
-package tsbuild
+package build
import (
"compress/gzip"
@@ -42,7 +42,7 @@ func extractVersion() (string, error) {
version := strings.TrimSpace(string(versionBytes))
// Write out the version to the version file.
- versionPath := "code/ts/library/src/engine/version.ts"
+ versionPath := "library/src/engine/version.ts"
versionContents := fmt.Sprintf("export const VERSION = '%s';\n", version)
if err := os.WriteFile(versionPath, []byte(versionContents), 0644); err != nil {
return "", fmt.Errorf("error writing version file: %w", err)
@@ -60,8 +60,8 @@ func createBundles() error {
result := api.Build(api.BuildOptions{
EntryPoints: []string{
- "code/ts/library/src/bundles/datastar-core.ts",
- "code/ts/library/src/bundles/datastar.ts",
+ "library/src/bundles/datastar-core.ts",
+ "library/src/bundles/datastar.ts",
},
Outdir: outDir,
Bundle: true,
@@ -127,15 +127,15 @@ func writeOutConsts(version string) error {
})
templates := map[string]func(data *ConstTemplateData) string{
- "README.md": datastarREADME,
- "code/ts/library/README.md": datastarREADME,
- "code/ts/library/src/engine/consts.ts": datastarClientConsts,
- "code/ts/library/package.json": datastarClientPackageJSON,
- "code/go/sdk/consts.go": goConsts,
- "code/dotnet/sdk/src/Consts.fs": dotnetConsts,
- "code/php/sdk/src/Consts.php": phpConsts,
- "code/php/sdk/src/enums/EventType.php": phpEventType,
- "code/php/sdk/src/enums/FragmentMergeMode.php": phpFragmentMergeMode,
+ "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,
}
for path, tmplFn := range templates {
diff --git a/bundles/datastar-core.js b/bundles/datastar-core.js
index 7d7be46ff..3e9daea70 100644
--- a/bundles/datastar-core.js
+++ b/bundles/datastar-core.js
@@ -1,11 +1,4 @@
-"use strict";(()=>{var te={pluginType:"attribute",name:"star",onLoad:()=>{alert("YOU ARE PROBABLY OVERCOMPLICATING IT")}};var ne={pluginType:"attribute",name:"computed",mustNotEmptyKey:!0,onLoad:t=>{let e=t.store();return e[t.key]=t.reactivity.computed(()=>t.expressionFn(t)),()=>{let r=t.store();delete r[t.key]}}};function re(t,e,r){let n={};if(!r)Object.assign(n,e);else for(let s in e){let o=t[s]?.value;o==null&&(n[s]=e[s])}return n}var se={pluginType:"attribute",name:"store",removeNewLines:!0,preprocessors:{pre:[{pluginType:"preprocessor",name:"store",regexp:/(?.+)/g,replacer:t=>{let{whole:e}=t;return`Object.assign({...ctx.store()}, ${e})`}}]},allowedModifiers:new Set(["ifmissing"]),onLoad:t=>{let e=t.expressionFn(t),r=re(t.store(),e,t.modifiers.has("ifmissing"));t.mergeSignals(r),delete t.el.dataset[t.rawKey]}};var oe="[a-zA-Z_$]+",Te=oe+"[0-9a-zA-Z_$.]*";function L(t,e,r,n=!0){let s=n?Te:oe;return new RegExp(`(?${t}(?<${e}>${s})${r})`,"g")}var ie={name:"action",pluginType:"preprocessor",regexp:L("\\$","action","(?\\((?.*)\\))",!1),replacer:({action:t,args:e})=>{let r=["ctx"];e&&r.push(...e.split(",").map(s=>s.trim()));let n=r.join(",");return`ctx.actions.${t}.method(${n})`}};var ae={name:"signal",pluginType:"preprocessor",regexp:L("\\$","signal","(?\\([^\\)]*\\))?"),replacer:t=>{let{signal:e,method:r}=t,n="ctx.store()";if(!r?.length)return`${n}.${e}.value`;let s=e.split("."),o=s.pop(),a=s.join(".");return`${n}.${a}.value.${o}${r}`}};var k="datastar";var Ee={Morph:"morph",Inner:"inner",Outer:"outer",Prepend:"prepend",Append:"append",Before:"before",After:"after",UpsertAttributes:"upsertAttributes"},Be=Ee.Morph;var v=t=>{let e=new Error;return e.name=`${k}${t}`,e},d=v(400),w=v(409),B=v(404),x=v(403),ue=v(405),Je=v(503);function le(t){if(t.id)return t.id;let e=0,r=s=>(e=(e<<5)-e+s,e&e),n=s=>s.split("").forEach(o=>r(o.charCodeAt(0)));for(;t.parentNode;){if(t.id){n(`${t.id}`);break}else if(t===t.ownerDocument.documentElement)n(t.tagName);else{for(let s=1,o=t;o.previousElementSibling;o=o.previousElementSibling,s++)r(s);t=t.parentNode}t=t.parentNode}return k+e}var Re=Symbol.for("preact-signals"),g=1,T=2,O=4,R=8,C=16,E=32;function M(){D++}function I(){if(D>1){D--;return}let t,e=!1;for(;A!==void 0;){let r=A;for(A=void 0,G++;r!==void 0;){let n=r._nextBatchedEffect;if(r._nextBatchedEffect=void 0,r._flags&=~T,!(r._flags&R)&&pe(r))try{r._callback()}catch(s){e||(t=s,e=!0)}r=n}}if(G=0,D--,e)throw t}function ce(t){if(D>0)return t();M();try{return t()}finally{I()}}var i;var A,D=0,G=0,j=0;function fe(t){if(i===void 0)return;let e=t._node;if(e===void 0||e._target!==i)return e={_version:0,_source:t,_prevSource:i._sources,_nextSource:void 0,_target:i,_prevTarget:void 0,_nextTarget:void 0,_rollbackNode:e},i._sources!==void 0&&(i._sources._nextSource=e),i._sources=e,t._node=e,i._flags&E&&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=i._sources,e._nextSource=void 0,i._sources._nextSource=e,i._sources=e),e}function c(t){this._value=t,this._version=0,this._node=void 0,this._targets=void 0}c.prototype.brand=Re;c.prototype._refresh=function(){return!0};c.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)};c.prototype._unsubscribe=function(t){if(this._targets!==void 0){let e=t._prevTarget,r=t._nextTarget;e!==void 0&&(e._nextTarget=r,t._prevTarget=void 0),r!==void 0&&(r._prevTarget=e,t._nextTarget=void 0),t===this._targets&&(this._targets=r)}};c.prototype.subscribe=function(t){return J(()=>{let e=this.value,r=i;i=void 0;try{t(e)}finally{i=r}})};c.prototype.valueOf=function(){return this.value};c.prototype.toString=function(){return this.value+""};c.prototype.toJSON=function(){return this.value};c.prototype.peek=function(){let t=i;i=void 0;try{return this.value}finally{i=t}};Object.defineProperty(c.prototype,"value",{get(){let t=fe(this);return t!==void 0&&(t._version=this._version),this._value},set(t){if(t!==this._value){if(G>100)throw d;this._value=t,this._version++,j++,M();try{for(let e=this._targets;e!==void 0;e=e._nextTarget)e._target._notify()}finally{I()}}}});function F(t){return new c(t)}function pe(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 de(t){for(let e=t._sources;e!==void 0;e=e._nextSource){let r=e._source._node;if(r!==void 0&&(e._rollbackNode=r),e._source._node=e,e._version=-1,e._nextSource===void 0){t._sources=e;break}}}function ge(t){let e=t._sources,r;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)):r=e,e._source._node=e._rollbackNode,e._rollbackNode!==void 0&&(e._rollbackNode=void 0),e=n}t._sources=r}function b(t){c.call(this,void 0),this._fn=t,this._sources=void 0,this._globalVersion=j-1,this._flags=O}b.prototype=new c;b.prototype._refresh=function(){if(this._flags&=~T,this._flags&g)return!1;if((this._flags&(O|E))===E||(this._flags&=~O,this._globalVersion===j))return!0;if(this._globalVersion=j,this._flags|=g,this._version>0&&!pe(this))return this._flags&=~g,!0;let t=i;try{de(this),i=this;let e=this._fn();(this._flags&C||this._value!==e||this._version===0)&&(this._value=e,this._flags&=~C,this._version++)}catch(e){this._value=e,this._flags|=C,this._version++}return i=t,ge(this),this._flags&=~g,!0};b.prototype._subscribe=function(t){if(this._targets===void 0){this._flags|=O|E;for(let e=this._sources;e!==void 0;e=e._nextSource)e._source._subscribe(e)}c.prototype._subscribe.call(this,t)};b.prototype._unsubscribe=function(t){if(this._targets!==void 0&&(c.prototype._unsubscribe.call(this,t),this._targets===void 0)){this._flags&=~E;for(let e=this._sources;e!==void 0;e=e._nextSource)e._source._unsubscribe(e)}};b.prototype._notify=function(){if(!(this._flags&T)){this._flags|=O|T;for(let t=this._targets;t!==void 0;t=t._nextTarget)t._target._notify()}};Object.defineProperty(b.prototype,"value",{get(){if(this._flags&g)throw d;let t=fe(this);if(this._refresh(),t!==void 0&&(t._version=this._version),this._flags&C)throw this._value;return this._value}});function he(t){return new b(t)}function _e(t){let e=t._cleanup;if(t._cleanup=void 0,typeof e=="function"){M();let r=i;i=void 0;try{e()}catch(n){throw t._flags&=~g,t._flags|=R,H(t),n}finally{i=r,I()}}}function H(t){for(let e=t._sources;e!==void 0;e=e._nextSource)e._source._unsubscribe(e);t._fn=void 0,t._sources=void 0,_e(t)}function we(t){if(i!==this)throw d;ge(this),i=t,this._flags&=~g,this._flags&R&&H(this),I()}function P(t){this._fn=t,this._cleanup=void 0,this._sources=void 0,this._nextBatchedEffect=void 0,this._flags=E}P.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()}};P.prototype._start=function(){if(this._flags&g)throw d;this._flags|=g,this._flags&=~R,_e(this),de(this),M();let t=i;return i=this,we.bind(this,t)};P.prototype._notify=function(){this._flags&T||(this._flags|=T,this._nextBatchedEffect=A,A=this)};P.prototype._dispose=function(){this._flags|=R,this._flags&g||H(this)};function J(t){let e=new P(t);try{e._callback()}catch(r){throw e._dispose(),r}return e._dispose.bind(e)}var $=class{get value(){return K(this)}set value(e){ce(()=>Ae(this,e))}peek(){return K(this,{peek:!0})}},N=t=>Object.assign(new $,Object.entries(t).reduce((e,[r,n])=>{if(["value","peek"].some(s=>s===r))throw x;return typeof n!="object"||n===null||Array.isArray(n)?e[r]=F(n):e[r]=N(n),e},{})),Ae=(t,e)=>Object.keys(e).forEach(r=>t[r].value=e[r]),K=(t,{peek:e=!1}={})=>Object.entries(t).reduce((r,[n,s])=>(s instanceof c?r[n]=e?s.peek():s.value:s instanceof $&&(r[n]=K(s,{peek:e})),r),{});function W(t,e){if(typeof e!="object"||Array.isArray(e)||!e)return JSON.parse(JSON.stringify(e));if(typeof e=="object"&&e.toJSON!==void 0&&typeof e.toJSON=="function")return e.toJSON();let r=t;return typeof t!="object"&&(r={...e}),Object.keys(e).forEach(n=>{r.hasOwnProperty(n)||(r[n]=e[n]),e[n]===null?delete r[n]:r[n]=W(r[n],e[n])}),r}var me="0.20.1";var De=t=>t.pluginType==="preprocessor",Oe=t=>t.pluginType==="watcher",Pe=t=>t.pluginType==="attribute",Ne=t=>t.pluginType==="action",V=class{constructor(){this.plugins=[];this.store=N({});this.preprocessors=new Array;this.actions={};this.watchers=new Array;this.refs={};this.reactivity={signal:F,computed:he,effect:J};this.removals=new Map;this.mergeRemovals=new Array;this.lastMarshalledStore=""}get version(){return me}load(...e){let r=new Set(this.plugins);e.forEach(n=>{if(n.requiredPlugins){for(let o of n.requiredPlugins)if(!r.has(o))throw x}let s;if(De(n)){if(this.preprocessors.includes(n))throw w;this.preprocessors.push(n)}else if(Oe(n)){if(this.watchers.includes(n))throw w;this.watchers.push(n),s=n.onGlobalInit}else if(Ne(n)){if(this.actions[n.name])throw w;this.actions[n.name]=n}else if(Pe(n)){if(this.plugins.includes(n))throw w;this.plugins.push(n),s=n.onGlobalInit}else throw B;s&&s({store:()=>this.store,upsertSignal:this.upsertSignal.bind(this),mergeSignals:this.mergeSignals.bind(this),removeSignals:this.removeSignals.bind(this),actions:this.actions,reactivity:this.reactivity,applyPlugins:this.applyPlugins.bind(this),cleanup:this.cleanup.bind(this)}),r.add(n)}),this.applyPlugins(document.body)}cleanup(e){let r=this.removals.get(e);if(r){for(let n of r.set)n();this.removals.delete(e)}}mergeSignals(e){this.mergeRemovals.forEach(s=>s()),this.mergeRemovals=this.mergeRemovals.slice(0);let r=W(this.store.value,e);this.store=N(r),JSON.stringify(this.store.value),this.lastMarshalledStore}removeSignals(...e){let r={...this.store.value},n=!1;for(let s of e){let o=s.split("."),a=o[0],f=r;for(let l=1;l{this.walkDownDOM(e,o=>{s||this.cleanup(o);for(let a in o.dataset){let f=`${o.dataset[a]}`||"",l=f;if(!a.startsWith(n.name))continue;if(o.id.length||(o.id=le(o)),r.clear(),n.allowedTagRegexps){let u=o.tagName.toLowerCase();if(![...n.allowedTagRegexps].some(h=>u.match(h)))throw x}let m=a.slice(n.name.length),[y,...be]=m.split(".");if(n.mustHaveEmptyKey&&y.length>0)throw d;if(n.mustNotEmptyKey&&y.length===0)throw d;y.length&&(y=y[0].toLowerCase()+y.slice(1));let Y=be.map(u=>{let[S,...h]=u.split("_");return{label:S,args:h}});if(n.allowedModifiers){for(let u of Y)if(!n.allowedModifiers.has(u.label))throw x}let q=new Map;for(let u of Y)q.set(u.label,u.args);if(n.mustHaveEmptyExpression&&l.length)throw d;if(n.mustNotEmptyExpression&&!l.length)throw d;let z=/;|\n/;n.removeNewLines&&(l=l.split(`
-`).map(u=>u.trim()).join(" "));let ve=[...n.preprocessors?.pre||[],...this.preprocessors,...n.preprocessors?.post||[]];for(let u of ve){if(r.has(u))continue;r.add(u);let S=l.split(z),h=[];S.forEach(p=>{let _=p,Z=[..._.matchAll(u.regexp)];if(Z.length)for(let Q of Z){if(!Q.groups)continue;let{groups:ee}=Q,{whole:xe}=ee;_=_.replace(xe,u.replacer(ee))}h.push(_)}),l=h.join("; ")}let U={store:()=>this.store,mergeSignals:this.mergeSignals.bind(this),upsertSignal:this.upsertSignal.bind(this),removeSignals:this.removeSignals.bind(this),applyPlugins:this.applyPlugins.bind(this),cleanup:this.cleanup.bind(this),walkSignals:this.walkSignals.bind(this),actions:this.actions,reactivity:this.reactivity,el:o,rawKey:a,key:y,rawExpression:f,expression:l,expressionFn:()=>{throw ue},modifiers:q};if(!n.bypassExpressionFunctionCreation?.(U)&&!n.mustHaveEmptyExpression&&l.length){let u=l.split(z).map(p=>p.trim()).filter(p=>p.length);u[u.length-1]=`return ${u[u.length-1]}`;let S=u.map(p=>` ${p}`).join(`;
-`),h=`try{${S}}catch(e){console.error(\`Error evaluating Datastar expression:
-${S.replaceAll("`","\\`")}
-
-Error: \${e.message}
-
-Check if the expression is valid before raising an issue.\`.trim());debugger}`;try{let p=n.argumentNames||[],_=new Function("ctx",...p,h);U.expressionFn=_}catch(p){let _=new Error(`${p}
-with
-${h}`);console.error(_);debugger}}let X=n.onLoad(U);X&&(this.removals.has(o)||this.removals.set(o,{id:o.id,set:new Set}),this.removals.get(o).set.add(X))}})})}walkSignalsStore(e,r){let n=Object.keys(e);for(let s=0;s0;if(f){r(o,a);continue}l&&this.walkSignalsStore(a,r)}}walkSignals(e){this.walkSignalsStore(this.store,e)}walkDownDOM(e,r,n=0){if(!e||!(e instanceof HTMLElement||e instanceof SVGElement))return null;for(r(e),n=0,e=e.firstElementChild;e;)this.walkDownDOM(e,r,n++),e=e.nextElementSibling}};var ye=new V;ye.load(ie,ae,se,ne,te);var Se=ye;Se.load();})();
+"use strict";(()=>{var _e="computed",j={type:1,name:_e,keyReq:1,valReq:1,removeOnLoad:!0,onLoad:({key:t,signals:e,genRX:n})=>{let s=n();e.setComputed(t,s)}};var U=t=>t.replace(/(?:^\w|[A-Z]|\b\w)/g,function(e,n){return n==0?e.toLowerCase():e.toUpperCase()}).replace(/\s+/g,""),W=t=>new Function(`return Object.assign({}, ${t})`)();var J={type:1,name:"signals",valReq:1,removeOnLoad:!0,onLoad:t=>{let{key:e,genRX:n,signals:s}=t;if(e!="")s.setValue(e,n()());else{let r=W(t.value);t.value=JSON.stringify(r),s.merge(n()())}}};var z={type:1,name:"star",keyReq:2,valReq:2,onLoad:()=>{alert("YOU ARE PROBABLY OVERCOMPLICATING IT")}};var K={name:"signalValue",type:0,fn:t=>{let e=/(?[\w0-9.]*)((\.value))/gm;return t.replaceAll(e,"ctx.signals.signal('$1').value")}};var H="datastar";var X="0.21.0-beta1";var me={Morph:"morph",Inner:"inner",Outer:"outer",Prepend:"prepend",Append:"append",Before:"before",After:"after",UpsertAttributes:"upsertAttributes"},Le=me.Morph;function Y(t){if(t.id)return t.id;let e=0,n=r=>(e=(e<<5)-e+r,e&e),s=r=>r.split("").forEach(i=>n(i.charCodeAt(0)));for(;t.parentNode;){if(t.id){s(`${t.id}`);break}else if(t===t.ownerDocument.documentElement)s(t.tagName);else{for(let r=1,i=t;i.previousElementSibling;i=i.previousElementSibling,r++)n(r);t=t.parentNode}t=t.parentNode}return H+e}var ve="http://localhost:8080/errors";var u=(t,e)=>{let n=new Error;n.name=`error ${t}`;let s=`${ve}/${t}?${new URLSearchParams(e)}`;return n.message=`for more info see ${s}`,n};var ye=Symbol.for("preact-signals"),g=1,S=2,N=4,b=8,M=16,x=32;function B(){O++}function G(){if(O>1){O--;return}let t,e=!1;for(;T!==void 0;){let n=T;for(T=void 0,L++;n!==void 0;){let s=n._nextBatchedEffect;if(n._nextBatchedEffect=void 0,n._flags&=~S,!(n._flags&b)&&Q(n))try{n._callback()}catch(r){e||(t=r,e=!0)}n=s}}if(L=0,O--,e)throw u("BatchError, error")}var a;var T,O=0,L=0,C=0;function Z(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&x&&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 f(t){this._value=t,this._version=0,this._node=void 0,this._targets=void 0}f.prototype.brand=ye;f.prototype._refresh=function(){return!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,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)}};f.prototype.subscribe=function(t){return P(()=>{let e=this.value,n=a;a=void 0;try{t(e)}finally{a=n}})};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=a;a=void 0;try{return this.value}finally{a=t}};Object.defineProperty(f.prototype,"value",{get(){let t=Z(this);return t!==void 0&&(t._version=this._version),this._value},set(t){if(t!==this._value){if(L>100)throw u("SignalCycleDetected");this._value=t,this._version++,C++,B();try{for(let e=this._targets;e!==void 0;e=e._nextTarget)e._target._notify()}finally{G()}}}});function Q(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 ee(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 te(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 y(t){f.call(this,void 0),this._fn=t,this._sources=void 0,this._globalVersion=C-1,this._flags=N}y.prototype=new f;y.prototype._refresh=function(){if(this._flags&=~S,this._flags&g)return!1;if((this._flags&(N|x))===x||(this._flags&=~N,this._globalVersion===C))return!0;if(this._globalVersion=C,this._flags|=g,this._version>0&&!Q(this))return this._flags&=~g,!0;let t=a;try{ee(this),a=this;let e=this._fn();(this._flags&M||this._value!==e||this._version===0)&&(this._value=e,this._flags&=~M,this._version++)}catch(e){this._value=e,this._flags|=M,this._version++}return a=t,te(this),this._flags&=~g,!0};y.prototype._subscribe=function(t){if(this._targets===void 0){this._flags|=N|x;for(let e=this._sources;e!==void 0;e=e._nextSource)e._source._subscribe(e)}f.prototype._subscribe.call(this,t)};y.prototype._unsubscribe=function(t){if(this._targets!==void 0&&(f.prototype._unsubscribe.call(this,t),this._targets===void 0)){this._flags&=~x;for(let e=this._sources;e!==void 0;e=e._nextSource)e._source._unsubscribe(e)}};y.prototype._notify=function(){if(!(this._flags&S)){this._flags|=N|S;for(let t=this._targets;t!==void 0;t=t._nextTarget)t._target._notify()}};Object.defineProperty(y.prototype,"value",{get(){if(this._flags&g)throw u("SignalCycleDetected");let t=Z(this);if(this._refresh(),t!==void 0&&(t._version=this._version),this._flags&M)throw u("GetComputedError",{value:this._value});return this._value}});function ne(t){return new y(t)}function se(t){let e=t._cleanup;if(t._cleanup=void 0,typeof e=="function"){B();let n=a;a=void 0;try{e()}catch(s){throw t._flags&=~g,t._flags|=b,$(t),u("CleanupEffectError",{error:s})}finally{a=n,G()}}}function $(t){for(let e=t._sources;e!==void 0;e=e._nextSource)e._source._unsubscribe(e);t._fn=void 0,t._sources=void 0,se(t)}function Se(t){if(a!==this)throw u("EndEffectError");te(this),a=t,this._flags&=~g,this._flags&b&&$(this),G()}function w(t){this._fn=t,this._cleanup=void 0,this._sources=void 0,this._nextBatchedEffect=void 0,this._flags=x}w.prototype._callback=function(){let t=this._start();try{if(this._flags&b||this._fn===void 0)return;let e=this._fn();typeof e=="function"&&(this._cleanup=e)}finally{t()}};w.prototype._start=function(){if(this._flags&g)throw u("SignalCycleDetected");this._flags|=g,this._flags&=~b,se(this),ee(this),B();let t=a;return a=this,Se.bind(this,t)};w.prototype._notify=function(){this._flags&S||(this._flags|=S,this._nextBatchedEffect=T,T=this)};w.prototype._dispose=function(){this._flags|=b,this._flags&g||$(this)};function P(t){let e=new w(t);try{e._callback()}catch(n){throw e._dispose(),u("EffectError",{error:n})}return e._dispose.bind(e)}function re(t,e=!1){let n={};for(let s in t)if(t.hasOwnProperty(s)){let r=t[s];if(r instanceof f){if(e&&s.startsWith("_"))continue;n[s]=r.value}else n[s]=re(r)}return n}function ie(t,e,n=!1){for(let s in e)if(e.hasOwnProperty(s)){let r=e[s];if(r instanceof Object&&!Array.isArray(r))t[s]||(t[s]={}),ie(t[s],r,n);else{if(n&&t[s])continue;t[s]=new f(r)}}}function oe(t,e){for(let n in t)if(t.hasOwnProperty(n)){let s=t[n];s instanceof f?e(n,s):oe(s,e)}}function xe(t,...e){let n={};for(let s of e){let r=s.split("."),i=t,o=n;for(let d=0;dn());this.setSignal(e,s)}value(e){return this.signal(e)?.value}setValue(e,n){let s=this.upsert(e,n);s.value=n}upsert(e,n){let s=e.split("."),r=this._signals;for(let d=0;d{let s;switch(n.type){case 0:this.macros.push(n);break;case 2:let r=n;this.watchers.push(r),s=r.onGlobalInit;break;case 3:this.actions[n.name]=n;break;case 1:let i=n;this.plugins.push(i),s=i.onGlobalInit;break;default:throw u("InvalidPluginType",{name:n.name,type:n.type})}if(s){let r=this;s({get signals(){return r._signals},effect:i=>P(i),actions:this.actions,apply:this.apply.bind(this),cleanup:this.cleanup.bind(this)})}}),this.apply(document.body)}cleanup(e){let n=this.removals.get(e);if(n){for(let s of n.set)s();this.removals.delete(e)}}apply(e){let n=new Set;this.plugins.forEach((s,r)=>{this.walkDownDOM(e,i=>{r||this.cleanup(i);for(let o in i.dataset){if(!o.startsWith(s.name))continue;let c=o.slice(s.name.length),[d,...p]=c.split(":"),h=d.length>0;h&&(d=d[0].toLowerCase()+d.slice(1));let D=`${i.dataset[o]}`||"",_=D,m=_.length>0,l=s.keyReq||0;if(h){if(l===2)throw u(s.name+"KeyNotAllowed")}else if(l===1)throw u(s.name+"KeyRequired");let E=s.valReq||0;if(m){if(E===2)throw u(s.name+"ValueNotAllowed")}else if(E===1)throw u(s.name+"ValueRequired");if(l===3||E===3){if(h&&m)throw u(s.name+"KeyAndValueProvided");if(!h&&!m)throw u(s.name+"KeyOrValueRequired")}i.id.length||(i.id=Y(i)),n.clear();let R=new Map;p.forEach(v=>{let[ge,...he]=v.split("_");R.set(U(ge),new Set(he))});let ue=[...s.macros?.pre||[],...this.macros,...s.macros?.post||[]];for(let v of ue)n.has(v)||(n.add(v),_=v.fn(_));let{actions:ce,apply:fe,cleanup:de}=this,pe=this,F;F={get signals(){return pe._signals},effect:v=>P(v),apply:fe.bind(this),cleanup:de.bind(this),actions:ce,genRX:()=>this.genRX(F,...s.argNames||[]),el:i,rawKey:o,rawValue:D,key:d,value:_,mods:R};let q=s.onLoad(F);q&&(this.removals.has(i)||this.removals.set(i,{id:i.id,set:new Set}),this.removals.get(i).set.add(q)),s?.removeOnLoad&&delete i.dataset[o]}})})}genRX(e,...n){let s=e.value.split(/;|\n/).map(l=>l.trim()).filter(l=>l!=""),r=s.length-1;s[r].startsWith("return")||(s[r]=`return (${s[r]});`);let o=s.join(`
+`),c=/(\w*)\(/gm,d=o.matchAll(c),p=new Set;for(let l of d)p.add(l[1]);let h=Object.keys(this.actions).filter(l=>p.has(l)),_=`${h.map(l=>`const ${l} = ctx.actions.${l}.fn;`).join(`
+`)}return (()=> {${o}})()`,m=_.trim();h.forEach(l=>{m=m.replaceAll(l+"(",l+"(ctx,")});try{let l=n||[],E=new Function("ctx",...l,m);return(...R)=>E(e,...R)}catch(l){throw u("GeneratingExpressionFailed",{error:l,fnContent:_})}}walkDownDOM(e,n){if(!e||!(e instanceof HTMLElement||e instanceof SVGElement))return null;for(n(e),e=e.firstElementChild;e;)this.walkDownDOM(e,n),e=e.nextElementSibling}};var ae=new V;ae.load(z,K,J,j);var le=ae;le.load();})();
//# sourceMappingURL=datastar-core.js.map
diff --git a/bundles/datastar-core.js.map b/bundles/datastar-core.js.map
index 20090e5fc..f60c17106 100644
--- a/bundles/datastar-core.js.map
+++ b/bundles/datastar-core.js.map
@@ -1,7 +1,7 @@
{
"version": 3,
- "sources": ["../code/ts/library/src/plugins/official/attributes/core/star.ts", "../code/ts/library/src/plugins/official/attributes/core/computed.ts", "../code/ts/library/src/utils/signals.ts", "../code/ts/library/src/plugins/official/attributes/core/store.ts", "../code/ts/library/src/utils/regex.ts", "../code/ts/library/src/plugins/official/preprocessors/core/actions.ts", "../code/ts/library/src/plugins/official/preprocessors/core/signals.ts", "../code/ts/library/src/engine/consts.ts", "../code/ts/library/src/engine/errors.ts", "../code/ts/library/src/utils/dom.ts", "../code/ts/library/src/vendored/preact-core.ts", "../code/ts/library/src/vendored/deepsignal.ts", "../code/ts/library/src/vendored/ts-merge-patch.ts", "../code/ts/library/src/engine/version.ts", "../code/ts/library/src/engine/engine.ts", "../code/ts/library/src/engine/index.ts", "../code/ts/library/src/bundles/datastar-core.ts"],
- "sourcesContent": ["// Authors: Delaney Gillilan\n// Icon: material-symbols:rocket\n// Slug: Star\n// Description: Sage advice for the weary traveler\n\nimport { AttributePlugin } from \"../../../../engine\";\n\nexport const Star: AttributePlugin = {\n pluginType: \"attribute\",\n name: \"star\",\n onLoad: () => {\n alert(\"YOU ARE PROBABLY OVERCOMPLICATING IT\");\n },\n};\n", "// Authors: Delaney Gillilan\n// Icon: fluent:draw-text-24-filled\n// Slug: Create a computed signal\n// Description: This attribute creates a computed signal that updates when its dependencies change.\n\nimport { AttributePlugin } from \"../../../../engine\";\n\nexport const Computed: AttributePlugin = {\n pluginType: \"attribute\",\n name: \"computed\",\n mustNotEmptyKey: true,\n onLoad: (ctx) => {\n const store = ctx.store();\n store[ctx.key] = ctx.reactivity.computed(() => {\n return ctx.expressionFn(ctx);\n });\n\n return () => {\n const store = ctx.store();\n delete store[ctx.key];\n };\n },\n};\n", "export function remoteSignals(obj: Object): Object {\n const res: Record = {};\n\n for (const [k, v] of Object.entries(obj)) {\n if (k.startsWith(\"_\")) {\n continue;\n } else if (typeof v === \"object\" && !Array.isArray(v)) {\n res[k] = remoteSignals(v); // recurse\n } else {\n res[k] = v;\n }\n }\n\n return res;\n}\n\nexport function storeFromPossibleContents(\n currentStore: any,\n contents: any,\n hasIfMissing: boolean,\n) {\n const actual: any = {};\n\n if (!hasIfMissing) {\n Object.assign(actual, contents);\n } else {\n for (const key in contents) {\n const currentValue = currentStore[key]?.value;\n if (currentValue === undefined || currentValue === null) {\n actual[key] = contents[key];\n }\n }\n }\n\n return actual;\n}\n", "// Authors: Delaney Gillilan\n// Icon: material-symbols:home-storage\n// Slug: Store signals into a singleton per page\n// Description: This action stores signals into a singleton per page. This is useful for storing signals that are used across multiple components.\n\nimport {\n AttributeContext,\n AttributePlugin,\n RegexpGroups,\n} from \"../../../../engine\";\nimport { storeFromPossibleContents } from \"../../../../utils/signals\";\n\n// Setup the global store\nexport const Store: AttributePlugin = {\n pluginType: \"attribute\",\n name: \"store\",\n removeNewLines: true,\n preprocessors: {\n pre: [\n {\n pluginType: \"preprocessor\",\n name: \"store\",\n regexp: /(?.+)/g,\n replacer: (groups: RegexpGroups) => {\n const { whole } = groups;\n return `Object.assign({...ctx.store()}, ${whole})`;\n },\n },\n ],\n },\n allowedModifiers: new Set([\"ifmissing\"]),\n onLoad: (ctx: AttributeContext) => {\n const possibleMergeSignals = ctx.expressionFn(ctx);\n const actualMergeSignals = storeFromPossibleContents(\n ctx.store(),\n possibleMergeSignals,\n ctx.modifiers.has(\"ifmissing\"),\n );\n ctx.mergeSignals(actualMergeSignals);\n\n delete ctx.el.dataset[ctx.rawKey];\n },\n};\n", "export const validJSIdentifier = `[a-zA-Z_$]+`;\nexport const validNestedJSIdentifier = validJSIdentifier + `[0-9a-zA-Z_$.]*`;\n\nexport function wholePrefixSuffix(\n rune: string,\n prefix: string,\n suffix: string,\n nestable = true,\n) {\n const identifier = nestable ? validNestedJSIdentifier : validJSIdentifier;\n return new RegExp(\n `(?${rune}(?<${prefix}>${identifier})${suffix})`,\n `g`,\n );\n}\n", "import { PreprocessorPlugin, RegexpGroups } from \"../../../../engine\";\nimport { wholePrefixSuffix } from \"../../../../utils/regex\";\n\n// Replacing $action(args) with ctx.actions.action(ctx, args)\nexport const ActionsProcessor: PreprocessorPlugin = {\n name: \"action\",\n pluginType: \"preprocessor\",\n regexp: wholePrefixSuffix(\n \"\\\\$\",\n \"action\",\n \"(?\\\\((?.*)\\\\))\",\n false,\n ),\n replacer: ({ action, args }: RegexpGroups) => {\n const withCtx = [`ctx`];\n if (args) {\n withCtx.push(...args.split(\",\").map((x) => x.trim()));\n }\n const argsJoined = withCtx.join(\",\");\n return `ctx.actions.${action}.method(${argsJoined})`;\n },\n};\n", "import { PreprocessorPlugin, RegexpGroups } from \"../../../../engine\";\nimport { wholePrefixSuffix } from \"../../../../utils/regex\";\n\n// Replacing $signal with ctx.store.signal.value`\nexport const SignalsProcessor: PreprocessorPlugin = {\n name: \"signal\",\n pluginType: \"preprocessor\",\n regexp: wholePrefixSuffix(\"\\\\$\", \"signal\", \"(?\\\\([^\\\\)]*\\\\))?\"),\n replacer: (groups: RegexpGroups) => {\n const { signal, method } = groups;\n const prefix = `ctx.store()`;\n if (!method?.length) {\n return `${prefix}.${signal}.value`;\n }\n const parts = signal.split(\".\");\n const methodName = parts.pop();\n const nestedSignal = parts.join(\".\");\n return `${prefix}.${nestedSignal}.value.${methodName}${method}`;\n },\n};\n", "// This is auto-generated by Datastar. DO NOT EDIT.\n\nexport const DATASTAR = \"datastar\";\nexport const DATASTAR_EVENT = \"datastar-event\";\nexport const DATASTAR_REQUEST = \"Datastar-Request\";\nexport const VERSION = \"0.20.1\";\n\n// #region Defaults\n\n// #region Default durations\n\n// The default duration for settling during merges. Allows for CSS transitions to complete.\nexport const DefaultSettleDurationMs = 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 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 from the store?\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 into the store.\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 from the store.\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 { DATASTAR } from \"./consts\";\n\nconst err = (code: number) => {\n const e = new Error();\n e.name = `${DATASTAR}${code}`;\n return e;\n};\n\nexport const ERR_BAD_ARGS = err(400);\nexport const ERR_ALREADY_EXISTS = err(409);\nexport const ERR_NOT_FOUND = err(404);\nexport const ERR_NOT_ALLOWED = err(403);\nexport const ERR_METHOD_NOT_ALLOWED = err(405);\nexport const ERR_SERVICE_UNAVAILABLE = err(503);\n", "import { DATASTAR } from \"../engine/consts\";\nimport { ERR_NOT_FOUND } from \"../engine/errors\";\n\nexport function consistentUniqID(el: Element) {\n if (el.id) return el.id;\n let hash = 0;\n const hashUpdate = (n: number) => {\n hash = ((hash << 5) - hash) + n;\n return hash & hash;\n };\n const hashUpdateFromStr = (str: string) =>\n str.split(\"\").forEach((c) => hashUpdate(c.charCodeAt(0)));\n\n while (el.parentNode) {\n if (el.id) {\n hashUpdateFromStr(`${el.id}`);\n break;\n } else {\n if (el === el.ownerDocument.documentElement) {\n hashUpdateFromStr(el.tagName);\n } else {\n for (\n let i = 1, e = el;\n e.previousElementSibling;\n e = e.previousElementSibling, i++\n ) {\n hashUpdate(i);\n }\n el = el.parentNode as Element;\n }\n }\n el = el.parentNode as Element;\n }\n return DATASTAR + hash;\n}\n\nexport function scrollIntoView(\n el: HTMLElement | SVGElement,\n opts: ScrollIntoViewOptions,\n shouldFocus = true,\n) {\n if (!(el instanceof HTMLElement || el instanceof SVGElement)) {\n // Element is not an HTMLElement or SVGElement\n throw ERR_NOT_FOUND;\n }\n if (!el.tabIndex) el.setAttribute(\"tabindex\", \"0\");\n\n el.scrollIntoView(opts);\n if (shouldFocus) el.focus();\n}\n", "// An named symbol/brand for detecting Signal instances even when they weren't\n\nimport { ERR_BAD_ARGS } from \"../engine/errors\";\n\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 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 } else 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.\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 = function () {\n return true;\n};\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 // Cycle detected\n throw ERR_BAD_ARGS;\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 = 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\ndeclare 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\nfunction 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 ERR_BAD_ARGS;\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 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 (err) {\n effect._flags &= ~RUNNING;\n effect._flags |= DISPOSED;\n disposeEffect(effect);\n throw err;\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 // Out-of-order effect\n throw ERR_BAD_ARGS;\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\ntype EffectFn = () => void | (() => void);\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\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 // Cycle detected\n throw ERR_BAD_ARGS;\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 (err) {\n effect._dispose();\n throw err;\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", "// From https://github.com/EthanStandel/deepsignal/blob/main/packages/core/src/core.ts\nimport { ERR_NOT_ALLOWED } from \"../engine/errors\";\nimport { batch, Signal, signal } from \"./preact-core\";\n\nexport type AtomicState =\n | Array\n | ((...args: unknown[]) => unknown)\n | string\n | boolean\n | number\n | bigint\n | symbol\n | undefined\n | null;\n\nexport type DeepState = {\n [key: string]: (() => unknown) | AtomicState | DeepState;\n};\n\nexport type ReadOnlyDeep = {\n readonly [P in keyof T]: ReadOnlyDeep;\n};\n\nexport interface DeepSignalAccessors {\n value: ReadOnlyDeep;\n peek: () => ReadOnlyDeep;\n}\n\nexport type DeepSignalType =\n & DeepSignalAccessors\n & {\n [K in keyof T]: T[K] extends AtomicState ? Signal\n : T[K] extends DeepState ? DeepSignalType\n : Signal;\n };\n\nexport class DeepSignal implements DeepSignalAccessors {\n get value(): ReadOnlyDeep {\n return getValue(this as DeepSignalType);\n }\n\n set value(payload: ReadOnlyDeep) {\n batch(() => setValue(this as DeepSignalType, payload));\n }\n\n peek(): ReadOnlyDeep {\n return getValue(this as DeepSignalType, { peek: true });\n }\n}\n\nexport const deepSignal = (\n initialValue: T,\n): DeepSignalType =>\n Object.assign(\n new DeepSignal(),\n Object.entries(initialValue).reduce(\n (acc, [key, value]) => {\n if ([\"value\", \"peek\"].some((iKey) => iKey === key)) {\n // console.error(`${key} is a reserved property name`)\n throw ERR_NOT_ALLOWED;\n } else if (\n typeof value !== \"object\" || value === null || Array.isArray(value)\n ) {\n acc[key] = signal(value);\n } else {\n acc[key] = deepSignal(value);\n }\n return acc;\n },\n {} as { [key: string]: unknown },\n ),\n ) as DeepSignalType;\n\nconst setValue = >(\n deepSignal: T,\n payload: U,\n): void =>\n Object.keys(payload).forEach((\n key: keyof U,\n ) => (deepSignal[key].value = payload[key]));\n\nconst getValue = >(\n deepSignal: T,\n { peek = false }: { peek?: boolean } = {},\n): ReadOnlyDeep =>\n Object.entries(deepSignal).reduce(\n (acc, [key, value]) => {\n if (value instanceof Signal) {\n acc[key] = peek ? value.peek() : value.value;\n } else if (value instanceof DeepSignal) {\n acc[key] = getValue(value as DeepSignalType, { peek });\n }\n return acc;\n },\n {} as { [key: string]: unknown },\n ) as ReadOnlyDeep;\n", "// From https://github.com/riagominota/ts-merge-patch/blob/main/src/index.ts\n\ntype mpObj = { [k in keyof T | string | number | symbol]: any };\nexport function apply(\n target: mpObj,\n patchItem: mpObj,\n): Partial & Partial;\nexport function apply(target: mpObj, patchItem: mpObj): R;\nexport function apply(target: mpObj, patchItem: mpObj): {};\nexport function apply(target: mpObj, patchItem: null): null;\nexport function apply(target: mpObj, patchItem: string): string;\nexport function apply(target: mpObj, patchItem: number): number;\nexport function apply(target: mpObj, patchItem: undefined): undefined;\nexport function apply(target: mpObj, patchItem: R[]): R[];\n\nexport function apply(target: any, patchItem: any): any {\n /**\n * If the patch is anything other than an object,\n * the result will always be to replace\n * the entire target with the entire patch.\n */\n if (\n typeof patchItem !== \"object\" || Array.isArray(patchItem) || !patchItem\n ) {\n return JSON.parse(JSON.stringify(patchItem)); //return new instance of variable\n }\n\n if (\n typeof patchItem === \"object\" &&\n patchItem.toJSON !== undefined &&\n typeof patchItem.toJSON === \"function\"\n ) {\n return patchItem.toJSON();\n }\n /** Also, it is not possible to\n * patch part of a target that is not an object,\n * such as to replace just some of the values in an array.\n */\n let targetResult = target;\n if (typeof target !== \"object\") {\n //Target is empty/not an object, so basically becomes patch, minus any null valued sections (becomes {} + patch)\n targetResult = { ...patchItem };\n }\n\n Object.keys(patchItem).forEach((k) => {\n if (!targetResult.hasOwnProperty(k)) targetResult[k] = patchItem[k]; //This ensure the key exists and TS can't throw a wobbly over an undefined key\n if (patchItem[k] === null) {\n delete targetResult[k];\n } else {\n targetResult[k] = apply(targetResult[k], patchItem[k]);\n }\n });\n return targetResult;\n}\n", "export const VERSION = '0.20.1';\n", "import { consistentUniqID } from \"../utils/dom\";\nimport { HTMLorSVGElement } from \"../utils/types\";\nimport { DeepSignal, deepSignal, DeepState } from \"../vendored/deepsignal\";\nimport { computed, effect, Signal, signal } from \"../vendored/preact-core\";\nimport { apply } from \"../vendored/ts-merge-patch\";\n\nimport {\n ERR_ALREADY_EXISTS,\n ERR_BAD_ARGS,\n ERR_METHOD_NOT_ALLOWED,\n ERR_NOT_ALLOWED,\n ERR_NOT_FOUND,\n} from \"./errors\";\nimport {\n ActionPlugin,\n ActionPlugins,\n AttribtueExpressionFunction,\n AttributeContext,\n AttributePlugin,\n DatastarPlugin,\n InitContext,\n OnRemovalFn,\n PreprocessorPlugin,\n Reactivity,\n WatcherPlugin,\n} from \"./types\";\nimport { VERSION } from \"./version\";\n\nconst isPreprocessorPlugin = (p: DatastarPlugin): p is PreprocessorPlugin =>\n p.pluginType === \"preprocessor\";\nconst isWatcherPlugin = (p: DatastarPlugin): p is WatcherPlugin =>\n p.pluginType === \"watcher\";\nconst isAttributePlugin = (p: DatastarPlugin): p is AttributePlugin =>\n p.pluginType === \"attribute\";\nconst isActionPlugin = (p: DatastarPlugin): p is ActionPlugin =>\n p.pluginType === \"action\";\n\nexport class Engine {\n plugins: AttributePlugin[] = [];\n store: DeepSignal = deepSignal({});\n preprocessors = new Array();\n actions: ActionPlugins = {};\n watchers = new Array();\n refs: Record = {};\n reactivity: Reactivity = {\n signal,\n computed,\n effect,\n };\n removals = new Map }>();\n mergeRemovals = new Array();\n\n get version() {\n return VERSION;\n }\n\n load(...pluginsToLoad: DatastarPlugin[]) {\n const allLoadedPlugins = new Set(this.plugins);\n\n pluginsToLoad.forEach((plugin) => {\n if (plugin.requiredPlugins) {\n for (\n const requiredPluginType of plugin\n .requiredPlugins\n ) {\n if (\n !allLoadedPlugins.has(requiredPluginType)\n ) {\n // requires other plugin to be loaded\n throw ERR_NOT_ALLOWED;\n }\n }\n }\n\n let globalInitializer: ((ctx: InitContext) => void) | undefined;\n if (isPreprocessorPlugin(plugin)) {\n if (this.preprocessors.includes(plugin)) {\n throw ERR_ALREADY_EXISTS;\n }\n this.preprocessors.push(plugin);\n } else if (isWatcherPlugin(plugin)) {\n if (this.watchers.includes(plugin)) {\n throw ERR_ALREADY_EXISTS;\n }\n this.watchers.push(plugin);\n globalInitializer = plugin.onGlobalInit;\n } else if (isActionPlugin(plugin)) {\n if (!!this.actions[plugin.name]) {\n throw ERR_ALREADY_EXISTS;\n }\n this.actions[plugin.name] = plugin;\n } else if (isAttributePlugin(plugin)) {\n if (this.plugins.includes(plugin)) {\n throw ERR_ALREADY_EXISTS;\n }\n this.plugins.push(plugin);\n globalInitializer = plugin.onGlobalInit;\n } else {\n throw ERR_NOT_FOUND;\n }\n\n if (globalInitializer) {\n globalInitializer({\n store: () => this.store,\n upsertSignal: this.upsertSignal\n .bind(this),\n mergeSignals: this.mergeSignals.bind(this),\n removeSignals: this.removeSignals.bind(this),\n actions: this.actions,\n reactivity: this.reactivity,\n applyPlugins: this.applyPlugins.bind(this),\n cleanup: this.cleanup.bind(\n this,\n ),\n });\n }\n\n allLoadedPlugins.add(plugin);\n });\n\n this.applyPlugins(document.body);\n }\n\n private cleanup(element: Element) {\n const removalSet = this.removals.get(element);\n if (removalSet) {\n for (const removal of removalSet.set) {\n removal();\n }\n this.removals.delete(element);\n }\n }\n\n lastMarshalledStore = \"\";\n private mergeSignals(mergeSignals: T) {\n this.mergeRemovals.forEach((removal) => removal());\n this.mergeRemovals = this.mergeRemovals.slice(0);\n\n const revisedStore = apply(this.store.value, mergeSignals) as DeepState;\n this.store = deepSignal(revisedStore);\n\n const marshalledStore = JSON.stringify(this.store.value);\n if (marshalledStore === this.lastMarshalledStore) return;\n }\n\n private removeSignals(...keys: string[]) {\n const revisedStore = { ...this.store.value };\n let found = false;\n for (const key of keys) {\n const parts = key.split(\".\");\n let currentID = parts[0];\n let subStore = revisedStore;\n for (let i = 1; i < parts.length; i++) {\n const part = parts[i];\n if (!subStore[currentID]) {\n subStore[currentID] = {};\n }\n subStore = subStore[currentID];\n currentID = part;\n }\n delete subStore[currentID];\n found = true;\n }\n if (!found) return;\n this.store = deepSignal(revisedStore);\n this.applyPlugins(document.body);\n }\n\n private upsertSignal(path: string, value: T) {\n const parts = path.split(\".\");\n let subStore = this.store as any;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (!subStore[part]) {\n subStore[part] = {};\n }\n subStore = subStore[part];\n }\n const last = parts[parts.length - 1];\n\n const current = subStore[last];\n if (!!current) return current;\n\n const signal = this.reactivity.signal(value);\n subStore[last] = signal;\n\n return signal;\n }\n\n private applyPlugins(rootElement: Element) {\n const appliedProcessors = new Set();\n\n this.plugins.forEach((p, pi) => {\n this.walkDownDOM(rootElement, (el) => {\n if (!pi) this.cleanup(el);\n\n for (const rawKey in el.dataset) {\n const rawExpression = `${el.dataset[rawKey]}` || \"\";\n let expression = rawExpression;\n\n if (!rawKey.startsWith(p.name)) continue;\n\n if (!el.id.length) {\n el.id = consistentUniqID(el);\n }\n\n appliedProcessors.clear();\n\n if (p.allowedTagRegexps) {\n const lowerCaseTag = el.tagName.toLowerCase();\n const allowed = [...p.allowedTagRegexps].some((r) =>\n lowerCaseTag.match(r)\n );\n if (!allowed) {\n throw ERR_NOT_ALLOWED;\n }\n }\n\n let keyRaw = rawKey.slice(p.name.length);\n let [key, ...modifiersWithArgsArr] = keyRaw.split(\".\");\n if (p.mustHaveEmptyKey && key.length > 0) {\n // must have empty key\n throw ERR_BAD_ARGS;\n }\n if (p.mustNotEmptyKey && key.length === 0) {\n // must have non-empty key\n throw ERR_BAD_ARGS;\n }\n if (key.length) {\n key = key[0].toLowerCase() + key.slice(1);\n }\n\n const modifiersArr = modifiersWithArgsArr.map((m) => {\n const [label, ...args] = m.split(\"_\");\n return { label, args };\n });\n if (p.allowedModifiers) {\n for (const modifier of modifiersArr) {\n if (!p.allowedModifiers.has(modifier.label)) {\n // modifier not allowed\n throw ERR_NOT_ALLOWED;\n }\n }\n }\n const modifiers = new Map();\n for (const modifier of modifiersArr) {\n modifiers.set(modifier.label, modifier.args);\n }\n\n if (p.mustHaveEmptyExpression && expression.length) {\n // must have empty expression\n throw ERR_BAD_ARGS;\n }\n if (p.mustNotEmptyExpression && !expression.length) {\n // must have non-empty expression\n throw ERR_BAD_ARGS;\n }\n\n const splitRegex = /;|\\n/;\n\n if (p.removeNewLines) {\n expression = expression\n .split(\"\\n\")\n .map((p: string) => p.trim())\n .join(\" \");\n }\n\n const processors = [\n ...(p.preprocessors?.pre || []),\n ...this.preprocessors,\n ...(p.preprocessors?.post || []),\n ];\n for (const processor of processors) {\n if (appliedProcessors.has(processor)) continue;\n appliedProcessors.add(processor);\n\n const expressionParts = expression.split(splitRegex);\n const revisedParts: string[] = [];\n\n expressionParts.forEach((exp) => {\n let revised = exp;\n const matches = [\n ...revised.matchAll(processor.regexp),\n ];\n if (matches.length) {\n for (const match of matches) {\n if (!match.groups) continue;\n const { groups } = match;\n const { whole } = groups;\n revised = revised.replace(\n whole,\n processor.replacer(groups),\n );\n }\n }\n revisedParts.push(revised);\n });\n // })\n\n expression = revisedParts.join(\"; \");\n }\n\n const ctx: AttributeContext = {\n store: () => this.store,\n mergeSignals: this.mergeSignals.bind(this),\n upsertSignal: this.upsertSignal\n .bind(this),\n removeSignals: this.removeSignals.bind(this),\n applyPlugins: this.applyPlugins.bind(this),\n cleanup: this.cleanup\n .bind(this),\n walkSignals: this.walkSignals.bind(this),\n actions: this.actions,\n reactivity: this.reactivity,\n el,\n rawKey,\n key,\n rawExpression,\n expression,\n expressionFn: () => {\n throw ERR_METHOD_NOT_ALLOWED;\n },\n modifiers,\n };\n\n if (\n !p.bypassExpressionFunctionCreation?.(ctx) &&\n !p.mustHaveEmptyExpression && expression.length\n ) {\n const statements = expression\n .split(splitRegex)\n .map((s) => s.trim())\n .filter((s) => s.length);\n statements[statements.length - 1] = `return ${\n statements[statements.length - 1]\n }`;\n const j = statements.map((s) => ` ${s}`).join(\";\\n\");\n const fnContent =\n `try{${j}}catch(e){console.error(\\`Error evaluating Datastar expression:\\n${\n j.replaceAll(\"`\", \"\\\\`\")\n }\\n\\nError: \\${e.message}\\n\\nCheck if the expression is valid before raising an issue.\\`.trim());debugger}`;\n try {\n const argumentNames = p.argumentNames || [];\n const fn = new Function(\n \"ctx\",\n ...argumentNames,\n fnContent,\n ) as AttribtueExpressionFunction;\n ctx.expressionFn = fn;\n } catch (e) {\n const err = new Error(`${e}\\nwith\\n${fnContent}`);\n console.error(err);\n debugger;\n }\n }\n\n const removal = p.onLoad(ctx);\n if (removal) {\n if (!this.removals.has(el)) {\n this.removals.set(el, {\n id: el.id,\n set: new Set(),\n });\n }\n this.removals.get(el)!.set.add(removal);\n }\n }\n });\n });\n }\n\n private walkSignalsStore(\n store: any,\n callback: (name: string, signal: Signal) => void,\n ) {\n const keys = Object.keys(store);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const value = store[key];\n const isSignal = value instanceof Signal;\n const hasChildren = typeof value === \"object\" &&\n Object.keys(value).length > 0;\n\n if (isSignal) {\n callback(key, value);\n continue;\n }\n\n if (!hasChildren) continue;\n\n this.walkSignalsStore(value, callback);\n }\n }\n\n private walkSignals(callback: (name: string, signal: Signal) => void) {\n this.walkSignalsStore(this.store, callback);\n }\n\n private walkDownDOM(\n element: Element | null,\n callback: (el: HTMLorSVGElement) => void,\n siblingOffset = 0,\n ) {\n if (\n !element ||\n !(element instanceof HTMLElement || element instanceof SVGElement)\n ) return null;\n\n callback(element);\n\n siblingOffset = 0;\n element = element.firstElementChild;\n while (element) {\n this.walkDownDOM(element, callback, siblingOffset++);\n element = element.nextElementSibling;\n }\n }\n}\n", "import { Star } from \"../plugins/official/attributes/core/star\";\nimport { Computed } from \"../plugins/official/attributes/core/computed\";\nimport { Store } from \"../plugins/official/attributes/core/store\";\nimport { ActionsProcessor } from \"../plugins/official/preprocessors/core/actions\";\nimport { SignalsProcessor } from \"../plugins/official/preprocessors/core/signals\";\nimport { Engine } from \"./engine\";\n\nexport { VERSION } from \"./consts\";\n\nexport type * from \"./types\";\n\nconst ds = new Engine();\nds.load(\n ActionsProcessor,\n SignalsProcessor,\n Store,\n Computed,\n Star,\n);\n\nexport const Datastar = ds;\n", "import { Datastar } from \"../engine\";\n\nDatastar.load();\n"],
- "mappings": "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",
- "names": ["Star", "Computed", "ctx", "store", "storeFromPossibleContents", "currentStore", "contents", "hasIfMissing", "actual", "key", "currentValue", "Store", "groups", "whole", "ctx", "possibleMergeSignals", "actualMergeSignals", "storeFromPossibleContents", "validJSIdentifier", "validNestedJSIdentifier", "wholePrefixSuffix", "rune", "prefix", "suffix", "nestable", "identifier", "ActionsProcessor", "wholePrefixSuffix", "action", "args", "withCtx", "x", "argsJoined", "SignalsProcessor", "wholePrefixSuffix", "groups", "signal", "method", "prefix", "parts", "methodName", "nestedSignal", "DATASTAR", "FragmentMergeModes", "DefaultFragmentMergeMode", "err", "code", "DATASTAR", "ERR_BAD_ARGS", "ERR_ALREADY_EXISTS", "ERR_NOT_FOUND", "ERR_NOT_ALLOWED", "ERR_METHOD_NOT_ALLOWED", "ERR_SERVICE_UNAVAILABLE", "consistentUniqID", "el", "hash", "hashUpdate", "n", "hashUpdateFromStr", "str", "c", "i", "e", "DATASTAR", "BRAND_SYMBOL", "RUNNING", "NOTIFIED", "OUTDATED", "DISPOSED", "HAS_ERROR", "TRACKING", "startBatch", "batchDepth", "endBatch", "error", "hasError", "batchedEffect", "effect", "batchIteration", "next", "needsToRecompute", "err", "batch", "fn", "evalContext", "batchedEffect", "batchDepth", "batchIteration", "globalVersion", "addDependency", "signal", "evalContext", "node", "TRACKING", "Signal", "value", "BRAND_SYMBOL", "prev", "next", "fn", "effect", "prevContext", "ERR_BAD_ARGS", "startBatch", "endBatch", "needsToRecompute", "target", "prepareSources", "rollbackNode", "cleanupSources", "head", "Computed", "OUTDATED", "NOTIFIED", "RUNNING", "HAS_ERROR", "err", "computed", "cleanupEffect", "cleanup", "DISPOSED", "disposeEffect", "endEffect", "Effect", "finish", "DeepSignal", "getValue", "payload", "batch", "setValue", "deepSignal", "initialValue", "acc", "key", "value", "iKey", "ERR_NOT_ALLOWED", "signal", "peek", "Signal", "apply", "target", "patchItem", "targetResult", "k", "VERSION", "isPreprocessorPlugin", "p", "isWatcherPlugin", "isAttributePlugin", "isActionPlugin", "Engine", "deepSignal", "signal", "computed", "effect", "VERSION", "pluginsToLoad", "allLoadedPlugins", "plugin", "requiredPluginType", "ERR_NOT_ALLOWED", "globalInitializer", "ERR_ALREADY_EXISTS", "ERR_NOT_FOUND", "element", "removalSet", "removal", "mergeSignals", "revisedStore", "apply", "keys", "found", "key", "parts", "currentID", "subStore", "i", "part", "path", "value", "last", "current", "rootElement", "appliedProcessors", "pi", "el", "rawKey", "rawExpression", "expression", "consistentUniqID", "lowerCaseTag", "r", "keyRaw", "modifiersWithArgsArr", "ERR_BAD_ARGS", "modifiersArr", "m", "label", "args", "modifier", "modifiers", "splitRegex", "processors", "processor", "expressionParts", "revisedParts", "exp", "revised", "matches", "match", "groups", "whole", "ctx", "ERR_METHOD_NOT_ALLOWED", "statements", "s", "j", "fnContent", "argumentNames", "fn", "e", "err", "store", "callback", "isSignal", "Signal", "hasChildren", "siblingOffset", "ds", "Engine", "ActionsProcessor", "SignalsProcessor", "Store", "Computed", "Star", "Datastar", "Datastar"]
+ "sources": ["../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/plugins/official/core/macros/signals.ts", "../library/src/engine/consts.ts", "../library/src/utils/dom.ts", "../library/src/engine/errors.ts", "../library/src/vendored/preact-core.ts", "../library/src/engine/nestedSignals.ts", "../library/src/engine/engine.ts", "../library/src/engine/index.ts", "../library/src/bundles/datastar-core.ts"],
+ "sourcesContent": ["import {\n 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 removeOnLoad: true,\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.replace(/(?:^\\w|[A-Z]|\\b\\w)/g, function (word, index) {\n return index == 0 ? word.toLowerCase() : word.toUpperCase();\n }).replace(/\\s+/g, \"\");\n\nexport const jsStrToObject = (raw: string) => {\n return (new Function(`return Object.assign({}, ${raw})`))();\n};\n", "import {\n AttributePlugin,\n NestedValues,\n PluginType,\n Requirement,\n} from \"../../../../engine/types\";\nimport { jsStrToObject } from \"../../../../utils/text\";\n\nexport const Signals: AttributePlugin = {\n type: PluginType.Attribute,\n name: \"signals\",\n valReq: Requirement.Must,\n removeOnLoad: true,\n onLoad: (ctx) => {\n const { key, genRX, signals } = ctx;\n if (key != \"\") {\n signals.setValue(key, genRX()());\n } else {\n const obj = jsStrToObject(ctx.value);\n ctx.value = JSON.stringify(obj);\n signals.merge(genRX()());\n }\n },\n};\n", "import {\n 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 { MacroPlugin, PluginType } from \"../../../../engine/types\";\n\nexport const SignalValueMacro: MacroPlugin = {\n name: \"signalValue\",\n type: PluginType.Macro,\n fn: (original: string) => {\n const validJS = /(?[\\w0-9.]*)((\\.value))/gm;\n const sub = `ctx.signals.signal('$1').value`;\n return original.replaceAll(validJS, sub);\n },\n};\n", "// This is auto-generated by Datastar. DO NOT EDIT.\n\nexport const DATASTAR = \"datastar\";\nexport const DATASTAR_EVENT = \"datastar-event\";\nexport const DATASTAR_REQUEST = \"Datastar-Request\";\nexport const VERSION = \"0.21.0-beta1\";\n\n// #region Defaults\n\n// #region Default durations\n\n// The default duration for settling during merges. Allows for CSS transitions to complete.\nexport const DefaultSettleDurationMs = 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 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 { DATASTAR } from \"../engine/consts\";\n\nexport function elUniqId(el: Element) {\n if (el.id) return el.id;\n let hash = 0;\n const hashUpdate = (n: number) => {\n hash = ((hash << 5) - hash) + n;\n return hash & hash;\n };\n const hashUpdateFromStr = (str: string) =>\n str.split(\"\").forEach((c) => hashUpdate(c.charCodeAt(0)));\n\n while (el.parentNode) {\n if (el.id) {\n hashUpdateFromStr(`${el.id}`);\n break;\n } else {\n if (el === el.ownerDocument.documentElement) {\n hashUpdateFromStr(el.tagName);\n } else {\n for (\n let i = 1, e = el;\n e.previousElementSibling;\n e = e.previousElementSibling, i++\n ) {\n hashUpdate(i);\n }\n el = el.parentNode as Element;\n }\n }\n el = el.parentNode as Element;\n }\n return DATASTAR + hash;\n}", "// TODO: set to https://data-star.dev/\nconst url = `http://localhost:8080/errors`;\n\nexport const hasValNonExpr = /([\\w0-9.]+)\\.value/gm;\n\nexport const dsErr = (code: string, args?: any) => {\n const e = new Error();\n e.name = `error ${code}`;\n const fullURL = `${url}/${code}?${new URLSearchParams(args)}`;\n e.message = `for more info see ${fullURL}`;\n return e;\n};\n", "// An named symbol/brand for detecting Signal instances even when they weren't\n\nimport { dsErr } from \"../engine/errors\";\nimport { OnRemovalFn } from \"../engine/types\";\n\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 dsErr(\"BatchError, 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 } else 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.\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 = function () {\n return true;\n};\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 dsErr(\"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\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 dsErr(\"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 dsErr(\"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 dsErr(\"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 dsErr(\"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\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 dsErr(\"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 dsErr(\"EffectError\", { 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 { Computed, computed, Signal } from \"../vendored/preact-core\";\nimport { dsErr } from \"./errors\";\nimport { NestedSignal, NestedValues } from \"./types\";\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 (signal.hasOwnProperty(key)) {\n const value = signal[key];\n if (value instanceof Signal) {\n if (onlyPublic && key.startsWith(\"_\")) {\n continue;\n }\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 (values.hasOwnProperty(key)) {\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 if (onlyIfMissing && target[key]) {\n continue;\n }\n target[key] = new Signal(value);\n }\n }\n }\n}\n\nfunction walkNestedSignal(\n signal: NestedSignal,\n cb: (dotDeliminatedB: string, signal: Signal) => void,\n): void {\n for (const key in signal) {\n if (signal.hasOwnProperty(key)) {\n const value = signal[key];\n if (value instanceof Signal) {\n cb(key, value);\n } else {\n walkNestedSignal(value as NestedSignal, cb);\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 (nv.hasOwnProperty(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 private _signals: NestedSignal = {};\n\n constructor() {}\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) throw dsErr(\"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.upsert(dotDelimitedPath, value);\n s.value = value;\n }\n\n upsert(dotDelimitedPath: string, value: 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) return current as Signal;\n\n const signal = new Signal(value);\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 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 { elUniqId } from \"../utils/dom\";\nimport { camelize } from \"../utils/text\";\nimport { effect } from \"../vendored/preact-core\";\nimport { VERSION } from \"./consts\";\nimport { dsErr } from \"./errors\";\nimport { SignalsRoot } from \"./nestedSignals\";\nimport {\n ActionPlugin,\n ActionPlugins,\n AttributePlugin,\n DatastarPlugin,\n GlobalInitializer,\n HTMLorSVGElement,\n MacroPlugin,\n Modifiers,\n OnRemovalFn,\n PluginType,\n RemovalEntry,\n Requirement,\n RuntimeContext,\n RuntimeExpressionFunction,\n WatcherPlugin,\n} from \"./types\";\n\nexport class Engine {\n private _signals = new SignalsRoot();\n private plugins: AttributePlugin[] = [];\n private macros: MacroPlugin[] = [];\n private actions: ActionPlugins = {};\n private watchers: WatcherPlugin[] = [];\n private removals = new Map();\n\n get version() {\n return VERSION;\n }\n\n public load(...pluginsToLoad: DatastarPlugin[]) {\n pluginsToLoad.forEach((plugin) => {\n let globalInitializer: GlobalInitializer | undefined;\n switch (plugin.type) {\n case PluginType.Macro:\n this.macros.push(plugin as MacroPlugin);\n break;\n case PluginType.Watcher:\n const wp = plugin as WatcherPlugin;\n this.watchers.push(wp);\n globalInitializer = wp.onGlobalInit;\n break;\n case PluginType.Action:\n this.actions[plugin.name] = plugin as ActionPlugin;\n break;\n case PluginType.Attribute:\n const ap = plugin as AttributePlugin;\n this.plugins.push(ap);\n globalInitializer = ap.onGlobalInit;\n break;\n default:\n throw dsErr(\"InvalidPluginType\", {\n name: plugin.name,\n type: plugin.type,\n });\n }\n if (globalInitializer) {\n const that = this; // I hate javascript\n globalInitializer({\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 });\n }\n });\n this.apply(document.body);\n }\n\n // Clenup all plugins associated with the element\n private cleanup(element: Element) {\n const removalSet = this.removals.get(element);\n if (removalSet) {\n for (const removal of removalSet.set) {\n removal();\n }\n this.removals.delete(element);\n }\n }\n\n // Apply all plugins to the element and its children\n private apply(rootElement: Element) {\n const appliedMacros = new Set();\n this.plugins.forEach((p, pi) => {\n this.walkDownDOM(rootElement, (el) => {\n // Cleanup if not first plugin\n if (!pi) this.cleanup(el);\n\n for (const rawKey in el.dataset) {\n // Check if the key is relevant to the plugin\n if (!rawKey.startsWith(p.name)) continue;\n\n // Extract the key and value from the dataset\n const keyRaw = rawKey.slice(p.name.length);\n let [key, ...rawModifiers] = keyRaw.split(\":\");\n\n const hasKey = key.length > 0;\n if (hasKey) {\n key = key[0].toLowerCase() + key.slice(1);\n }\n const rawValue = `${el.dataset[rawKey]}` || \"\";\n let value = rawValue;\n const hasValue = value.length > 0;\n\n // Check the requirements\n const keyReq = p.keyReq || Requirement.Allowed;\n if (hasKey) {\n if (keyReq === Requirement.Denied) {\n throw dsErr(p.name + \"KeyNotAllowed\");\n }\n } else if (keyReq === Requirement.Must) {\n throw dsErr(p.name + \"KeyRequired\");\n }\n const valReq = p.valReq || Requirement.Allowed;\n if (hasValue) {\n if (valReq === Requirement.Denied) {\n throw dsErr(p.name + \"ValueNotAllowed\");\n }\n } else if (valReq === Requirement.Must) {\n throw dsErr(p.name + \"ValueRequired\");\n }\n\n // Check for exclusive requirements\n if (keyReq === Requirement.Exclusive || valReq === Requirement.Exclusive) {\n if (hasKey && hasValue) {\n throw dsErr(p.name + \"KeyAndValueProvided\");\n } else if (!hasKey && !hasValue) {\n throw dsErr(p.name + \"KeyOrValueRequired\");\n }\n }\n\n // Ensure the element has an id\n if (!el.id.length) el.id = elUniqId(el);\n\n // Apply the macros\n appliedMacros.clear();\n const mods: Modifiers = new Map>();\n rawModifiers.forEach((m) => {\n const [label, ...args] = m.split(\"_\");\n mods.set(camelize(label), new Set(args));\n });\n const macros = [\n ...(p.macros?.pre || []),\n ...this.macros,\n ...(p.macros?.post || []),\n ];\n for (const macro of macros) {\n if (appliedMacros.has(macro)) continue;\n appliedMacros.add(macro);\n value = macro.fn(value);\n }\n\n // Create the runtime context\n const { actions, apply, cleanup } = this;\n const that = this; // I hate javascript\n let ctx: RuntimeContext;\n ctx = {\n get signals() {\n return that._signals;\n },\n effect: (cb: () => void): OnRemovalFn => effect(cb),\n apply: apply.bind(this),\n cleanup: cleanup.bind(this),\n actions,\n genRX: () => this.genRX(ctx, ...p.argNames || []),\n el,\n rawKey,\n rawValue,\n key,\n value,\n mods,\n };\n\n // Load the plugin and store any cleanup functions\n const removal = p.onLoad(ctx);\n if (removal) {\n if (!this.removals.has(el)) {\n this.removals.set(el, {\n id: el.id,\n set: new Set(),\n });\n }\n this.removals.get(el)!.set.add(removal);\n }\n\n // Remove the attribute if required\n if (!!p?.removeOnLoad) delete el.dataset[rawKey];\n }\n });\n });\n }\n\n private genRX(\n ctx: RuntimeContext,\n ...argNames: string[]\n ): RuntimeExpressionFunction {\n const stmts = ctx.value.split(/;|\\n/).map((s) => s.trim()).filter((s) =>\n s != \"\"\n );\n const lastIdx = stmts.length - 1;\n const last = stmts[lastIdx];\n if (!last.startsWith(\"return\")) {\n stmts[lastIdx] = `return (${stmts[lastIdx]});`;\n }\n const userExpression = stmts.join(\"\\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 // Action names\n const an = Object.keys(this.actions).filter((i) =>\n methodsCalled.has(i)\n );\n // Action lines\n const al = an.map((a) => `const ${a} = ctx.actions.${a}.fn;`);\n const fnContent = `${al.join(\"\\n\")}return (()=> {${userExpression}})()`;\n\n // Add ctx to action calls\n let fnWithCtx = fnContent.trim();\n an.forEach((a) => {\n fnWithCtx = fnWithCtx.replaceAll(a + \"(\", a + \"(ctx,\");\n });\n\n try {\n const argumentNames = argNames || [];\n const fn = new Function(\"ctx\", ...argumentNames, fnWithCtx);\n return (...args: any[]) => fn(ctx, ...args);\n } catch (error) {\n throw dsErr(\"GeneratingExpressionFailed\", {\n error,\n fnContent,\n });\n }\n }\n\n private walkDownDOM(\n element: Element | null,\n callback: (el: HTMLorSVGElement) => void,\n ) {\n if (\n !element ||\n !(element instanceof HTMLElement || element instanceof SVGElement)\n ) return null;\n callback(element);\n element = element.firstElementChild;\n while (element) {\n this.walkDownDOM(element, callback);\n element = element.nextElementSibling;\n }\n }\n}\n", "import { Computed } from \"../plugins/official/core/attributes/computed\";\nimport { Signals } from \"../plugins/official/core/attributes/signals\";\nimport { Star } from \"../plugins/official/core/attributes/star\";\nimport { SignalValueMacro } from \"../plugins/official/core/macros/signals\";\nimport { Engine } from \"./engine\";\n\nconst ds = new Engine();\nds.load(\n Star,\n SignalValueMacro,\n Signals,\n Computed,\n);\nexport const Datastar = ds;\n", "import { Datastar } from \"../engine\";\n\nDatastar.load();\n"],
+ "mappings": "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",
+ "names": ["name", "Computed", "key", "signals", "genRX", "rx", "camelize", "str", "word", "index", "jsStrToObject", "raw", "Signals", "ctx", "key", "genRX", "signals", "obj", "jsStrToObject", "Star", "SignalValueMacro", "original", "validJS", "DATASTAR", "VERSION", "FragmentMergeModes", "DefaultFragmentMergeMode", "elUniqId", "el", "hash", "hashUpdate", "n", "hashUpdateFromStr", "str", "c", "i", "e", "DATASTAR", "url", "dsErr", "code", "args", "e", "fullURL", "url", "BRAND_SYMBOL", "RUNNING", "NOTIFIED", "OUTDATED", "DISPOSED", "HAS_ERROR", "TRACKING", "startBatch", "batchDepth", "endBatch", "error", "hasError", "batchedEffect", "effect", "batchIteration", "next", "needsToRecompute", "err", "dsErr", "evalContext", "batchedEffect", "batchDepth", "batchIteration", "globalVersion", "addDependency", "signal", "evalContext", "node", "TRACKING", "Signal", "value", "BRAND_SYMBOL", "prev", "next", "fn", "effect", "prevContext", "dsErr", "startBatch", "endBatch", "needsToRecompute", "target", "node", "prepareSources", "rollbackNode", "cleanupSources", "head", "prev", "Computed", "fn", "Signal", "globalVersion", "OUTDATED", "NOTIFIED", "RUNNING", "TRACKING", "prevContext", "evalContext", "value", "HAS_ERROR", "err", "dsErr", "addDependency", "computed", "cleanupEffect", "effect", "cleanup", "startBatch", "error", "DISPOSED", "disposeEffect", "endBatch", "endEffect", "Effect", "finish", "batchedEffect", "nestedValues", "signal", "onlyPublic", "kv", "key", "value", "Signal", "mergeNested", "target", "values", "onlyIfMissing", "walkNestedSignal", "cb", "nestedSubset", "original", "keys", "subset", "parts", "subOriginal", "subSubset", "i", "part", "last", "SignalsRoot", "dotDelimitedPath", "parts", "subSignals", "i", "part", "last", "signal", "dsErr", "fn", "computed", "value", "current", "Signal", "dotDelimitedPaths", "path", "other", "onlyIfMissing", "mergeNested", "keys", "nestedSubset", "cb", "walkNestedSignal", "onlyPublic", "nestedValues", "shouldIndent", "values", "Engine", "SignalsRoot", "VERSION", "pluginsToLoad", "plugin", "globalInitializer", "wp", "ap", "dsErr", "that", "cb", "effect", "element", "removalSet", "removal", "rootElement", "appliedMacros", "p", "pi", "el", "rawKey", "keyRaw", "key", "rawModifiers", "hasKey", "rawValue", "value", "hasValue", "keyReq", "valReq", "elUniqId", "mods", "m", "label", "args", "camelize", "macros", "macro", "actions", "apply", "cleanup", "ctx", "argNames", "stmts", "s", "lastIdx", "userExpression", "fnCall", "matches", "methodsCalled", "match", "an", "i", "fnContent", "a", "fnWithCtx", "argumentNames", "fn", "error", "callback", "ds", "Engine", "Star", "SignalValueMacro", "Signals", "Computed", "Datastar", "Datastar"]
}
diff --git a/bundles/datastar.js b/bundles/datastar.js
index 2982cbdca..506294a00 100644
--- a/bundles/datastar.js
+++ b/bundles/datastar.js
@@ -1,15 +1,9 @@
-"use strict";(()=>{var Be={pluginType:"attribute",name:"star",onLoad:()=>{alert("YOU ARE PROBABLY OVERCOMPLICATING IT")}};var Ge={pluginType:"attribute",name:"computed",mustNotEmptyKey:!0,onLoad:t=>{let e=t.store();return e[t.key]=t.reactivity.computed(()=>t.expressionFn(t)),()=>{let n=t.store();delete n[t.key]}}};function V(t){let e={};for(let[n,r]of Object.entries(t))n.startsWith("_")||(typeof r=="object"&&!Array.isArray(r)?e[n]=V(r):e[n]=r);return e}function se(t,e,n){let r={};if(!n)Object.assign(r,e);else for(let o in e){let i=t[o]?.value;i==null&&(r[o]=e[o])}return r}var Ke={pluginType:"attribute",name:"store",removeNewLines:!0,preprocessors:{pre:[{pluginType:"preprocessor",name:"store",regexp:/(?.+)/g,replacer:t=>{let{whole:e}=t;return`Object.assign({...ctx.store()}, ${e})`}}]},allowedModifiers:new Set(["ifmissing"]),onLoad:t=>{let e=t.expressionFn(t),n=se(t.store(),e,t.modifiers.has("ifmissing"));t.mergeSignals(n),delete t.el.dataset[t.rawKey]}};var qe="[a-zA-Z_$]+",_n=qe+"[0-9a-zA-Z_$.]*";function ae(t,e,n,r=!0){let o=r?_n:qe;return new RegExp(`(?${t}(?<${e}>${o})${n})`,"g")}var Je={name:"action",pluginType:"preprocessor",regexp:ae("\\$","action","(?\\((?.*)\\))",!1),replacer:({action:t,args:e})=>{let n=["ctx"];e&&n.push(...e.split(",").map(o=>o.trim()));let r=n.join(",");return`ctx.actions.${t}.method(${r})`}};var ze={name:"signal",pluginType:"preprocessor",regexp:ae("\\$","signal","(?\\([^\\)]*\\))?"),replacer:t=>{let{signal:e,method:n}=t,r="ctx.store()";if(!n?.length)return`${r}.${e}.value`;let o=e.split("."),i=o.pop(),s=o.join(".");return`${r}.${s}.value.${i}${n}`}};var R="datastar",xe="datastar-event",Ye="Datastar-Request";var Ze="type module";var M={Morph:"morph",Inner:"inner",Outer:"outer",Prepend:"prepend",Append:"append",Before:"before",After:"after",UpsertAttributes:"upsertAttributes"},Xe=M.Morph,x={MergeFragments:"datastar-merge-fragments",MergeSignals:"datastar-merge-signals",RemoveFragments:"datastar-remove-fragments",RemoveSignals:"datastar-remove-signals",ExecuteScript:"datastar-execute-script"};var B=t=>{let e=new Error;return e.name=`${R}${t}`,e},h=B(400),Z=B(409),$=B(404),C=B(403),le=B(405),Qe=B(503);function et(t){if(t.id)return t.id;let e=0,n=o=>(e=(e<<5)-e+o,e&e),r=o=>o.split("").forEach(i=>n(i.charCodeAt(0)));for(;t.parentNode;){if(t.id){r(`${t.id}`);break}else if(t===t.ownerDocument.documentElement)r(t.tagName);else{for(let o=1,i=t;i.previousElementSibling;i=i.previousElementSibling,o++)n(o);t=t.parentNode}t=t.parentNode}return R+e}function tt(t,e,n=!0){if(!(t instanceof HTMLElement||t instanceof SVGElement))throw $;t.tabIndex||t.setAttribute("tabindex","0"),t.scrollIntoView(e),n&&t.focus()}var wn=Symbol.for("preact-signals"),O=1,G=2,ee=4,q=8,ue=16,K=32;function fe(){Q++}function pe(){if(Q>1){Q--;return}let t,e=!1;for(;X!==void 0;){let n=X;for(X=void 0,Pe++;n!==void 0;){let r=n._nextBatchedEffect;if(n._nextBatchedEffect=void 0,n._flags&=~G,!(n._flags&q)&&ot(n))try{n._callback()}catch(o){e||(t=o,e=!0)}n=r}}if(Pe=0,Q--,e)throw t}function nt(t){if(Q>0)return t();fe();try{return t()}finally{pe()}}var y;var X,Q=0,Pe=0,ce=0;function rt(t){if(y===void 0)return;let e=t._node;if(e===void 0||e._target!==y)return e={_version:0,_source:t,_prevSource:y._sources,_nextSource:void 0,_target:y,_prevTarget:void 0,_nextTarget:void 0,_rollbackNode:e},y._sources!==void 0&&(y._sources._nextSource=e),y._sources=e,t._node=e,y._flags&K&&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=y._sources,e._nextSource=void 0,y._sources._nextSource=e,y._sources=e),e}function w(t){this._value=t,this._version=0,this._node=void 0,this._targets=void 0}w.prototype.brand=wn;w.prototype._refresh=function(){return!0};w.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)};w.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)}};w.prototype.subscribe=function(t){return Le(()=>{let e=this.value,n=y;y=void 0;try{t(e)}finally{y=n}})};w.prototype.valueOf=function(){return this.value};w.prototype.toString=function(){return this.value+""};w.prototype.toJSON=function(){return this.value};w.prototype.peek=function(){let t=y;y=void 0;try{return this.value}finally{y=t}};Object.defineProperty(w.prototype,"value",{get(){let t=rt(this);return t!==void 0&&(t._version=this._version),this._value},set(t){if(t!==this._value){if(Pe>100)throw h;this._value=t,this._version++,ce++,fe();try{for(let e=this._targets;e!==void 0;e=e._nextTarget)e._target._notify()}finally{pe()}}}});function me(t){return new w(t)}function ot(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 st(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 U(t){w.call(this,void 0),this._fn=t,this._sources=void 0,this._globalVersion=ce-1,this._flags=ee}U.prototype=new w;U.prototype._refresh=function(){if(this._flags&=~G,this._flags&O)return!1;if((this._flags&(ee|K))===K||(this._flags&=~ee,this._globalVersion===ce))return!0;if(this._globalVersion=ce,this._flags|=O,this._version>0&&!ot(this))return this._flags&=~O,!0;let t=y;try{it(this),y=this;let e=this._fn();(this._flags&ue||this._value!==e||this._version===0)&&(this._value=e,this._flags&=~ue,this._version++)}catch(e){this._value=e,this._flags|=ue,this._version++}return y=t,st(this),this._flags&=~O,!0};U.prototype._subscribe=function(t){if(this._targets===void 0){this._flags|=ee|K;for(let e=this._sources;e!==void 0;e=e._nextSource)e._source._subscribe(e)}w.prototype._subscribe.call(this,t)};U.prototype._unsubscribe=function(t){if(this._targets!==void 0&&(w.prototype._unsubscribe.call(this,t),this._targets===void 0)){this._flags&=~K;for(let e=this._sources;e!==void 0;e=e._nextSource)e._source._unsubscribe(e)}};U.prototype._notify=function(){if(!(this._flags&G)){this._flags|=ee|G;for(let t=this._targets;t!==void 0;t=t._nextTarget)t._target._notify()}};Object.defineProperty(U.prototype,"value",{get(){if(this._flags&O)throw h;let t=rt(this);if(this._refresh(),t!==void 0&&(t._version=this._version),this._flags&ue)throw this._value;return this._value}});function at(t){return new U(t)}function lt(t){let e=t._cleanup;if(t._cleanup=void 0,typeof e=="function"){fe();let n=y;y=void 0;try{e()}catch(r){throw t._flags&=~O,t._flags|=q,De(t),r}finally{y=n,pe()}}}function De(t){for(let e=t._sources;e!==void 0;e=e._nextSource)e._source._unsubscribe(e);t._fn=void 0,t._sources=void 0,lt(t)}function Rn(t){if(y!==this)throw h;st(this),y=t,this._flags&=~O,this._flags&q&&De(this),pe()}function te(t){this._fn=t,this._cleanup=void 0,this._sources=void 0,this._nextBatchedEffect=void 0,this._flags=K}te.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()}};te.prototype._start=function(){if(this._flags&O)throw h;this._flags|=O,this._flags&=~q,lt(this),it(this),fe();let t=y;return y=this,Rn.bind(this,t)};te.prototype._notify=function(){this._flags&G||(this._flags|=G,this._nextBatchedEffect=X,X=this)};te.prototype._dispose=function(){this._flags|=q,this._flags&O||De(this)};function Le(t){let e=new te(t);try{e._callback()}catch(n){throw e._dispose(),n}return e._dispose.bind(e)}var de=class{get value(){return Me(this)}set value(e){nt(()=>xn(this,e))}peek(){return Me(this,{peek:!0})}},ne=t=>Object.assign(new de,Object.entries(t).reduce((e,[n,r])=>{if(["value","peek"].some(o=>o===n))throw C;return typeof r!="object"||r===null||Array.isArray(r)?e[n]=me(r):e[n]=ne(r),e},{})),xn=(t,e)=>Object.keys(e).forEach(n=>t[n].value=e[n]),Me=(t,{peek:e=!1}={})=>Object.entries(t).reduce((n,[r,o])=>(o instanceof w?n[r]=e?o.peek():o.value:o instanceof de&&(n[r]=Me(o,{peek:e})),n),{});function Ne(t,e){if(typeof e!="object"||Array.isArray(e)||!e)return JSON.parse(JSON.stringify(e));if(typeof e=="object"&&e.toJSON!==void 0&&typeof e.toJSON=="function")return e.toJSON();let n=t;return typeof t!="object"&&(n={...e}),Object.keys(e).forEach(r=>{n.hasOwnProperty(r)||(n[r]=e[r]),e[r]===null?delete n[r]:n[r]=Ne(n[r],e[r])}),n}var ut="0.20.1";var Pn=t=>t.pluginType==="preprocessor",Dn=t=>t.pluginType==="watcher",Ln=t=>t.pluginType==="attribute",Mn=t=>t.pluginType==="action",ge=class{constructor(){this.plugins=[];this.store=ne({});this.preprocessors=new Array;this.actions={};this.watchers=new Array;this.refs={};this.reactivity={signal:me,computed:at,effect:Le};this.removals=new Map;this.mergeRemovals=new Array;this.lastMarshalledStore=""}get version(){return ut}load(...e){let n=new Set(this.plugins);e.forEach(r=>{if(r.requiredPlugins){for(let i of r.requiredPlugins)if(!n.has(i))throw C}let o;if(Pn(r)){if(this.preprocessors.includes(r))throw Z;this.preprocessors.push(r)}else if(Dn(r)){if(this.watchers.includes(r))throw Z;this.watchers.push(r),o=r.onGlobalInit}else if(Mn(r)){if(this.actions[r.name])throw Z;this.actions[r.name]=r}else if(Ln(r)){if(this.plugins.includes(r))throw Z;this.plugins.push(r),o=r.onGlobalInit}else throw $;o&&o({store:()=>this.store,upsertSignal:this.upsertSignal.bind(this),mergeSignals:this.mergeSignals.bind(this),removeSignals:this.removeSignals.bind(this),actions:this.actions,reactivity:this.reactivity,applyPlugins:this.applyPlugins.bind(this),cleanup:this.cleanup.bind(this)}),n.add(r)}),this.applyPlugins(document.body)}cleanup(e){let n=this.removals.get(e);if(n){for(let r of n.set)r();this.removals.delete(e)}}mergeSignals(e){this.mergeRemovals.forEach(o=>o()),this.mergeRemovals=this.mergeRemovals.slice(0);let n=Ne(this.store.value,e);this.store=ne(n),JSON.stringify(this.store.value),this.lastMarshalledStore}removeSignals(...e){let n={...this.store.value},r=!1;for(let o of e){let i=o.split("."),s=i[0],a=n;for(let u=1;u{this.walkDownDOM(e,i=>{o||this.cleanup(i);for(let s in i.dataset){let a=`${i.dataset[s]}`||"",u=a;if(!s.startsWith(r.name))continue;if(i.id.length||(i.id=et(i)),n.clear(),r.allowedTagRegexps){let d=i.tagName.toLowerCase();if(![...r.allowedTagRegexps].some(g=>d.match(g)))throw C}let m=s.slice(r.name.length),[l,...c]=m.split(".");if(r.mustHaveEmptyKey&&l.length>0)throw h;if(r.mustNotEmptyKey&&l.length===0)throw h;l.length&&(l=l[0].toLowerCase()+l.slice(1));let f=c.map(d=>{let[p,...g]=d.split("_");return{label:p,args:g}});if(r.allowedModifiers){for(let d of f)if(!r.allowedModifiers.has(d.label))throw C}let S=new Map;for(let d of f)S.set(d.label,d.args);if(r.mustHaveEmptyExpression&&u.length)throw h;if(r.mustNotEmptyExpression&&!u.length)throw h;let A=/;|\n/;r.removeNewLines&&(u=u.split(`
-`).map(d=>d.trim()).join(" "));let v=[...r.preprocessors?.pre||[],...this.preprocessors,...r.preprocessors?.post||[]];for(let d of v){if(n.has(d))continue;n.add(d);let p=u.split(A),g=[];p.forEach(T=>{let _=T,D=[..._.matchAll(d.regexp)];if(D.length)for(let N of D){if(!N.groups)continue;let{groups:L}=N,{whole:P}=L;_=_.replace(P,d.replacer(L))}g.push(_)}),u=g.join("; ")}let E={store:()=>this.store,mergeSignals:this.mergeSignals.bind(this),upsertSignal:this.upsertSignal.bind(this),removeSignals:this.removeSignals.bind(this),applyPlugins:this.applyPlugins.bind(this),cleanup:this.cleanup.bind(this),walkSignals:this.walkSignals.bind(this),actions:this.actions,reactivity:this.reactivity,el:i,rawKey:s,key:l,rawExpression:a,expression:u,expressionFn:()=>{throw le},modifiers:S};if(!r.bypassExpressionFunctionCreation?.(E)&&!r.mustHaveEmptyExpression&&u.length){let d=u.split(A).map(T=>T.trim()).filter(T=>T.length);d[d.length-1]=`return ${d[d.length-1]}`;let p=d.map(T=>` ${T}`).join(`;
-`),g=`try{${p}}catch(e){console.error(\`Error evaluating Datastar expression:
-${p.replaceAll("`","\\`")}
-
-Error: \${e.message}
-
-Check if the expression is valid before raising an issue.\`.trim());debugger}`;try{let T=r.argumentNames||[],_=new Function("ctx",...T,g);E.expressionFn=_}catch(T){let _=new Error(`${T}
-with
-${g}`);console.error(_);debugger}}let b=r.onLoad(E);b&&(this.removals.has(i)||this.removals.set(i,{id:i.id,set:new Set}),this.removals.get(i).set.add(b))}})})}walkSignalsStore(e,n){let r=Object.keys(e);for(let o=0;o0;if(a){n(i,s);continue}u&&this.walkSignalsStore(s,n)}}walkSignals(e){this.walkSignalsStore(this.store,e)}walkDownDOM(e,n,r=0){if(!e||!(e instanceof HTMLElement||e instanceof SVGElement))return null;for(n(e),r=0,e=e.firstElementChild;e;)this.walkDownDOM(e,n,r++),e=e.nextElementSibling}};var ct=new ge;ct.load(Je,ze,Ke,Ge,Be);var ft=ct;async function mt(t,e){let n=t.getReader(),r;for(;!(r=await n.read()).done;)e(r.value)}function dt(t){let e,n,r,o=!1;return function(s){e===void 0?(e=s,n=0,r=-1):e=Nn(e,s);let a=e.length,u=0;for(;n0){let u=o.decode(s.subarray(0,a)),m=a+(s[a+1]===32?2:1),l=o.decode(s.subarray(m));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 c=parseInt(l,10);isNaN(c)||e(r.retry=c);break}}}}function Nn(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 St="text/event-stream",On=1e3,ht="last-event-id";function Oe(t,{signal:e,headers:n,onopen:r,onmessage:o,onclose:i,onerror:s,openWhenHidden:a,fetch:u,retryScaler:m=2,retryMaxWaitMs:l=3e4,retryMaxCount:c=10,...f}){return new Promise((S,A)=>{let v=0,E={...n};E.accept||(E.accept=St);let b;function d(){b.abort(),document.hidden||N()}a||document.addEventListener("visibilitychange",d);let p=On,g=0;function T(){document.removeEventListener("visibilitychange",d),window.clearTimeout(g),b.abort()}e?.addEventListener("abort",()=>{T(),S()});let _=u??window.fetch,D=r??function(){};async function N(){b=new AbortController;try{let L=await _(t,{...f,headers:E,signal:b.signal});await D(L),await mt(L.body,dt(gt(P=>{P?E[ht]=P:delete E[ht]},P=>{p=P},o))),i?.(),T(),S()}catch(L){if(!b.signal.aborted)try{let P=s?.(L)??p;window.clearTimeout(g),g=window.setTimeout(N,P),p*=m,p=Math.min(p,l),v++,v>=c?(T(),A(Qe)):console.error(`Datastar failed to reach ${f.method}:${t.toString()} retry in ${P}ms`)}catch(P){T(),A(P)}}}N()})}var J=`${R}-sse`,ke=`${R}-settling`,W=`${R}-swapping`,he="started",Se="finished";function k(t,e){document.addEventListener(J,n=>{if(n.detail.type!=t)return;let{argsRaw:r}=n.detail;e(r)})}var Et=t=>`${t}`.includes("text/event-stream");function Ie(t,e){document.dispatchEvent(new CustomEvent(J,{detail:{type:t,argsRaw:e}}))}function I(t){return async(e,n,r)=>{if(!n?.length)throw h;let o=r?.onlyRemoteSignals??!0,i=Object.assign({"Content-Type":"application/json",[Ye]:!0},r?.headers),s=e.store().value,a=Object.assign({},s);o&&(a=V(a));let u=JSON.stringify(a),{el:{id:m}}=e;Ie(he,{elID:m});let l=new URL(n,window.location.origin);t=t.toUpperCase();let c={method:t,headers:i,onmessage:f=>{if(!f.event.startsWith(R))return;let S=f.event,A={},v=f.data.split(`
-`);for(let b of v){let d=b.indexOf(" "),p=b.slice(0,d),g=A[p];g||(g=[],A[p]=g);let T=b.slice(d+1).trim();g.push(T)}let E={};for(let[b,d]of Object.entries(A))E[b]=d.join(`
-`);Ie(S,E)},onerror:f=>{if(Et(f))throw f;f&&console.error(f.message)},onclose:()=>{Ie(Se,{elID:m})}};if(t==="GET"){let f=new URLSearchParams(l.search);f.append(R,u),l.search=f.toString()}else c.body=u;try{let f=l.toString();await Oe(f,c)}catch(f){if(!Et(f))throw f}}}var bt={pluginType:"action",name:"delete",method:I("delete")};var yt={pluginType:"action",name:"get",method:I("get")};var vt={pluginType:"action",name:"patch",method:I("patch")};var Tt={pluginType:"action",name:"post",method:I("post")};var At={pluginType:"action",name:"put",method:I("put")};var _t={pluginType:"action",name:"clipboard",method:(t,e)=>{if(!navigator.clipboard)throw C;navigator.clipboard.writeText(e)}};var wt={pluginType:"action",name:"setAll",method:(t,e,n)=>{let r=new RegExp(e);t.walkSignals((o,i)=>r.test(o)&&(i.value=n))}};var Rt={pluginType:"action",name:"toggleAll",method:(t,e)=>{let n=new RegExp(e);t.walkSignals((r,o)=>n.test(r)&&(o.value=!o.value))}};var xt={pluginType:"action",name:"clampFit",method:(t,e,n,r,o,i)=>Math.max(o,Math.min(i,(e-n)/(r-n)*(i-o)+o))};var Pt={pluginType:"action",name:"clampFitInt",method:(t,e,n,r,o,i)=>Math.round(Math.max(o,Math.min(i,(e-n)/(r-n)*(i-o)+o)))};var Dt={pluginType:"action",name:"fit",method:(t,e,n,r,o,i)=>(e-n)/(r-n)*(i-o)+o};var Lt={pluginType:"action",name:"fitInt",method:(t,e,n,r,o,i)=>Math.round((e-n)/(r-n)*(i-o)+o)};var kn=`${R}-indicator`,_o=`${kn}-loading`,Mt={pluginType:"attribute",name:"indicator",mustHaveEmptyKey:!0,onLoad:t=>{let{expression:e,upsertSignal:n,el:r}=t,i=n(e,!1),s=a=>{let{type:u,argsRaw:{elID:m}}=a.detail;if(m===r.id)switch(u){case he:i.value=!0;break;case Se:i.value=!1;break}};return document.addEventListener(J,s),()=>{document.removeEventListener(J,s)}}};var Ee=t=>t.replace(/[A-Z]+(?![a-z])|[A-Z]/g,(e,n)=>(n?"-":"")+e.toLowerCase()),F=t=>t.trim()==="true";var Nt={pluginType:"attribute",name:"bind",mustNotEmptyKey:!0,mustNotEmptyExpression:!0,onLoad:t=>t.reactivity.effect(async()=>{let e=Ee(t.key),n=t.expressionFn(t),r;typeof n=="string"?r=n:r=JSON.stringify(n),!r||r==="false"||r==="null"||r==="undefined"?t.el.removeAttribute(e):t.el.setAttribute(e,r)})};var Ot={pluginType:"attribute",name:"class",mustHaveEmptyKey:!0,mustNotEmptyExpression:!0,onLoad:t=>t.reactivity.effect(()=>{let e=t.expressionFn(t);for(let[n,r]of Object.entries(e)){let o=n.split(" ");r?t.el.classList.add(...o):t.el.classList.remove(...o)}})};var In=/^data:(?[^;]+);base64,(?.*)$/,be=["change","input","keydown"],kt={pluginType:"attribute",name:"model",mustHaveEmptyKey:!0,onLoad:t=>{let{el:e,expression:n,upsertSignal:r}=t,o=n;if(typeof o!="string")throw h;let i=e.tagName.toLowerCase(),s="",a=i.includes("input"),u=e.getAttribute("type"),m=i.includes("checkbox")||a&&u==="checkbox";m&&(s=!1);let l=i.includes("select"),c=i.includes("radio")||a&&u==="radio",f=a&&u==="file";c&&(e.getAttribute("name")?.length||e.setAttribute("name",o));let S=r(o,s),A=()=>{let p="value"in e,g=S.value,T=`${g}`;if(m||c){let _=e;m?_.checked=g:c&&(_.checked=T===_.value)}else if(!f)if(l){let _=e;_.multiple?Array.from(_.options).forEach(D=>{D?.disabled||(D.selected=g.includes(D.value))}):_.value=T}else p?e.value=T:e.setAttribute("value",T)},v=t.reactivity.effect(A),E=async()=>{if(f){let T=[...e?.files||[]],_=[],D=[],N=[];await Promise.all(T.map(je=>new Promise(An=>{let Y=new FileReader;Y.onload=()=>{if(typeof Y.result!="string")throw h;let Re=Y.result.match(In);if(!Re?.groups)throw h;_.push(Re.groups.contents),D.push(Re.groups.mime),N.push(je.name)},Y.onloadend=()=>An(void 0),Y.readAsDataURL(je)}))),S.value=_;let L=t.store(),P=`${o}Mimes`,We=`${o}Names`;P in L&&(L[`${P}`].value=D),We in L&&(L[`${We}`].value=N);return}let p=S.value,g=e||e;if(typeof p=="number")S.value=Number(g.value||g.getAttribute("value"));else if(typeof p=="string")S.value=g.value||g.getAttribute("value")||"";else if(typeof p=="boolean")m?S.value=g.checked||g.getAttribute("checked")==="true":S.value=!!(g.value||g.getAttribute("value"));else if(!(typeof p>"u"))if(typeof p=="bigint")S.value=BigInt(g.value||g.getAttribute("value")||"0");else if(Array.isArray(p)){if(l){let D=[...e.selectedOptions].map(N=>N.value);S.value=D}else S.value=JSON.parse(g.value).split(",");console.log(g.value)}else throw le},b=e.tagName.split("-");if(b.length>1){let p=b[0].toLowerCase();be.forEach(g=>{be.push(`${p}-${g}`)})}return be.forEach(p=>e.addEventListener(p,E)),()=>{v(),be.forEach(p=>e.removeEventListener(p,E))}}};function Ce(t){if(!t||t?.length===0)return 0;for(let e of t){if(e.endsWith("ms"))return Number(e.replace("ms",""));if(e.endsWith("s"))return Number(e.replace("s",""))*1e3;try{return parseFloat(e)}catch{}}return 0}function re(t,e,n=!1){return t?t.includes(e)||n:!1}function It(t,e,n=!1,r=!0){let o=-1,i=()=>o&&clearTimeout(o);return function(...a){i(),n&&!o&&t(...a),o=setTimeout(()=>{r&&t(...a),i()},e)}}function Ct(t,e,n=!0,r=!1){let o=!1;return function(...s){o||(n&&t(...s),o=!0,setTimeout(()=>{o=!1,r&&t(...s)},e))}}var Cn=new Set(["window","once","passive","capture","debounce","throttle","remote","outside"]),Ft="",Ht={pluginType:"attribute",name:"on",mustNotEmptyKey:!0,mustNotEmptyExpression:!0,argumentNames:["evt"],onLoad:t=>{let{el:e,key:n,expressionFn:r}=t,o=t.el;t.modifiers.get("window")&&(o=window);let i=c=>{r(t,c)},s=t.modifiers.get("debounce");if(s){let c=Ce(s),f=re(s,"leading",!1),S=re(s,"noTrail",!0);i=It(i,c,f,S)}let a=t.modifiers.get("throttle");if(a){let c=Ce(a),f=re(a,"noLead",!0),S=re(a,"noTrail",!1);i=Ct(i,c,f,S)}let u={capture:!0,passive:!1,once:!1};t.modifiers.has("capture")||(u.capture=!1),t.modifiers.has("passive")&&(u.passive=!0),t.modifiers.has("once")&&(u.once=!0),[...t.modifiers.keys()].filter(c=>!Cn.has(c)).forEach(c=>{let f=t.modifiers.get(c)||[],S=i;i=()=>{let v=event,E=v[c],b;if(typeof E=="function")b=E(...f);else if(typeof E=="boolean")b=E;else if(typeof E=="string"){let d=E.toLowerCase().trim(),p=f.join("").toLowerCase().trim();b=d===p}else throw h;b&&S(v)}});let l=Ee(n).toLowerCase();switch(l){case"load":return i(),delete t.el.dataset.onLoad,()=>{};case"raf":let c,f=()=>{i(),c=requestAnimationFrame(f)};return c=requestAnimationFrame(f),()=>{c&&cancelAnimationFrame(c)};case"store-change":return t.reactivity.effect(()=>{let v=t.store().value;t.modifiers.has("remote")&&(v=V(v));let E=JSON.stringify(v);Ft!==E&&(Ft=E,i())});default:if(t.modifiers.has("outside")){o=document;let A=i,v=!1;i=b=>{let d=b?.target;if(!d)return;let p=e.id===d.id;p&&v&&(v=!1),!p&&!v&&(A(b),v=!0)}}return o.addEventListener(l,i,u),()=>{o.removeEventListener(l,i)}}}};var Vt={pluginType:"attribute",name:"ref",mustHaveEmptyKey:!0,mustNotEmptyExpression:!0,bypassExpressionFunctionCreation:()=>!0,onLoad:t=>{let e=t.expression;return t.upsertSignal(e,t.el),()=>{t.removeSignals(e)}}};var $t={pluginType:"attribute",name:"text",mustHaveEmptyKey:!0,onLoad:t=>{let{el:e,expressionFn:n}=t;if(!(e instanceof HTMLElement))throw h;return t.reactivity.effect(()=>{let r=n(t);e.textContent=`${r}`})}};var Ut={pluginType:"attribute",name:"persist",allowedModifiers:new Set(["local","session","remote"]),onLoad:t=>{let e=t.key||R,n=t.expression,r=new Set;if(n.trim()!==""){let l=t.expressionFn(t).split(" ");for(let c of l)r.add(c)}let o="",i=t.modifiers.has("session")?"session":"local",s=t.modifiers.has("remote"),a=m=>{let l=t.store();if(s&&(l=V(l)),r.size>0){let f={};for(let S of r){let A=S.split("."),v=f,E=l;for(let d=0;d{window.removeEventListener(xe,a)}}};var Wt={pluginType:"attribute",name:"replaceUrl",mustHaveEmptyKey:!0,mustNotEmptyExpression:!0,onLoad:t=>t.reactivity.effect(()=>{let e=t.expressionFn(t),n=window.location.href,r=new URL(e,n).toString();window.history.replaceState({},"",r)})};var jt="once",Bt="half",Gt="full",Kt={pluginType:"attribute",name:"intersects",allowedModifiers:new Set([jt,Bt,Gt]),mustHaveEmptyKey:!0,onLoad:t=>{let{modifiers:e}=t,n={threshold:0};e.has(Gt)?n.threshold=1:e.has(Bt)&&(n.threshold=.5);let r=new IntersectionObserver(o=>{o.forEach(i=>{i.isIntersecting&&(t.expressionFn(t),e.has(jt)&&(r.disconnect(),delete t.el.dataset[t.rawKey]))})},n);return r.observe(t.el),()=>r.disconnect()}};var ye="smooth",Fe="instant",He="auto",qt="hstart",Jt="hcenter",zt="hend",Yt="hnearest",Zt="vstart",Xt="vcenter",Qt="vend",en="vnearest",Fn="focus",ve="center",tn="start",nn="end",rn="nearest",on={pluginType:"attribute",name:"scrollIntoView",mustHaveEmptyKey:!0,mustHaveEmptyExpression:!0,allowedModifiers:new Set([ye,Fe,He,qt,Jt,zt,Yt,Zt,Xt,Qt,en,Fn]),onLoad:({el:t,modifiers:e,rawKey:n})=>{t.tabIndex||t.setAttribute("tabindex","0");let r={behavior:ye,block:ve,inline:ve};return e.has(ye)&&(r.behavior=ye),e.has(Fe)&&(r.behavior=Fe),e.has(He)&&(r.behavior=He),e.has(qt)&&(r.inline=tn),e.has(Jt)&&(r.inline=ve),e.has(zt)&&(r.inline=nn),e.has(Yt)&&(r.inline=rn),e.has(Zt)&&(r.block=tn),e.has(Xt)&&(r.block=ve),e.has(Qt)&&(r.block=nn),e.has(en)&&(r.block=rn),tt(t,r,e.has("focus")),delete t.dataset[n],()=>{}}};var sn={pluginType:"attribute",name:"show",mustHaveEmptyKey:!0,mustNotEmptyExpression:!0,onLoad:t=>t.reactivity.effect(async()=>{t.expressionFn(t)?t.el.style.display==="none"&&t.el.style.removeProperty("display"):t.el.style.setProperty("display","none")})};var oe=document,z=!!oe.startViewTransition;var Ve="view-transition",an={pluginType:"attribute",name:Ve,onGlobalInit(){let t=!1;if(document.head.childNodes.forEach(e=>{e instanceof HTMLMetaElement&&e.name===Ve&&(t=!0)}),!t){let e=document.createElement("meta");e.name=Ve,e.content="same-origin",document.head.appendChild(e)}},onLoad:t=>{if(!z){console.error("Browser does not support view transitions");return}return t.reactivity.effect(()=>{let{el:e,expressionFn:n}=t,r=n(t);if(!r)return;let o=e.style;o.viewTransitionName=r})}};var ln={pluginType:"watcher",name:x.ExecuteScript,onGlobalInit:async()=>{k(x.ExecuteScript,({autoRemove:t=`${!0}`,attributes:e=Ze,script:n})=>{let r=F(t);if(!n?.length)throw h;let o=document.createElement("script");e.split(`
-`).forEach(i=>{let s=i.indexOf(" "),a=s?i.slice(0,s):i,u=s?i.slice(s):"";o.setAttribute(a.trim(),u.trim())}),o.text=n,document.head.appendChild(o),r&&o.remove()})}};var Ae=new WeakSet;function pn(t,e,n={}){t instanceof Document&&(t=t.documentElement);let r;typeof e=="string"?r=jn(e):r=e;let o=Bn(r),i=$n(t,o,n);return mn(t,o,i)}function mn(t,e,n){if(n.head.block){let r=t.querySelector("head"),o=e.querySelector("head");if(r&&o){let i=gn(o,r,n);Promise.all(i).then(()=>{mn(t,e,Object.assign(n,{head:{block:!1,ignore:!0}}))});return}}if(n.morphStyle==="innerHTML")return dn(e,t,n),t.children;if(n.morphStyle==="outerHTML"||n.morphStyle==null){let r=Kn(e,t,n);if(!r)throw $;let o=r?.previousSibling,i=r?.nextSibling,s=_e(t,r,n);return r?Gn(o,s,i):[]}else throw h}function _e(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(we(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!==M.Morph?gn(e,t,n):(Vn(e,t),dn(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 h;return t.parentElement.replaceChild(e,t),n.callbacks.afterNodeAdded(e),n.callbacks.afterNodeRemoved(t),e}}function dn(t,e,n){let r=t.firstChild,o=e.firstChild,i;for(;r;){if(i=r,r=i.nextSibling,o==null){if(n.callbacks.beforeNodeAdded(i)===!1)return;e.appendChild(i),n.callbacks.afterNodeAdded(i),j(n,i);continue}if(hn(i,o,n)){_e(o,i,n),o=o.nextSibling,j(n,i);continue}let s=Un(t,e,i,o,n);if(s){o=un(o,s,n),_e(s,i,n),j(n,i);continue}let a=Wn(t,i,o,n);if(a){o=un(o,a,n),_e(a,i,n),j(n,i);continue}if(n.callbacks.beforeNodeAdded(i)===!1)return;e.insertBefore(i,o),n.callbacks.afterNodeAdded(i),j(n,i)}for(;o!==null;){let s=o;o=o.nextSibling,Sn(s,n)}}function Vn(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||"",Te(t,e,"value"),Te(t,e,"checked"),Te(t,e,"disabled");else if(t instanceof HTMLOptionElement)Te(t,e,"selected");else if(t instanceof HTMLTextAreaElement&&e instanceof HTMLTextAreaElement){let r=t.value,o=e.value;r!==o&&(e.value=r),e.firstChild&&e.firstChild.nodeValue!==r&&(e.firstChild.nodeValue=r)}}function Te(t,e,n){let r=t.getAttribute(n),o=e.getAttribute(n);r!==o&&(r?e.setAttribute(n,r):e.removeAttribute(n))}function gn(t,e,n){let r=[],o=[],i=[],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 c=u.has(l.outerHTML),f=n.head.shouldReAppend(l),S=n.head.shouldPreserve(l);c||S?f?o.push(l):(u.delete(l.outerHTML),i.push(l)):a===M.Append?f&&(o.push(l),s.push(l)):n.head.shouldRemove(l)!==!1&&o.push(l)}s.push(...u.values());let m=[];for(let l of s){let c=document.createRange().createContextualFragment(l.outerHTML).firstChild;if(!c)throw h;if(n.callbacks.beforeNodeAdded(c)){if(c.hasAttribute("href")||c.hasAttribute("src")){let f,S=new Promise(A=>{f=A});c.addEventListener("load",function(){f(void 0)}),m.push(S)}e.appendChild(c),n.callbacks.afterNodeAdded(c),r.push(c)}}for(let l of o)n.callbacks.beforeNodeRemoved(l)!==!1&&(e.removeChild(l),n.callbacks.afterNodeRemoved(l));return n.head.afterHeadMorphed(e,{added:r,kept:i,removed:o}),m}function H(){}function $n(t,e,n){return{target:t,newContent:e,config:n,morphStyle:n.morphStyle,ignoreActive:n.ignoreActive,idMap:Yn(t,e),deadIds:new Set,callbacks:Object.assign({beforeNodeAdded:H,afterNodeAdded:H,beforeNodeMorphed:H,afterNodeMorphed:H,beforeNodeRemoved:H,afterNodeRemoved:H},n.callbacks),head:Object.assign({style:"merge",shouldPreserve:r=>r.getAttribute("im-preserve")==="true",shouldReAppend:r=>r.getAttribute("im-re-append")==="true",shouldRemove:H,afterHeadMorphed:H},n.head)}}function hn(t,e,n){return!t||!e?!1:t.nodeType===e.nodeType&&t.tagName===e.tagName?t?.id?.length&&t.id===e.id?!0:ie(n,t,e)>0:!1}function we(t,e){return!t||!e?!1:t.nodeType===e.nodeType&&t.tagName===e.tagName}function un(t,e,n){for(;t!==e;){let r=t;if(t=t?.nextSibling,!r)throw h;Sn(r,n)}return j(n,e),e.nextSibling}function Un(t,e,n,r,o){let i=ie(o,n,e),s=null;if(i>0){s=r;let a=0;for(;s!=null;){if(hn(n,s,o))return s;if(a+=ie(o,s,t),a>i)return null;s=s.nextSibling}}return s}function Wn(t,e,n,r){let o=n,i=e.nextSibling,s=0;for(;o&&i;){if(ie(r,o,t)>0)return null;if(we(e,o))return o;if(we(i,o)&&(s++,i=i.nextSibling,s>=2))return null;o=o.nextSibling}return o}var cn=new DOMParser;function jn(t){let e=t.replace(/